6.SQL片段(sql,include)
(1).sql标签的作用:
可以实现对于动态SQL语句达到复用的状态
SQL标签
<sql id="自定义标签名"></sql>
include标签
<include refid="if-title-title"/>
配置文件
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="Com.Jsxs.Dao.BlogMapper"> <sql id="if-title-title"> <if test="title!=null"> title=#{title}, </if> <if test="title!=null"> author=#{author} </if> </sql> <!-- update blog set title--> <update id="updateBlogChoose" parameterType="map"> update blog <set> <include refid="if-title-title"/> </set> where id=#{id} </update> </mapper>
测试结果
(2).SQL片段注意事项
(1).最好基于单表的查询
(2).不要存在Where
7.Foreach
源码
index 是键,item 是值,collection 是集合。数据与数据之间的分割符是,
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P <where> <foreach item="item" index="index" collection="list" open="ID in (" separator="," close=")" nullable="true"> #{item} </foreach> </where> </select>
1.把Foreach的分割符变成OR的形式
SQL语句
select *from blog where 1=1 and (id=1 or id=2 or id=3);
接口
package Com.Jsxs.Dao; import Com.Jsxs.pojo.Blog; import java.util.List; import java.util.Map; public interface BlogMapper { // 通过ID进行数据的查询 List<Blog> queryById(Map<String,Object> map); }
配置文件
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="Com.Jsxs.Dao.BlogMapper"> <!-- update blog set title--> <update id="updateBlogChoose" parameterType="map"> update blog <set> <include refid="if-title-title"/> </set> where id=#{id} </update> <!-- select *from blog where 1=1 and (id=1 or id=2 or id=3); --> <select id="queryById" parameterType="map" resultType="Com.Jsxs.pojo.Blog"> select *from blog <where> <foreach collection="ids" item="id2" open="and (" close=")" separator="or"> id=#{id2} </foreach> </where> </select> </mapper>
测试
@Test public void TestForeach(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); HashMap<String, Object> map = new HashMap<>(); ArrayList<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); // 这边传递的是一个链表 map.put("ids",ids); List<Blog> blogs = mapper.queryById(map); for (Blog blog : blogs) { System.out.println(blog); } }
解释
(十九)、缓存简介
1.为什么要使用缓存?
因为:
查询 : 链接数据库,耗资源!! 一次查询的结果:给他暂存再一个可以直接取到的地方----》内存: 缓存 我们再次查询相同数据的时候,直接走缓存,就不用走数据库。 减少与数据路的交互,减少系统的开销。
2.什么样的数据适合利用缓存
经常使用查询,但不会改变的数据适合利用缓存
3.Mybatis缓存
MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。
==(1).==Mybatis默认定义了两级缓存模式:
- 默认情况下: 只有一级缓存开启(Sqlsession 级别的缓存,也称为本地缓存)
- 二级缓存需要手动开启和配置,它是基于namspace级别的缓存
- 为了提高扩展性,Mybatis定义了缓存接口Cache,我们可以通过实现Cache接口自定义二级缓存。
4.测试一级缓存
一级缓存的测试: 生命周期----》 从创建sqlSession到sqlSession关闭的这个区间,就是一级缓存的有效生命期
映射语句文件中的所有 select 语句的结果将会被缓存。 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
首先开启日志模式,然后进行写入两个查询语句;
如何验证?
通过查看日志的信息,我们查看其中的sql语句的执行次数,如果写入两个查询语句,然后sql语句再日志中报备的时候,只有一条,我们就可以发现有缓存的实际功能。
(1).查询两个语句且ID信息一致
接口
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import org.apache.ibatis.annotations.Param; public interface UserMapper { // 根据ID进行数据的查询 User queryById(@Param("id") int id); }
配置
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="Com.Jsxs.Dao.UserMapper"> <!-- 通过id对数据进行查询--> <select id="queryById" parameterType="_int" resultType="Com.Jsxs.pojo.User"> select *from user where id=#{id} </select> </mapper>
测试
package Com.Jsxs.Dao; import Com.Jsxs.pojo.User; import Com.Jsxs.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class UserTest { // 通过ID进行数据的查询 /* 一级缓存的测试: 生命周期----》 从创建sqlSession到sqlSession关闭的这个区间,就是一级缓存的有效生命期 */ @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryById(1); System.out.println(user); System.out.println("============"); User user2 = mapper.queryById(1); System.out.println(user2); sqlSession.close(); } }
(2).查询两个语句且ID信息不一致
@Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryById(1); System.out.println(user); System.out.println("============"); User user2 = mapper.queryById(2); System.out.println(user2); sqlSession.close(); }