美文网首页
MyBatis 动态SQL、事务管理及缓存机制 Day13 20

MyBatis 动态SQL、事务管理及缓存机制 Day13 20

作者: Ernest_Chou | 来源:发表于2018-12-01 00:47 被阅读0次

    8.动态SQL

    mybatis才有ognl表达式来完成动态SQL。

    常用元素;

    • if
    • choose
      • when
      • otherwise
    • where
    • set
    • foreach
    • bind

    8.1 if

    • 可选条件 如果不为空则加入限制条件
      <select id="selectEmployeeByIdLike"  resultType="com.zhougl.web.beans.WebEmployee">
        select * from WEB_EMPLOYEE where state = 'active'
        <!-- 可选条件 如果不为空则加入限制条件 -->
        <if test="id != null">
        and id= #{id}
        </if>
      </select>
    

    8.2 choose

    • 选择其中的一项
    <select id="selectEmployeeChooce" parameterType="hashMap"  resultType="com.zhougl.web.beans.WebEmployee">
        select * from WEB_EMPLOYEE where state = 'active'
        <!-- 条件判断 -->
        <choose>
            <when test="id !=null"> and id= #{id} </when>
            <when test="loginname != null and password != null"> and loginname = #{loginname} and password = #{password}</when>
            <otherwise> and sex = '男' </otherwise>
        </choose>
      </select>
    

    8.3 where

    • where元素之一在一个以上的if条件有至的情况下才会去插入where子句,若最后内容是 and 或 or 开头,where元素会将他们去除
    <!-- where元素之一在一个以上的if条件有至的情况下才会去插入where子句,若最后内容是 and 或 or 开头,where元素会将他们去除 -->
      <select id="selectEmployeeWhere" resultType="com.zhougl.web.beans.WebEmployee">
        select * from WEB_EMPLOYEE
        <where>
            <if test="state != null"> state = #{state}</if>
            <if test="id != null"> and id = #{id}</if>
            <if test="loginname != null and password != null">
                and loginname = #{loginname} and password = #{password}
            </if>
        </where>
      </select>
    

    8.5 foreach

    • 元素用来遍历集合
    • collection:指定输入对象中的集合属性
    • item:每次遍历生成的对象
    • open:开始遍历时的拼接字符串
    • close:结束时拼接的字符串
    • separator:遍历对象之间需要拼接的字符串
    <select id="selectEmployeeForeach"  resultType="com.zhougl.web.beans.WebEmployee">
      <!-- collection:指定输入对象中的集合属性
            item:每次遍历生成的对象
            open:开始遍历时的拼接字符串
           close:结束时拼接的字符串
           separator:遍历对象之间需要拼接的字符串
           select * from WEB_EMPLOYEE where ID in (1,2,3)
        -->
        select  * from WEB_EMPLOYEE
        where ID in
        <!-- foreach 指定一个集合,声明元素体内的集合项和索引变量,也袁旭指定开闭匹配的字符串以及迭代中间放置分隔符 -->
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
      </select>
    

    8.6 bind

    • 预定义变量

    <select id="selectEmployeeLikeName" parameterType="int" resultMap="BaseResultMap">
        <bind name="pattern" value="'%'+ _parameter.getName() +'%'"/>
        select *    from WEB_EMPLOYEE
        where name like #{pattern}
      </select>
    

    8.7 trim

    • 替换和添加

    • prefix:前缀

    • prefixoverride:去掉第一个and或者是or

    • suffix:后缀

    • suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)

    <select id="selectEmployeeTrim" resultMap="BaseResultMap">
        SELECT * FROM WEB_EMPLOYEE
        <!-- prefix:前缀 
            prefixoverride:去掉第一个and或者是or
            suffix:后缀  
            suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)  -->
        <!--这个语句中是把AND换成where,下面的写法基本与where是等效的-->
        <trim prefix="where" prefixOverrides="and">
            <if test="state != null">and state = #{state}</if>
            <if test="id != null"> and id = #{id}</if>
            <if test="loginname != null and password != null">
                and loginname = #{loginname} and password = #{password}
            </if>
        </trim>
      </select>
    

    8.8 set

    • set 元素会动态前置set关键字,同时会消除无关的逗号
    <update id="updateEmployeeSet" parameterType="com.zhougl.web.beans.WebEmployee">
        update WEB_EMPLOYEE
        <!-- set 元素会动态前置set关键字,同时会消除无关的逗号 -->
        <set>
          <if test="loginname != null">LOGINNAME = #{loginname,jdbcType=VARCHAR},</if>
          <if test="password != null">PASSWORD = #{password,jdbcType=VARCHAR},</if>
          <if test="name != null">NAME = #{name,jdbcType=VARCHAR},</if>
          <if test="sex != null">SEX = #{sex,jdbcType=VARCHAR},</if>
          <if test="age != null">AGE = #{age,jdbcType=DECIMAL},</if>
          <if test="phone != null">PHONE = #{phone,jdbcType=VARCHAR},</if>
          <if test="sal != null">SAL = #{sal,jdbcType=DECIMAL},</if>
          <if test="state != null">STATE = #{state,jdbcType=VARCHAR}</if>
        </set>
        
        where id=#{id,jdbcType=DECIMAL}
      </update>
    

    9.事务管理及缓存机制

    9.1 事务管理

    9.1.1 事务特性
    • 原子性。事务是应用中最小执行单位。
    • 一致性。事务执行的结果,必须使数据库从一种一致状态,变到另一种一致性状态。
    • 隔离性。事务执行互不干扰,不能互相影响。
    • 持续性。事务一提交,对数据所做的任何改变都要保存到物理数据库中。
    9.1.2 Transaction接口
    • Transaction接口

      • JdbcTransaction实现类
      • ManagedTransaction实现类
    • TransactionFactory接口

      • JdbcTransactionFactory实现类
      • ManagedTransactionFactory实现类
    • 使用JDBC事务管理机制。利用java.sql.Connection完成对事务的提交(commit())、回滚(rollback())、和关闭(close())等。

    • 使用MANAGED事务管理机制。mybatis自身不会去实现事务管理,让容器如weblogic、JBoss等来实现对事务的管理。

    9.1.3 事务的配置创建
    • mybatis-config.xml
    <environment id="development">
            <!-- 指定事务管理类型,type="JDBC"指直接简单实用了JDBC提交和回滚设置。type="MANAGED"指让容器实现对事务的管理 -->
                <transactionManager type="JDBC" />
    </environment>          
    

    9.2 缓存机制

    9.2.1 一级缓存(SqlSession级别)

    一级缓存的作用域是SqlSession范围的。同一个SqlSession中执行两次相同的SQL语句,第一次执行会将查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据。如果SqlSession执行DML操作(insert、update、delete),并提交到数据库,mybatis会清空SqlSession中的一级缓存,保证缓存中是最新信息,避免出现脏读现象。

    • mybatis默认开启一级缓存。
    9.2.2 二级缓存(Mapper级别)

    二级缓存是mapper级别的,多个SqlSession可以使用同一个mapper的SQL语句去操作数据库,得到的数据会存在二级缓存。

    9.2.2.1 开启二级缓存配置
    • mybatis-config.xml
    <!-- 开启二级缓存 -->
    <setting name="cacheEnabled" value="true"/>
    
    9.2.2.2 mapper中开启二级缓存
    • mapper.xml
    <!-- 开启当前mapper的namespace下的二级缓存 -->
    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
    
    • cashe元素用来开启当前mapper的namespace下的二级缓存,属性设置:
      • flushInterval。刷新间隔。默认不设置,缓存仅仅调用语句时刷新。
      • size。缓存数目。默认值1024。
      • readOnly。只读。默认为false。只读的缓存会给所有调用者返回缓存对象的相同实例,这些对象不能被修改。
      • eviction。收回策略。默认为LRU。
        • LRU。最近最少使用的策略。移出最长时间不被使用的对象。
        • FIFO。先进先出策略。按对象进入缓存的顺序来移除。
        • SOFT。软引用策略。移除基于垃圾回收器状态和软引用规则的对象。
        • WEAK。弱引用策略。更积极地移除基于垃圾收集器和弱引用规则的对象。
    • 使用二级缓存时,查询结果映射的Java对象必须实现java.io.Serializable接口。

    9.事务管理及缓存机制

    9.1 事务管理

    9.1.1 事务特性
    • 原子性。事务是应用中最小执行单位。
    • 一致性。事务执行的结果,必须使数据库从一种一致状态,变到另一种一致性状态。
    • 隔离性。事务执行互不干扰,不能互相影响。
    • 持续性。事务一提交,对数据所做的任何改变都要保存到物理数据库中。
    9.1.2 Transaction接口
    • Transaction接口

      • JdbcTransaction实现类
      • ManagedTransaction实现类
    • TransactionFactory接口

      • JdbcTransactionFactory实现类
      • ManagedTransactionFactory实现类
    • 使用JDBC事务管理机制。利用java.sql.Connection完成对事务的提交(commit())、回滚(rollback())、和关闭(close())等。

    • 使用MANAGED事务管理机制。mybatis自身不会去实现事务管理,让容器如weblogic、JBoss等来实现对事务的管理。

    9.1.3 事务的配置创建
    • mybatis-config.xml
    <environment id="development">
            <!-- 指定事务管理类型,type="JDBC"指直接简单实用了JDBC提交和回滚设置。type="MANAGED"指让容器实现对事务的管理 -->
                <transactionManager type="JDBC" />
    </environment>          
    

    9.2 缓存机制

    9.2.1 一级缓存(SqlSession级别)

    一级缓存的作用域是SqlSession范围的。同一个SqlSession中执行两次相同的SQL语句,第一次执行会将查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据。如果SqlSession执行DML操作(insert、update、delete),并提交到数据库,mybatis会清空SqlSession中的一级缓存,保证缓存中是最新信息,避免出现脏读现象。

    mybatis默认开启一级缓存。

    9.2.2 二级缓存(Mapper级别)

    二级缓存是mapper级别的,多个SqlSession可以使用同一个mapper的SQL语句去操作数据库,得到的数据会存在二级缓存。

    9.2.2.1 开启二级缓存配置
    • mybatis-config.xml
    <!-- 开启二级缓存 -->
    <setting name="cacheEnabled" value="true"/>
    
    9.2.2.2 mapper中开启二级缓存
    • mapper.xml
    <!-- 开启当前mapper的namespace下的二级缓存 -->
    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
    
    • cashe元素用来开启当前mapper的namespace下的二级缓存,属性设置:
      • flushInterval。刷新间隔。默认不设置,缓存仅仅调用语句时刷新。
      • size。缓存数目。默认值1024。
      • readOnly。只读。默认为false。只读的缓存会给所有调用者返回缓存对象的相同实例,这些对象不能被修改。
      • eviction。收回策略。默认为LRU。
        • LRU。最近最少使用的策略。移出最长时间不被使用的对象。
        • FIFO。先进先出策略。按对象进入缓存的顺序来移除。
        • SOFT。软引用策略。移除基于垃圾回收器状态和软引用规则的对象。
        • WEAK。弱引用策略。更积极地移除基于垃圾收集器和弱引用规则的对象。
    • 使用二级缓存时,查询结果映射的Java对象必须实现java.io.Serializable接口。

    相关文章

      网友评论

          本文标题:MyBatis 动态SQL、事务管理及缓存机制 Day13 20

          本文链接:https://www.haomeiwen.com/subject/zxflcqtx.html