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

2018-12-01  本文已影响0人  Ernest_Chou

8.动态SQL

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

常用元素;

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元素会将他们去除 -->
  <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

<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

<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

<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接口
9.1.3 事务的配置创建
<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中的一级缓存,保证缓存中是最新信息,避免出现脏读现象。

9.2.2 二级缓存(Mapper级别)

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

9.2.2.1 开启二级缓存配置
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
9.2.2.2 mapper中开启二级缓存
<!-- 开启当前mapper的namespace下的二级缓存 -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>

9.事务管理及缓存机制

9.1 事务管理

9.1.1 事务特性
9.1.2 Transaction接口
9.1.3 事务的配置创建
<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 开启二级缓存配置
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
9.2.2.2 mapper中开启二级缓存
<!-- 开启当前mapper的namespace下的二级缓存 -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
上一篇 下一篇

猜你喜欢

热点阅读