79.【Mybatis】(十一)

简介: 79.【Mybatis】

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();
    }

相关文章
|
存储 缓存 Java
|
5月前
|
Java 数据库连接 API
MyBatis入门操作
MyBatis入门操作
40 0
|
5月前
|
SQL 缓存 Java
一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
424 0
|
5月前
|
缓存 Java 数据库连接
一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache
一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache
110 0
|
5月前
|
druid Java 数据库连接
一文彻底搞懂Mybatis系列(四)之mybatis核心配置文件详解
一文彻底搞懂Mybatis系列(四)之mybatis核心配置文件详解
282 0
|
5月前
|
SQL 缓存 Java
一文彻底搞懂Mybatis系列(十四)之MyBatis一级缓存
一文彻底搞懂Mybatis系列(十四)之MyBatis一级缓存
169 0
|
10月前
|
Java 数据库连接 Maven
SSM复习之mybatis01:Mybatis简介-第一个Mybatis代码简单实现
SSM复习之mybatis01:Mybatis简介-第一个Mybatis代码简单实现
54 0
|
SQL 缓存 Java
【MyBatis学习笔记 四】MyBatis基本运行原理源码解析
【MyBatis学习笔记 四】MyBatis基本运行原理源码解析
106 0
|
Java 数据库连接 mybatis
MyBatis(十一) 注解详解
MyBatis常用注解详解介绍
|
SQL XML 存储
【Mybatis】初识Mybatis与快速入门第一个程序(上)
【Mybatis】初识Mybatis与快速入门第一个程序
153 0
【Mybatis】初识Mybatis与快速入门第一个程序(上)