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

结果只查询一次:

相关推荐
wjm04100624 分钟前
C++日更八股--first
java·开发语言·c++
ABCDEEE733 分钟前
人事管理系统6
windows·sql·mybatis
wei3872452321 小时前
java练习2
java·开发语言·python
nomi-糯米1 小时前
Mybatis-plus代码生成器的创建使用与详细解释
数据库·mysql·mybatis
heyCHEEMS1 小时前
[USACO09OCT] Bessie‘s Weight Problem G Java
java·开发语言·算法
兔子蟹子2 小时前
JAVA中Spring全局异常处理@ControllerAdvice解析
java·spring
prinrf('千寻)2 小时前
项目右键没有add as maven project选项
java·maven
工业互联网专业2 小时前
基于springboot+vue的健康健身追踪系统
java·vue.js·spring boot·毕业设计·源码·课程设计·健康健身追踪系统
杰仔正在努力2 小时前
Java + Seleium4.X + TestNG自动化技术
java·开发语言·自动化
默心3 小时前
CentOS环境下搭建seata(二进制、MySQL)
linux·mysql·centos