Mybatis笔记 (8)

<set>标签主要用于 update中

<!-- 只更新非空的字段 --> <update parameterType="User"> UPDATE t_user2 SET <if test="name != null"> name = #{name}, </if> <if test="gender != null"> gender = #{gender}, </if> <if test="registTime != null"> regist_time = #{registTime} </if> WHERE id = #{id} </update> <!-- 如果registTime=null,name或gender!=null,则sql为: UPDATE t_user2 SET name = #{name},gender = #{gender}, WHERE id = #{id} 注意:多了逗号,sql语法错误 -->

使用 <set>:

<update parameterType="User"> UPDATE t_user2 <set> <if test="name != null"> name = #{name}, </if> <if test="gender != null"> gender = #{gender}, </if> <if test="registTime != null"> regist_time = #{registTime} </if> </set> WHERE id = #{id} </update> <!-- 如果registTime=null,name或gender!=null,则sql为: UPDATE t_user2 SET name = #{name},gender = #{gender} WHERE id = #{id} 注意:<set>会自动补充一个 ”set语句“,并将最后一个逗号去除 --> 5. Trim <select parameterType="User" resultType="User"> SELECT id,name,gender,regist_time FROM t_user2 <trim prefix="where" prefixOverrides="and|or"> <if test="name != null"> name=#{name} </if> <if test="id>=10"> OR id>#{id} </if> <if test="gender == false"> AND gender=#{gender} </if> </trim> </select> <!-- <trim prefix="where" prefixOverrides="and|or"> 等价于 <where> prefix="where":会添加一个where关键字 prefixOverrides="and|or":会去除开头的and 或 or --> <update parameterType="User"> UPDATE t_user2 <trim prefix="set" suffixOverrides=","> <if test="name != null"> name = #{name}, </if> <if test="gender != null"> gender = #{gender}, </if> <if test="registTime != null"> regist_time = #{registTime} </if> </trim> WHERE id = #{id} </update> <!-- <trim prefix="set" suffixOverrides=","> 等价于 <set> prefix="set":会添加一个set关键字 suffixOverrides=",":会去除最后的逗号 --> 6. Foreach

批量查询:id为 1,3,5的数据

//DAO声明为: public List<User> queryUsers2(List<Integer> ids); <select resultType="User"> SELECT id,name,gender,regist_time FROM t_user2 WHERE id IN <foreach collection="list" open="(" separator="," close=")" item="id" index="ind"> #{id} </foreach> </select> <!-- <foreach collection="list" open="(" separator="," close=")" item="id" index="ind"> collection="list" 代表参数是List,如果是数组,要用array open="(" 以“(” 开头 close=")" 以“)” 结尾 separator="," 值之间用“,”分隔 item="id" 每次遍历的值的临时变量 #{id} 获取每次遍历的值 如上:标签的效果是 (值1,值2,值3) 示例:如果传入 List{1 3 5},则最终的sql: 【SELECT id,name,gender,regist_time FROM t_user2 WHERE id IN (1,3,5)】 -->

批量添加:

insert into t_user (name,gender) values('xx',1),('xxx',0),('xxxx',1)

<!-- 批量添加 --> <insert parameterType="java.util.List"> insert into t_user2 (name,gender,regist_time) values <foreach collection="list" item="user" index="ind" close="" open="" separator=","> (#{user.name},#{user.gender},#{user.registTime}) </foreach> </insert> List<User> users = ...; System.out.println(userDAO.insertUsers(users)); 7. Sql

复用sql语句

<!-- 定义一段sql --> <sql> id,note,price,create_time as createTime </sql> <!-- 引用sql --> <select parameterType="int" resultType="Order"> select <include refid="order"/> from t_order where id = #{id} </select> 九、缓存

缓存:将数据库的数据临时的存储起来,以更好的支持查询。

问题:如果有数据,查询频繁且更新极少,此种数据如果依然每次到数据库查询,效率偏低。

解决:将如上数据,临时的存储到内存中,提供对外界的查询服务,进而减少和数据库的通信,提高查询效率。

原理:当查询数据时,查询结果会被缓存在某个内存区域中,核心存储结构={sql:查询结果};

每次发起查询时,会先找到缓存,从中尝试获取数据,如果没有找到数据,再去查数据库,并将在数**

库中查到的结果存入缓存,以供后续查询使用。

MyBatis作为持久层框架,缓存管理自然是他的本职工作。

支持了两种缓存:一级缓存,二级缓存

1. 一级缓存

存储位置:SqlSession;即一个SqlSession对象发起查询后,查询结果会缓存在自己内部

有效范围:同一个SqlSession的多次查询;即,同一个SqlSession的多次相同sql的查询可以使用一级缓存

开启:不用任何配置,默认启动。

清除:sqlSession.clearCache();

2. 二级缓存 2.1 概述

**存储位置:SqlSessionFactory;同一个SqlSessionFactory创建的所有SqlSession发起的查询,查询结果都会缓存在 **

SqlSessionFactory内部。

有效范围:同一个SqlSessionFactory

开启:默认开启,但需要制定哪个DAO的Mapper需要使用二级缓存,定义一个 <cache>即可

注意:二级缓存必须在sqlSession.commit() 或 sqlSession.close() 之后才生效

清除:sqlSession.rollback();//则查询的结果不会进入二级缓存

2.2 应用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyywd.html