iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Mybatis 动态sql的编写|开启二级缓存
  • 709
分享到

Mybatis 动态sql的编写|开启二级缓存

mybatissqljava数据库 2023-09-22 12:09:46 709人浏览 泡泡鱼
摘要

❤️作者主页:微凉秋意 ✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆 ✨精品专栏:数据结构与课程设计 🔥

❤️作者主页:微凉秋意
✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆
✨精品专栏:数据结构与课程设计
🔥系列专栏:javaweb

文章目录

前言

上篇博文把表连接查询和三种对应关系的写法记录总结了,本篇要把 mybatis 中的动态sql 的使用以及缓存知识记录下来。

动态SQL

在解释 where if 标签之前先进行一个模糊查询的操作。

模糊查询

如下面一张表:

在这里插入图片描述
查询所有 姓人员的信息:

mapper接口中定义方法:

List<Person> selectName(String name);

xml 中编写 sql 语句:

<select id="selectName" resultMap="personMap">        select *        from t_person        where person_name like concat('%', #{name}, '%');    select>

这里的 concat('%', #{name}, '%') 写法使用了字符串拼接的技巧,这样在查询语句里就是 %name% 的模糊查询了。
如果这样写:'%#{name}%' 是不行的,#{}会失效。

编写测试类:

在这里插入图片描述
测试结果:
在这里插入图片描述
可以看到所有 姓的人信息被查询到了。

where if 标签

姓李的太多,那么我们可以加一个年龄范围,于是需要增加两个参数:

在这里插入图片描述

这里要注意,参数在两个以上需要使用 注解 来绑定。

重点来看 xml中的 sql 语句

<select id="selectContent" resultMap="personMap">        select * from t_person        <where>            <if test="name != null and name !=''">                person_name like concat('%',#{name},'%')            if>            <if test="ageMin > 0">                and age >= #{ageMin}            if>            <if test="ageMax > ageMin">                and age <= #{ageMax}            if>        where>    select>
  • 可以看到这里的 where 关键字变成了一个标签 ,这是因为:
    • 如果这三个参数都不填写的话,where 下的条件就不会起作用,
      此条 sql 就变成了查询所有。
    • 显然,查询所有的语法里是没有 where 关键字的,因此使用标签代替。
    • 除了使用 标签之外,也可以使用类似 1=1and 的方法拼接。
      • 比如: select * from t_person where 1=1 and ...
  • 此外,where 标签还可以去除多余的 and 前缀。
  • if 标签用来做判断,test 里写判断的条件,标签内写判断成功后的 sql 语句:
    • 这里就是判断名字是否为空以及年龄的取值范围是否合理:
      • test 里面的符号正常写,andor 代表并且和或者。
      • sql 语句里,> 是大于的意思,< 是小于的意思。

编写测试类:

在这里插入图片描述

测试结果:
在这里插入图片描述
很明显,年龄在 20~28 且姓李的只有 “李白” 自己。

update set 标签

以往的修改操作都是将对象的所有属性都修改或者重写一遍,这样是不合逻辑的,因此可以在修改的 sql 语句里使用 if 标签来优化

mapper 接口中写方法:

void update(Person person);

xml 中编写 sql:

<update id="update">        update t_person        <set>            <if test="personName !=null and personName !=''">                person_name = #{personName},            if>            <if test="age !=null">                age         = #{age},            if>            <if test="birthday != null and birthday!= ''">                birthday    = #{birthday},            if>            <if test=" sex !=null and sex !=''">                sex = #{sex},            if>            <if test="mobile != null and mobile !=''">                mobile = #{mobile},            if>            <if test="address !=null and address!=''">                address = #{address}            if>        set>        where person_id = #{personId}    update>
  • if 标签想必好理解,但是set 标签是做什么的呢?原因是:
    • 假如只修改名字,那么 sql 语句将变为:
      update t_person set person_name = ?, where ...
    • 可以发现?占位符后面会有多余的逗号导致 sql 语法错误
    • 标签会自动去除多余的逗号后缀。

值得注意的是:set 标签去除,后缀,where 标签去除and前缀。

foreach 标签

相信大家都知道foreach 跟循环有关系,没错,我们可以利用此标签来完成 批量删除 操作。

从 sql 的语句来看,批量删除应该这样写:

delete from t_person where person_id in (?,?,?,...)

那么 in 后的形式该怎么用 mybatis 表达出来呢,有括号,不定数量的逗号…

不急,一步步来,先写 mapper接口:

void deleteMany(@Param("myIds") int[] ids);

再编写 sql 语句:

<delete id="deleteMany">        delete from t_person where person_id in        <foreach collection="myIds" open="(" close=")" separator="," item="id">            #{id}        foreach>    delete>

利用 foreach 就可以将参数集合中的值依次放入到 in 后的括号内:(id,id,id...)

foreach 标签相关解释:

  • collection:被循环的数组或者集合,注意如果是参数必须使用@Param 起名
  • open : 循环以什么开始
  • close :循环以什么结束
  • separator: 循环以什么分割
  • item : 每次循环的元素

编写测试类(不要忘记手动提交事务):

在这里插入图片描述

测试结果:

在这里插入图片描述
可以看到数组里的元素依次放入了括号内,并成功做到了批量删除。

useGeneratedKeys 获取插入数据的主键值

一般我们习惯将表中的主键设为自增长,那么在使用 insert 插入数据时,主键是不用赋值的,而是用 null 代替。那怎么才能在插入后直接得到该数据的主键值呢?那就使用 useGeneratedKeys

来看具体的使用:

<insert id="insert" useGeneratedKeys="true" keyProperty="personId" keyColumn="person_id">    insert into t_person    values (null, #{personName}, #{age}, #{sex}, #{birthday}, #{mobile}, #{address})insert>

将值设为 true 后,keyPropetry 的值填写属性名,keyColumn 的值填写表的字段名。

编写测试类:

@Test    public void insert(){    SqlSession sqlSession = MybatisUtil.getSqlSession();    PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);        Person person = new Person(null,"微凉",21,"1",new Date(),"1359356123","爱琴海");        mapper.insert(person);        sqlSession.commit();        MybatisUtil.closeSqlSession(sqlSession);        System.out.println(person);    }

测试结果:

在这里插入图片描述
可以看到插入数据后的主键值为 240,这便是自动获取的结果。

Mybatis 缓存

有关 IO 操作一般都会很耗时,在一个 javaweb 项目中,页面到 Tomcat 与 tomcat 到数据库都属于IO操作。因此 mybatis 在 tomcat 中创建了一块叫做缓存的空间,在缓存中保存比如查询操作的数据,以后进行重复操作时,就不必到数据库中获取了,而是直接在 tomcat 内部获取。

如果对数据库进行修改,缓存中的数据跟数据库中的对应不上,那么此时缓存中的就变成了脏数据

一级缓存

特点:

  • 默认开启
  • 作用在同一个 SqlSession
  • 脏数据的处理: 一旦执行增删改,立刻清空缓存

但是一级缓存并没有什么意义,因为作用范围的缘故,它只能在一个 SqlSession ,也就是一个事务内,一旦提交事务,缓存就会被清空,没有实战意义。

二级缓存

二级缓存的作用范围大,符合实战的需求,该如何开启:

  1. 实体类需要实现可序列化接口:implements Serializable
  2. mybatis-config.xml 文件中添加 标签:
    <settings>   <setting name="cacheEnabled" value="true"/>settings>
  3. 在对应 mapperxml 文件中添加 标签:
    <cache size="1024" eviction="LRU" flushInterval="60000"/>
    • size:定义二级缓存空间大小 (单位是 M)
    • eviction:定义缓存到达上限时的淘汰策略,常使用LRU算法
      • 叫做最近最久未使用算法,即清空最近使用次数最少的缓存
    • flushInterval:定义清空缓存的间隔时间 (单位 ms)

作用范围:

  • 同一个sqlSessionFactory内,而且必须提交事务。

脏数据的处理:

  1. 一旦执行增删改,默认清空同一个 namespace 下的二级缓存。
  2. 自定义清空缓存的策略:
    • flushCache属性,值为 true 时执行清空缓存,为 false 则不清空。
    • insertdeleteupdate 标签里默认为 true
    • select 标签里默认为 false

脏数据并不都是一定要清空,因此在增删改查标签内可以自由的设定缓存清空的策略。


mybatis 框架的记录到此结束,一共三篇,感兴趣的小伙伴可以订阅此专栏。

来源地址:https://blog.csdn.net/m0_58618795/article/details/128800023

--结束END--

本文标题: Mybatis 动态sql的编写|开启二级缓存

本文链接: https://www.lsjlt.com/news/415244.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mybatis 动态sql的编写|开启二级缓存
    ❤️作者主页:微凉秋意 ✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆 ✨精品专栏:数据结构与课程设计 🔥...
    99+
    2023-09-22
    mybatis sql java 数据库
  • mybatis二级缓存如何开启
    MyBatis的二级缓存默认是关闭的,如果需要开启二级缓存,可以按照以下步骤进行操作:1. 在MyBatis的配置文件中,添加以下配...
    99+
    2023-08-24
    mybatis
  • mybatis二级缓存怎么开启
    要开启MyBatis的二级缓存,需要在MyBatis的配置文件(如mybatis-config.xml)中进行相应的配置。以下是开启...
    99+
    2024-03-02
    mybatis
  • Springboot整合mybatis开启二级缓存的实现示例
    目录前言mybatis 一级缓存和二级缓存的概念pom引入依赖application.properties 文件配置mapper.xml 文件配置cache-ref完整示例代码踩坑参...
    99+
    2024-04-02
  • Mybatis 一级缓存与二级缓存的实现
    mybatis缓存 mybatis作为一个流行的持久化工具,缓存必然是缺少不了的组件。通过这篇文章,就让我们来了解一下mybatis的缓存。 mybatis缓存类型 说起mybati...
    99+
    2024-04-02
  • springboot如何开启二级缓存
    Spring Boot并不直接支持二级缓存的功能,但可以通过集成其他框架来实现。一种常见的做法是使用Spring Data JPA结...
    99+
    2023-08-24
    springboot
  • hibernate怎么开启二级缓存
    要在Hibernate中开启二级缓存,需要完成以下步骤:1. 配置缓存提供程序:在Hibernate配置文件(通常是hibernat...
    99+
    2023-08-24
    hibernate
  • MyBatis中一级缓存与二级缓存的区别
    今天就跟大家聊聊有关MyBatis中一级缓存与二级缓存的区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一级缓存一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sq...
    99+
    2023-05-31
    mybatis 一级缓存 二级缓存
  • Mybatis中一级缓存、二级缓存的示例分析
    这篇文章主要介绍了Mybatis中一级缓存、二级缓存的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解...
    99+
    2023-06-02
  • 深入浅析MyBatis中的一级缓存与二级缓存
    本篇文章给大家分享的是有关深入浅析MyBatis中的一级缓存与二级缓存,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyBatis缓存我们知道,频繁的数据库操作是非常耗费性能的...
    99+
    2023-05-31
    mybatis 二级缓存 一级缓存
  • MybatisPlus开启、关闭二级缓存方法
    目录一、开启MybatisPlus的全局配置: 二、在对应的xml文件中,添加配置:三、如果有写接口无需二级缓存,可在对应的地方添加:useCache=“false” 一、开启Myb...
    99+
    2024-04-02
  • MyBatis动态SQL语句的编写与调试
    MyBatis是一个支持动态SQL语句的持久层框架,可以根据不同的条件来动态生成SQL语句,从而实现灵活的数据库操作。下面是关于My...
    99+
    2024-05-08
    MyBatis
  • MyBatis动态SQL编写的方法是什么
    MyBatis动态SQL编写的方法有以下几种:1. 使用XML配置文件:可以在XML配置文件中使用if、choose、when、ot...
    99+
    2023-09-29
    MyBatis SQL
  • MyBatis动态SQL与缓存原理是什么
    今天小编给大家分享一下MyBatis动态SQL与缓存原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态SQL为什么...
    99+
    2023-07-05
  • mybatis二级缓存的实现代码
    二级缓存需要手动的配置和开启,具体如下在总的配置件中设置开启二级缓存/Mybatis02/config/mybatis-conf.xml<?xml version="1.0" encoding="UTF-8" ?>...
    99+
    2023-05-31
    mybatis 二级缓存 实现代码
  • 关于mybatis的一级缓存和二级缓存的那些事儿
    目录一、缓存是什么二、为什么需要缓存三、哪些数据会放到缓存四、mybatis一级缓存五、二级缓存六、注意事项一、缓存是什么 缓存其实就是存储在内存中的临时数据,这里的数据量会比较小,...
    99+
    2024-04-02
  • MyBatis 动态SQL和缓存机制实例详解
    有的时候需要根据要查询的参数动态的拼接SQL语句常用标签:- if:字符判断- choose【when...otherwise】:分支选择- trim【where,set】:字符串截取,其中where标签封装查询条件,s...
    99+
    2023-05-31
    mybatis 动态sql 缓存机制
  • Mybatis的一级缓存和二级缓存原理分析与使用
    目录Mybatis的一级缓存和二级缓存1 Mybatis如何判断两次查询是完全相同的查询2 二级缓存2.1 二级缓存配置2.2 二级缓存特点2.3 配置二级缓存2.4 测试Mybat...
    99+
    2024-04-02
  • mybatis二级缓存的原理是什么
    MyBatis的二级缓存是指缓存在SqlSessionFactory级别的缓存,可以被多个SqlSession共享。其原理如下:1....
    99+
    2023-10-09
    mybatis
  • Java之Mybatis的二级缓存怎么使用
    本文小编为大家详细介绍“Java之Mybatis的二级缓存怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java之Mybatis的二级缓存怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。缓存的概述...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作