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

来源:互联网 发布:ios数据库操作 编辑:程序博客网 时间:2024/05/09 20:46

引言

            映射器是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 setrole_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必须要掌握的知识。

0 0
原创粉丝点击