引言
映射器是mybatis强大的工具,也是mybatis核心工具。
概述
mybatis是针对映射器构造的SQL构建的轻量级框架,通过配置生成对应的JavaBean返回给调用者,然而mybatis配置的核心就是映射器的配置。
内容
mybatis映射器包含一些重要的元素,通过这些元素的配置实现映射器相应的功能。mybatis的元素分类如下表所示:
接下来对于映射器的每一个元素,我们进行深入的分析。
一 select元素
1 select元素的配置参数
2 自动映射
select元素下有一个autoMappingBehavior参数,通过配置该参数的值来设置其策略。mybatis提供自动映射功能,只要返回的SQL列名和JavaBean的属性一致,mybatis帮助我们回填这些字段而不需任何配置。
(1)NONE,取消自动映射
(2)PARTIAL(默认),只会自动映射,没有定义嵌套结果集映射的结果集
(3)FULL,自动映射任意复杂的结果集(无论是否嵌套)
3 传递多个参数给映射器
(1)Map:Map导致业务可读性的丧失,从而导致后续扩展和维护困难。
(2)注解方式:受到参数个数的影响,当参数个数小于等于5个,它是最佳传参方式,比Javabean更加直观;反之多个参数增大调用的难度。
(3)JavaBean:参数过多的情况下较为合适。
二 insert元素
1 元素配置:id、parameterType、parameterMap、flushCache、timeout、statementType、databaseId与select元素的作用一致,除此之外还有四个特殊的参数配置:
(1)keyProperty:表示以哪个列作为属性的主键,不能和keyColumn同时使用,若是联合主键,用逗号隔开;
(2)useGeneratedKeys:令mybatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键,取值为true/false,默认为false;
(3)keyColumn:指明第几列是主键,不能和keyProperty同时使用,只接受整形参数,联合主键用逗号隔开;
(4)lang:自定义语言,可使用第三方语言。
2 自定义主键(示例)
<insert id="insertRole" parameterType="role" useGeneratedKeys="true" keyProperty="id">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select if(max(id) is null, 1, max(id) + 2) as newId from t_role
</selectKey>
insert into t_role(id, role_name, note) values (#{id}, #{roleName}, #{note})
</insert>
三 update和delete元素
mybatis执行完update元素和delete元素后会返回一个整数,标出执行后影响的记录条数。
示例
<update parameterType"role" id="updateRole">
update t_role set
role_name = #{roleName},
note = #{note}
Where id= #{id}
</update>
<delete id="delete" parameterType="long">
delete from t_role where id= #{id}
</delete>
五 sql元素
sql元素能定义一串SQL语句的组成部分,其他语句通过引用来使用它,达到复用的作用。
示例:
<sql id="role_columns">
#{prefix}.role_no, #{prefix}.role_name, #{prefix}.note
</sql>
<select parameterType="string" id="getRole" resultMap="roleResultMap"
select
<include refid="role_columns">
<property name="prefix" value="r"/>
</include>
from t_role r where role_no = #{roleNo}
</select>
六 resultMap(结果映射集)
1 resultMap构成
<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association/>
<discriminator>
<case/>
</discriminator>
</resultMap>
2 存储结果集
(1)使用Map:任何的select都可以使用map存储
<select id="findColorByNote" parameterType="string" resultType="map">
select id, color, note from t_role where note like concat('%', #{note}, '%')
</select>
(2)POJO:常用的方式,可以使用自动映射,也可以使用select语句的属性resultMap配置映射集合,知识使用前需要配置类似的resultMap
1)配置resultMap
<resultMap id="roleResultMap" type="con.liming.domain.pojo.Role">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property"note" column="note"/>
</resultMap>
2)使用配置好的resultMap
<select parameterType="long" id="getRole" resultMap="roleResultMap">
select id, role_name, note from t_role where id=#{id}
</select>
3 级联
(1)association:一对一关联,例如公民与身份证的关系
(2)collection:一对多关联,例如班级和学生的关系
(3)discriminator:鉴别器,根据特定的条件关联不同的结果集
七 缓冲:互联网系统常用,特点是将数据存储到内存中。
1 系统缓存:分为一级缓存和二级缓存
(1)一级缓存:SqlSession级别的缓冲,操作数据库时需要购置sqlSession对象,在对象中以数据结构HashMap存储缓存数据,不同的SqlSession之间的缓存数据区域(HashMap)是互不影响的。
1)工作原理:
第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。
第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。
2)应用:
mybatis和spring进行整合开发,事务控制在service中。一个service包括许多mapper方法调用。
service{
//开始执行时,开启事务,创建SqlSession对象
//第一次调用mapper的方法findUserById(1)
//第二次调用mapper的方法findUserById(1),从一级缓存中取数据
//方法结束,sqlSession关闭
}
如果是执行两次service调用查询相同的用户信息,不走一级缓存,因为session方法结束,sqlSession就关闭,一级缓存就清空。
(2)二级缓存:是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共享二级缓存,二级缓存跨SqlSession。
1)工作原理:
首先开启mybatis的二级缓存。
sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到二级缓存中。
sqlSession2去查询用户id为1的用户信息,去缓存中找是否存在数据,如果存在直接从缓存中取出数据。
如果SqlSession3去执行相同mapper下sql,执行commit提交,清空该 mapper下的二级缓存区域的数据。
2)区别:
二级缓存的范围更大,多个sqlSession可以共享一个UserMapper的二级缓存区域。
UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。
每一个namespace的mapper都有一个二缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。
2 自定义缓存
(1)配置自定义缓存:<cache type="com.liming.domain.MyCache"/>
(2)设置自定义缓存参数:
<cache type="com.liming.domain.MyCache">
<property name="host" value="localhost/>
</cache
总结
mybatis的核心就是映射器,而映射器的重点是如何配置映射器,也就是如何通过配置文件执行映射器。mybatis的级联和缓存以及为了解决由缓存引起的N+1问题而提出的延迟加载等知识点,都是学习mybatis必须要掌握的知识。