1、映射文件的结构
映射文件包含了各类SQL语句、参数、结果集、映射规则等信息。
Mybatis的映射文件有很少的几个顶级元素(按照它们应该被定义的顺序)∶
- cache:给定命名空间的缓存配置。
- cache-ref:其他命名空间缓存配置的引用。
- resultMap:最复杂也最强大的元素,用来描述如果从数据库结果集中加载对象。
- sql:可被其他语句引用的可重用语句块
- insert:映射插入语句
- update:映射更新语句
- delete:映射删除语句
- select:映射查询语句
2、<select>元素
<select>是MyBatis中最常用的元素之一,主要用于映射查询语句,它包含了SQL语句、参数类型、返回值类型等信息。
简单查询的<select>元素是非常简单的,比如:
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
<select>元素映射一个查询语句,id属性用于指定该映射关系在当前命名空间的唯一标识符,parameterType用于指定传入参数的完全限定类名或别名,resultType用于指定返回结果的完全限定类名或别名,SQL语句中#{id}表示通过占位符的形式接收参数id。
select语句由很多属性允许配置来决定每条语句的作用细节,以下为最常用的属性:
- id:在命名空间中唯一的标识符,可用于与Mapper接口中的方法做映射。
- parameterType:将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的。
- resultType:返回类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。
- resultMap:外部resultMap的命名引用。注意resultType和resultMap不能同时使用。
3、<insert>、<update>、<delete>元素
<insert>元素用于映射插入语句,<update>元素用于映射更新语句,<delete>元素用于映射删除语句。与<select>元素的结构组成类似,这三个元素也包含了SQL语句、参数类型等信息。
insert语句最常用的属性与select一样。简单的insert语句如下:
<insert id="insert">
insert into Author (id,username,password,email,bio) values (#{id},# {username},#{password} ,#{email} ,#{bio})
</insert>
update语句最常用的属性与select一样。简单的update语句如下:
<update id="update">
update Author set username = #{username},password = #{password},email = #{email},bio = #{bio} where id = #{id}
</update>
delete语句最常用的属性与select一样。简单的delete语句如下:
<delete id="delete">
delete from Author where id = #{id}
</delete>
4、<sql>元素
Mybatis支持定义可重用的SQL代码段,用于包含在其他语句中。它可以静态地(在加载阶段)参数化。比如:
<sql id="userColumn">
${alias}.id,${alias}.username,${alias}.password
</sql>
定义好的SQL片段可以包含在以下的SQL语句中:
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1 cross join some_table t2
</select>
5、<resultMap>元素
<resultMap>元素用于映射结果集,它避免了JDBC ResultSets 的冗余和烦琐,同时,它封装并实现了一些JDBC没有提供的功能。
<resultMap>元素包含了子元素如下:
- constructor:用于在实例化类时,注入结果到构造方法中
- idArg:ID参数,标记出作为ID的结果可以帮助提高整体性能
- arg:将被注入到构造方法的一个普通结果
- id:一个ID结果,标记出作为ID的结果可以帮助提高整体性能
- result:注入到字段或JavaBean属性的普结果
- association:可用来配置一对一关联
- collection:可用来配置一对多关联.
- discriminator:用于配置结果集处理方法
id和result都将一个列的值映射到一个简单数据类型(String,int,double,Date等)的属性或字段。
这两者之间的唯一不同是,id元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。
id和result的属性如下表所示:
以下提供一个小例子:
<resultMap id="studentResultMap" type="StudentPOJO">
<id property="studentId" column="student_id" >
<result property="studentName" column="student_name"/>
<result property="age" column="age">
<result property="course" column="course"/>
</resultMap>
<select id="select" resultMap="studentResultMap">
select student_id, student_name, age, course from student where student_id=#{id}
</select>