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

结果只查询一次:

相关推荐
My is 李豆11 分钟前
CentOS 7 安装 MySQL 详细教程
mysql·centos
Menior_1 小时前
【MySQL】基本查询
数据库·mysql
励志码农2 小时前
JavaWeb 30 天入门:第二十三天 —— 监听器(Listener)
java·开发语言·spring boot·学习·servlet
@小匠2 小时前
Spring Cache 多租户缓存隔离解决方案实践
java·spring·缓存
北城以北88883 小时前
数据库--MySQL数据管理
数据库·mysql
智码看视界3 小时前
老梁聊全栈系列:(阶段一)架构思维与全局观
java·javascript·架构
大白的编程日记.3 小时前
【MySQL】数据库的基本操作
数据库·mysql·oracle
黎宇幻生3 小时前
Java全栈学习笔记33
java·笔记·学习
BillKu6 小时前
推荐 Eclipse Temurin 的 OpenJDK
java·ide·eclipse