MyBatis 动态SQL、事务管理及缓存机制 Day13 2018-12-01

8.动态SQL

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

常用元素;

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

8.1 if

  • 可选条件 如果不为空则加入限制条件
  

8.2 choose

  • 选择其中的一项

8.3 where

  • where元素之一在一个以上的if条件有至的情况下才会去插入where子句,若最后内容是 and 或 or 开头,where元素会将他们去除

  

8.5 foreach

  • 元素用来遍历集合
  • collection:指定输入对象中的集合属性
  • item:每次遍历生成的对象
  • open:开始遍历时的拼接字符串
  • close:结束时拼接的字符串
  • separator:遍历对象之间需要拼接的字符串

8.6 bind

  • 预定义变量


8.7 trim

  • 替换和添加

  • prefix:前缀

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

  • suffix:后缀

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


8.8 set

  • set 元素会动态前置set关键字,同时会消除无关的逗号

    update WEB_EMPLOYEE
    
    
      LOGINNAME = #{loginname,jdbcType=VARCHAR},
      PASSWORD = #{password,jdbcType=VARCHAR},
      NAME = #{name,jdbcType=VARCHAR},
      SEX = #{sex,jdbcType=VARCHAR},
      AGE = #{age,jdbcType=DECIMAL},
      PHONE = #{phone,jdbcType=VARCHAR},
      SAL = #{sal,jdbcType=DECIMAL},
      STATE = #{state,jdbcType=VARCHAR}
    
    
    where id=#{id,jdbcType=DECIMAL}
  

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

        
            
          

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


9.2.2.2 mapper中开启二级缓存
  • mapper.xml


  • 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

        
            
          

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


9.2.2.2 mapper中开启二级缓存
  • mapper.xml


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

你可能感兴趣的:(MyBatis 动态SQL、事务管理及缓存机制 Day13 2018-12-01)