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
接口。
网友评论