MyBatis学习笔记——MyBatis的映射文件

12 篇文章 0 订阅

MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。

输入映射Parameter

指定输入参数的java类型,可以使用别名或者类的全限定名。它可以接收简单类型,POJO对象、HashMap。

  • 传入简单类型

    <select id="findUserById" parameterType="int" resultType="com.hf.model.User">
            SELECT * FROM user where id =  #{id}
    </select>
    

    上面的这个示例说明了一个非常简单的命名参数映射。参数类型被设置为 int,这样这个参数就可以被设置成任何内容。原始类型或简单数据类型(比如 Integer 和 String)因为没有相关属性,它会完全用参数值来替代。

  • 传入pojo对象

    <insert id="insertUser" parameterType="User">
      insert into users (id, username, sex)
      values (#{id}, #{username}, #{sex})
    </insert>
    

    如果 User 类型的参数对象传递到了语句中,id、username 和 sex属性将会被查找,然后将它们的值传入预处理语句的参数中。

  • 传入map对象

    <select id="findUserByMap" parameterType="hashmap" resultType="com.hf.model.User">
            SELECT u.* FROM user u WHERE username LIKE '%${name}%' AND sex = #{sex}
    </select>
    

    如果 Map类型的参数对象传递到了语句中,会从map中找到name对应的值和sex对应的值,然后将它们的值传入预处理语句的参数中。

输出映射 resultType/resultMap

  • resultType

    <select id="findUserById" resultType="map">
      select id, username, sex
      from user
      where id = #{id}
    </select>
    

    上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为领域模型。MyBatis 对两者都提供了支持。看看下面这个 JavaBean:

    package com.hf.model;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
    	private int id;
    	private String username;// 用户姓名
    	private String sex;// 性别
    
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    }
    
    

    基于 JavaBean 的规范,上面这个类的属性属性:id,username 和 sex。这些属性会对应到 select 语句中的列名。

    <select id="findUserById" resultType="user">
      select id, username, sex
      from user
      where id = #{id}
    </select>
    

    起别名会简化你的代码,使用它们,你就可以不用输入类的完全限定名称了。

    <!--配置别名-->
        <typeAliases>
            <!--该包下所有类的别名就是该类的名称变为首字母小写-->
            <package name="com.hf.model"/>
        </typeAliases>
    
    <!-- SQL 映射 XML 中 -->
    <select id="selectUsers" resultType="user">
     select id, username, sex
      from user
      where id = #{id}
    </select>
    

    这些情况下,MyBatis 会在幕后自动创建一个 ResultMap,再基于属性名来映射列到 JavaBean 的属性上。

  • 解决数据库列名和模型属性不匹配的问题

    如果列名和属性名没有精确匹配,可以在 SELECT 语句中对列使用别名(这是一个基本的 SQL 特性)来匹配标签。比如:

    <select id="selectUsers" resultType="User">
      select
        user_id             as "id",
        user_name           as "username",
        user_sex 			as "sex"
      from some_table
      where id = #{id}
    </select>
    

    使用外部的 resultMap是解决列名不匹配的另外一种方式。

     <resultMap id="userResultMap" type="User">
        	  <id property="id" column="user_id" />
        	  <result property="username" column="user_name"/>
        	  <result property="sex" column="user_sex"/>
    </resultMap>
    

    而在引用它的语句中使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

    <select id="selectUsers" resultMap="userResultMap">
    	  select user_id, user_name, user_sex
    	  from user
    	  where id = #{id}
    </select>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值