mybatis框架(四)——强大的映射器

引言

            映射器是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)应用:

mybatisspring进行整合开发,事务控制在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必需要掌握的知识。