映射器是mybatis强大的工具,也是mybatis核心工具。
html
mybatis是针对映射器构造的SQL构建的轻量级框架,经过配置生成对应的JavaBean返回给调用者,然而mybatis配置的核心就是映射器的配置。
spring
mybatis映射器包含一些重要的元素,经过这些元素的配置实现映射器相应的功能。mybatis的元素分类以下表所示:
sql
接下来对于映射器的每个元素,咱们进行深刻的分析。数据库
一 select元素缓存
1 select元素的配置参数
session
2 自动映射数据结构
select元素下有一个autoMappingBehavior参数,经过配置该参数的值来设置其策略。mybatis提供自动映射功能,只要返回的SQL列名和JavaBean的属性一致,mybatis帮助咱们回填这些字段而不需任何配置。
mybatis
(1)NONE,取消自动映射app
(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必需要掌握的知识。