mybatis:动态sql【2】+转义符+缓存

目录

一、动态sql

1.set、if

2.foreach

二、转义符

三、缓存cache

[1. 一级缓存](#1. 一级缓存)

[2. 二级缓存](#2. 二级缓存)


一、动态sql

1.set、if

在update语句中使用set标签,动态更新set后的sql语句,,if作为判断条件。

XML 复制代码
    <update id="updateStuent" parameterType="Student">
        update student
        <set>
            <if test="num!=0">num=#{num},</if>
            <if test="name!=null">name=#{name},</if>
            <if test="gender!=0">gender=#{gender}</if>
        </set>
        where id = #{id}
    </update>

2.foreach

foreach对集合进行遍历,尤其是in条件语句

XML 复制代码
    <delete id="deleteStudents" parameterType="list" >
        delete from student where id in
        <foreach collection="list" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </delete>

collection 是传入参数名,item为元素名,separator代表元素之间的间隔符。

详细动态sql可查看官网 :mybatis -- MyBatis 3 | 动态 SQL

二、转义符

1.在 mybatis 中的 xml 文件,一些特殊符号需要转译:

|------|---------|
| 特殊字符 | 转译字符 |
| < | &lt; |
| " | &quot; |
| ' | ' |
| & | &amp; |
| > | &gt; |

2.使用<![CDATA[]]>

通过<![CDATA[ 特殊字符 ]]>包裹特殊字符也可以

XML 复制代码
    <!--转义字符   " <" 号会报错,">" 号不会报错  -->
    <select id="findstuTurn" resultType="Student">
        select id,num,gender from student where num &lt; 1000
    </select>

    <select id="findstuTurn2" resultType="Student">
        select id,num,gender from student where num <![CDATA[ < ]]> 1000
    </select>

注意:

  1. " <" 号会报错,">" 号不会报错;
  2. 如果<![CDATA[ ]]> 里有<if> </if> <where> </where><choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小<![CDATA[ ]]>的范围。

三、缓存cache

缓存作用:让程序更快的访问数据,减少对数据库的访问压力。

缓存原理:从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中,当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。

mybatis有两种缓存方式:

1. 一级缓存

在同一个SqlSession中执行相同的sql且参数也相同(完全相同的sql查询),第二次查询时,直接从sqlSession中获取,而不再从数据库中获取。 在没有默认配置情况下,mybatis开启一级缓存。

例如:

java 复制代码
     @Test
     void testCache(){
        SqlSession sqlSession = MybatisUtil.getSqlsession();
        StudentDao studentDao =  sqlSession.getMapper(StudentDao.class);

        List<Student> students = studentDao.findstuTurn();
        System.out.println(students);

        List<Student> student2= studentDao.findstuTurn();
        sqlSession.commit();
        sqlSession.close();
    }

日志中只显示一条查询

一级缓存失效:

  1. sqlSession.close();
  2. sqlSession.clearCache();
  3. SqlSession 中执行了任何一个修改操作(update()、delete()、insert()) ,都会清空缓存的数据。

2. 二级缓存

二级缓存是 SqlSessionFactory 级别的,数据存放在SqlSessionFactory中。

需要手动启动:

1.在核心配置文件中开启二级缓存:

XML 复制代码
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>

2.将 POJO 类实现序列化接口:

implements Serializable

3.在mapper映射文件中添加cache标签,表示此mapper开启二级缓存:

XML 复制代码
    <cache flushInterval="100000" ></cache>

flushInterval可以设置刷新时间(缓存失效)

当 SqlSeesion 关闭时,会将数据存入到二级缓存。

示例:

java 复制代码
    @Test
    void testCache1(){
        SqlSession sqlSession = MybatisUtil.getSqlsession();
        StudentDao studentDao =  sqlSession.getMapper(StudentDao.class);

        List<Student> students = studentDao.findstuTurn();
        System.out.println(students);
        sqlSession.commit();
        //sqlSession关闭
        sqlSession.close();
        

        SqlSession sqlSession2 = MybatisUtil.getSqlsession();
        StudentDao studentDao2 =  sqlSession2.getMapper(StudentDao.class);

        List<Student> students2 = studentDao2.findstuTurn();
        System.out.println(students2);
        sqlSession2.commit();
        sqlSession2.close();
    }

结果只查询一次:

相关推荐
okseekw12 分钟前
Java 字符串三巨头:String、StringBuilder、StringJoiner —— 初学者避坑指南 🤯
java
Z***G47912 分钟前
【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
数据库·mysql
毕设源码余学姐22 分钟前
计算机毕设 java 中医药药材分类采购网站 SSM 框架药材交易平台 Java 开发的分类采购与订单管理系统
java·开发语言·课程设计
BD_Marathon27 分钟前
【JUC】并发与并行
java
aml258__27 分钟前
MySQL 数据库管理入门:从创建到删除(T1)
数据库·mysql·oracle·初学数据库
okseekw39 分钟前
Java String类详解:不可变性、创建方式与比较方法
java
q***649740 分钟前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
beata44 分钟前
MySQL 索引你真的用对了吗?
mysql
忘记9261 小时前
mybatis是什么
数据库·oracle·mybatis
q***92511 小时前
Springboot3 Mybatis-plus 3.5.9
数据库·oracle·mybatis