MyBatis映射文件Mapper.xml详解

映射文件是 MyBatis 框架中十分重要的文件 可以说, MyBatis 框架的强大之处就体现在映射文件的编写上。在映射文件中,元素是映射文件的根元素,其他元素都是它的子元素。
MyBatis映射文件Mapper.xml详解_第1张图片
Select元素
元素的属性大部分相同,但还包含了3个特有属性,这3个属性的描述如下表所示:

属性 说明
keyProperty (仅对insert和update有用)此属性的作用是将插入或更新操作时的返回值赋值给PO类的某个属性,通常会设置为主键对应的属性。如果需要设置联合主键,可以在多个值之间用逗号隔开
keyColumn (仅对insert和update有用)此属性用于设置第几列是主键,当主键列不是表中的第一列时需要设置。在需要主键联合时,值可以用逗号隔开
useGeneratedKeys (仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部生产的主键,如MySQL和SQL Server等自动递增的字段,其默认值为false

执行插入操作后,很多时候我们会需要返回插入成功的数据生成的主键值,此时就可以通过上面讲的3个属性来实现。如果使用的数据库支持主键自动增长(如MySQL ),那么可以通过keyProperty属性指定PO类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true,其使用示例如下。

<insert id="addCustomer" parameterType="com.lzq.po.Customer"
	keyProperty="id" useGeneratedKeys="true">
insert into t_customer (username, jobs, phone) values (#(username),#(jobs},#{phone})
</insert>

Updata 和 Delete元素
元素的使用比较简单,它们的属性配置也基本相同。如下代码所示:

<update id="updateCustomer" parameterType="com.lzq.po.Customer">
       update t_customer 
       set username=#{username},jobs=#{jobs},phone=#{phone}
       where id=#{id}
</update>

<delete id="deleteCustomer" parameterType="Integer">
        delete from t_customer where id=#{id}
</delete>

在配置update和delete元素的配置基本和insert元素差不了多少,在使用这俩个元素时,也会返回一个表示有多少航受到影响的参数,

Sql元素
在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username、jobs字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量,导致映射文件过于臃肿。那么有没有什么办法将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用呢?这个时候就需要使用到sql元素了。
元素的作用就是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段。

比如:定义一个包含id、username、jobs和phone字段的代码片段如下:给sql加上一个ID

<sql id="customerColumns">id,username,jobs,phone</sql>

上述代码片段可以包含在其他语句中直接使用,使用方法如下:在select查询语句当中使用include的refid属性进行引入sql

<select id="findCustomerById" parameterType="Integer"resultType="com.lzq.po.Customer">
    select <include refid="customerColumns"/> 
    from t_customer 
    where id = #{id}
</select>

当然除了这种简单的sql进行引入还有比较复杂的引入:如下图所示:(相同效果)
MyBatis映射文件Mapper.xml详解_第2张图片
代码如下所示:分别是对查询语句进行了分割成一个很小的小块,方便后续的查询可以直接调用sql元素。

	<sql id="tablename">${prefix} customer</sql>
	<sql id="someinclude">from<include refid="${include_target}" /></sql>
	<sql id="customerColumns">id,username,jobs,phone</sql>
	<select id="findCustomerById" parameterType="Integer" 
			resultType="com.lzq.po.Customer">
		select
		<include refid="customerColumns" />
		<include refid="someinclude">
			<property name="prefix" value="t_" />
			<property name="include_target" value="tablename" />
		</include>
		where id = #{id}
	</select>

resultMap 元素
元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它的主要作用是定义映射规则、级联的更新以及定义类型转化器等。
元素中包含了一些子元素,它的元素结构如下代码段所示:

<resultMap type="" id="">
       <constructor>    	<!-- 类在实例化时,用来注入结果到构造方法中-->
             <idArg/>     	<!-- ID参数;标记结果作为ID-->
             <arg/>         <!-- 注入到构造方法的一个普通结果-->
       </constructor>  
       <id/>                <!-- 用于表示哪个列是主键-->
       <result/>           	<!-- 注入到字段或JavaBean属性的普通结果-->
       <association property="" />        	<!-- 用于一对一关联 -->
       <collection property="" />          	<!-- 用于一对多关联 -->
       <discriminator javaType="">      	<!-- 使用结果值来决定使用哪个结果映射-->
            <case value="" />               <!-- 基于某些值的结果映射 -->
       </discriminator>	
</resultMap>

元素的type属性表示需要映射的POJO,id属性是这个resultMap的唯一标识。它的子元素用于配置构造方法(当一个POJO中未定义无参的构造方法时,就可以使用元素进行配置)。子元素用于表示哪个列是主键,而 用于表示POJO和数据表中普通列的映射关系。用于处理多表时的关联关系,而元素主要用于处理一个单独的数据库查询返回很多不同数据类型结果集的情况。

在默认情况下,MyBatis程序在运行时会自动地将查询到的数据与需要返回的对象的属性进行匹配赋值(需要表中的列名与对象的属性名称完全一致 )。然而实际开发时,数据表中的列和需要返回的对象的属性可能不会完全一致, 这种情况下MyBatis是不会自动赋值的。此时,就可以使用元素进行处理。

resultMap元素的使用
首先创建一个表t_user:并且插入几条数据用于测试:代码如下

CREATE TABLE t_user( 
t_id INT PRIMARY KEY AUTO_INCREMENT, 
t_name VARCHAR(50),
t_age INT
)
INSERT INTO t_user(t_name,t_age) VALUES('tom' , 25);
INSERT INTO t_user(t_name , t_age) VALUES('Lili' , 20); 
INSERT INTO t_user(t_name , t_age) VALUES('Jim' , 20);

随后在 com.lzq.po 包中,创建持久化类 User ,并在类中定义 id name age 属性,以及其 getter/setter 方法和 toString()方法,代码如下所示:(省略getset方法)

package com.lzq.po;
public class User {
	private Integer id;
	private String name;
	private Integer age;
	@Override
	public String toString() {
		return "User[id=" + id + ", name=" + name + ", age=" + age + ")]";
	}
}

创建映射文件UserMapper.xml文件代码如下所示:
的子元素的property属性表示User类的属名,column属性表示数据表t _user 的列名。