MyBatis真正强大之处就在于SQL映射语句,也是他的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单。在之前,我们简单比对了SQL映射配置和JDBC代码,发现用SQL映射文件配置可减少50%以上代码量。并且MyBatis专注于SQL,对于开发人员来说,也可极大限度地进行SQL调优,以保证性能。
SQL映射文件常用的元素配置:
mapper:映射文件的根元素节点,只有一个属性namespace(命名空间),其作用:
(1)、用于区分不同的mapper,全局唯一。
(2)、绑定DAO接口、即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类、MyBatis会通过接口的完整限定名查找到相对应的mapper配置来执行SQL语句。因此namespace的命名必须要跟接口同名。
cache:配置给定命名空间的缓存。
cache-ref:从其他命名空间引用缓存配置。
resultMap:用来描述数据库结果集和对象的对应关系。
sql:可以重用的SQL块,也可以被其他语句引用。
insert:映射插入语句。
update:映射更新语句。
select:映射查询语句。
delete:映射删除语句。
sql映射文件:实现简单的增删改查配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.UserMapper">
<!-- 根据id查询到一个User对象 -->
<select id="getUser" parameterType="int" resultType="_User">
select * from user where uId=#{uId}
</select>
<!-- 创建用户信息 -->
<insert id="insertUser" parameterType="_User">
insert into user(uName,uPwd,account) value(#{uName},#{uPwd},#{account});
</insert>
<!-- 修改用户信息 -->
<update id="updateUser" parameterType="_User">
update user set uName = #{uName},uPwd=#{uPwd},account=#{account} where uId = #{uId}
</update>
<!-- 删除用户信息 -->
<delete id="deleteUser" parameterType="int">
delete from user where uId = #{uId};
</delete>
<!-- 查询所有用户信息 -->
<select id="getUserList" parameterType="int" resultType="_User">
select * from user
</select>
</mapper>
SQL映射文件:实现一对多查询以及resultMap配置:
<select id="getClass2" parameterType="int" resultMap="classResultMap2">
select * from class c
inner join teacher t on t.t_id = c.teacher_id
inner join student s on s.class_id = c.c_id
where c.c_id = #{c_id};
</select>
<resultMap id="classResultMap2" type="bean.Class2">
<id property="c_id" column="c_id"/>
<result property="c_name" column="c_name"/>
<association property="teacher" javaType="bean.Teacher">
<id property="t_id" column="t_id"/>
<result property="t_name" column="t_name"/>
</association>
<collection property="sList" ofType="bean.Student">
<id property="s_id" column="s_id"/>
<result property="s_name" column="s_name"/>
</collection>
</resultMap>
使用@param注解实现多参数入参:
@Select("select * from ebook_entry where categoryId = #{id} limit #{pageBean.startIndex},#{pageBean.pageSize}")
public List<EBookEntry> findByCategoryIdEBookEntry(@Param(value="id")int id,@Param(value="pageBean")PageBean<EBookEntry> pageBean);
使用resultMap实现高级结果映射:
属性:
id:resultMap唯一标识。
type:表示该resultMap的映射结果类型(通常是java实体类)。
子节点:
id:一般对应数据库中该行的主键id,设置此项可以提升MyBatis性能。
result:映射到JavaBean某个“简单类型”,如基础数据类型、包装类等。
子节点id和result均可实现最基本的结果集映射,将列映射到简单数据类型的属性。这两者唯一不同的是:在比较对象实例时id将作为结果集的标识属性。有助于提高性能,特别时应用缓存和潜逃结果映射的时候。
association:映射到JavaBean的某个“复杂类型”属性,比如JavaBean类、即JavaBean内部嵌套一个复杂数据类型属性,这种情况就属于复杂类型的关联。
注意:association仅限于一对一的关联关系。
connection:connection的作用和association元素差不多一样,事实上,他们非常类似,也是映射到JavaBean的某个“复杂”属性,只不过这个属性是一个集合列表,即JavaBean内部嵌套一个复杂数据类型(集合)属性。和使用association元素一样,我们使用嵌套查询,或者从连接中嵌套结果集。
resultMap自动映射级别:
NONE:禁止自动匹配。
PARTIAL(默认):自动匹配所有属性,有内部嵌套(association、collection)的除外。
FULL:自动匹配所有。
MyBatis缓存:
一级缓存:一级缓存时基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作为范围为session域内,当session flush或者close之后,该session中所有cache就会清空。
二级缓存:二级缓存就是global caching,它超过session范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心配置文件(mybatis-config.xml)settings中设置即可。
一级缓存缓存的时SQL语句,二级缓存缓存的时结果对象。
二级缓存的配置:
配置全局缓存:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
配置mapper文件缓存:
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>