文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-22 12:25

关注

❤️作者主页:微凉秋意
✅作者简介:后端领域优质创作者🏆,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>

编写测试类:

在这里插入图片描述

测试结果:
在这里插入图片描述
很明显,年龄在 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>

值得注意的是: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 标签相关解释:

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

在这里插入图片描述

测试结果:

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

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 ,也就是一个事务内,一旦提交事务,缓存就会被清空,没有实战意义。

二级缓存

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

  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)

作用范围:

脏数据的处理:

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

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


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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯