MyBatis的学习————下篇

news2025/2/24 6:05:19

目录

一、动态SQL

简介

1、if标签 

2、where标签

 3、trim标签

 4、choose、when、otherwise

5、foreach

5.1、批量删除

5.2、批量添加

6、sql标签

二、MyBatis的缓存 

1、一级缓存

 2、二级缓存

3、二级缓存的相关配置

 4、MyBatis缓存查询的顺序

5、 第三方缓存EHCache

三、MyBatis逆向工程

四、分页插件

1、添加依赖

2、配置分页插件

五、注解开发 


一、动态SQL

简介

MyBatis框架的动态SQL技术是一种根据特定条件动态拼接SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题

1、if标签 

根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中

//多条件查询
    List<TbStudent> findTbStudentByCondition(TbStudent tbStudent);

    <select id="findTbStudentByCondition" resultType="tbStudent">
        select * from tb_student where 1=1
        <if test="stuName != null and stuName != ''">
            and stu_name = #{stuName}
        </if>
        <if test="stuAge != null">
            and stu_age = #{stuAge}
        </if>
    </select>


    @Test
    public void testFindTbStudentByCondition(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
        List<TbStudent> list = mapper.findTbStudentByCondition(new TbStudent(null, null, 12));
        System.out.println(list);
    }

2、where标签

当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉

当where标签中没有内容时,此时where标签没有任何效果,也就是不会生成where标签

注意:where标签不能将其中内容后面多余的and或or去掉

    <select id="findTbStudentByCondition" resultType="tbStudent">
        select * from tb_student
        <where>
            <if test="stuName != null and stuName != ''">
                and stu_name = #{stuName}
            </if>
            <if test="stuAge != null">
                and stu_age = #{stuAge}
            </if>
        </where>
    </select>

 3、trim标签

若标签中有内容时:

prefix|suffix:将trim标签中内容前面或后面添加指定内容

prefixOverrides|suffixOverrides:将trim标签中内容前面或后面去掉指定内容

若标签中没有内容时,trim标签也没有任何效果

    <select id="findTbStudentByCondition" resultType="tbStudent">
        select * from tb_student
        <trim prefix="where" suffixOverrides="and|or">
            <if test="stuName != null and stuName != ''">
                 stu_name = #{stuName} and
            </if>
            <if test="stuAge != null">
                 stu_age = #{stuAge} and
            </if>
        </trim>
    </select>

 4、choose、when、otherwise

when至少要有一个,otherwise最多只能有一个

    <select id="findStudentCondition" resultType="tbStudent">
        select * from tb_student
        <where>
            <choose>
                <when test="stuName != null and stuName != ''">
                    stu_name = #{stuName}
                </when>
                <when test="stuAge != null">
                    stu_age = #{stuAge}
                </when>
                <otherwise>
                    id = 1
                </otherwise>
            </choose>
        </where>
    </select>

5、foreach

collection:设置需要循环的数组或集合

item:标识数组或集合中的每一个数据

separator:循环体之间的分隔符

open:foreach标签所循环的所有内容的开始符

close:foreach标签所循环的所有内容的结束符

5.1、批量删除

    <delete id="deleteMoreByArray">
        delete from tb_student where id in
        <foreach collection="array" open="(" close=")" separator="," item="id">
            #{id}
        </foreach>
    </delete>

<!--    <delete id="deleteMoreByArray">-->
<!--        delete from tb_student where-->
<!--        <foreach collection="array" separator="or" item="id">-->
<!--            id = #{id}-->
<!--        </foreach>-->
<!--    </delete>-->

5.2、批量添加

    //批量添加
    int insertMoreByArray(@Param("list") List<TbStudent> list);
    //int insertMoreByArray(@Param("tbStudents") List<TbStudent> tbStudents);
    //collection="tbStudents"


    <insert id="insertMoreByArray">
        insert into tb_student values
        <foreach collection="list" separator="," item="tbStudent">
            (null,#{tbStudent.stuName},#{tbStudent.stuAge},1)
        </foreach>
    </insert>

    @Test
    public void insertMoreByArray(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
        TbStudent tbStudent1 = new TbStudent(null, "zs", 12);
        TbStudent tbStudent2 = new TbStudent(null, "zs", 12);
        TbStudent tbStudent3 = new TbStudent(null, "zs", 12);
        List<TbStudent> list = Arrays.asList(tbStudent1, tbStudent2, tbStudent3);
        int result = mapper.insertMoreByArray(list);
        System.out.println(result);
    }

6、sql标签

二、MyBatis的缓存 

1、一级缓存

一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问

使一级缓存失效的四种情况:

1、不同的SqlSession对应不同的一级缓存

2、同一个SqlSession但是查询条件不同

3、同一个SqlSession两次查询期间执行了任何一次增删改操作

4、同一个SqlSession两次查询期间手动清空了缓存

    @Test
    public void testCache() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
        //同时查询,只会执行一次sql语句的查询操作
        //一级缓存是默认开启的  SqlSession级别的  和是不是同一个mapper对象也没有关系
        System.out.println(mapper.getStudentById(4));
        //mapper.insert();
        //sqlSession.clearCache();
        System.out.println(mapper.getStudentById(4));
    }

 2、二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取

二级缓存开启的条件:
1、在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,不需要设置
2、在映射文件中设置标签<cache/>

3、二级缓存必须在SqlSession关闭或提交之后有效
4、查询的数据所转换的实体类类型必须实现序列化的接口

失效情况:

两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

    @Test
    public void testTwoCache() throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
        CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
        System.out.println(mapper1.getStudentById(4));
        sqlSession1.close();

        SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
        CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);
        System.out.println(mapper2.getStudentById(4));
        sqlSession2.close();
    }

3、二级缓存的相关配置

在mapper配置文件中添加的cache标签可以设置一些属性:


eviction属性:缓存回收策略

LRU(Least Recently Used) ——最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out)——先进先出:俺对象进入缓存的顺序来移除他们

SOFT——软使用:移除基于垃圾回收器状态和软引用规则的对象

WEAK——弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象

默认是LRU


flushInterval属性:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

size属性:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出

readOnly属性:只读,true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。

false:读写缓存;会返回缓存对象的拷贝数据(通过序列化)。这会慢一些,但是安全,因此默认是false

 4、MyBatis缓存查询的顺序

  • 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
  • 如果二级缓存没有命中,在查询一级缓存
  • 如果一级缓存也没有命中,则查询数据库
  • SqlSession关闭之后,一级缓存中的数据会写入二级缓存

5、 第三方缓存EHCache

可以参考这位up主的文章:mybatis第三方缓存-EhCache

三、MyBatis逆向工程

MyBatis逆向工程是指使用MyBatis Generator(MBG)等工具,根据数据库表结构自动生成MyBatis框架所需的Java代码和映射文件的过程。逆向工程可以提高开发效率,通过自动生成代码,避免了手动编写实体类、映射文件和DAO接口的重复性工作,大大缩短了项目开发周期。并且能够减少出错概率。手动编写代码时容易出错,特别是在处理复杂的数据库表结构时。逆向工程自动生成的代码可以减少拼写错误和逻辑错误。逆向工程还可以快速适应数据库变更:当数据库表结构发生变化时,通过重新运行逆向工程,可以快速生成新的实体类和映射文件,使代码与数据库保持同步


可以自己去查一下,这里不过多演示

四、分页插件

具体使用可以自己再去查阅以下

1、添加依赖

        <!--pageHelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>

2、配置分页插件

在MyBatis核心配置文件中配置插件

    <plugins>
        <!--设置分页插件-->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>
    @Test
    public void testPageHelper() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
        DynamicSQLMapper mapper = sqlSession1.getMapper(DynamicSQLMapper.class);
        PageHelper.startPage(1,4);
        // 查询所有学生信息
        List<TbStudent> tbStudents = mapper.findTbStudentByCondition(null);
        for (TbStudent tbStudent : tbStudents) {
            System.out.println(tbStudent);
        }
    }

五、注解开发 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Windows 11上关闭无响应的应用程序?这里有详细步骤

序言 无响应的应用程序令人沮丧,但更糟糕的是这些应用程序拒绝关闭。如果你发现自己处于这种情况,我们有几种方法可以帮助你强制关闭Windows 11 PC上的这些应用程序。让我们找出可用的解决方案。 使用键盘快捷键结束程序 关闭无响应应用程序的最简单方法是使用Windows键盘…

DataWhale AI夏令营 2024大运河杯-数据开发应用创新赛-task2

DataWhale AI夏令营 2024大运河杯-数据开发应用创新赛 YOLO(You Only Look Once)上分心得分享 YOLO(You Only Look Once) YOLO算的上是近几年最火的目标检测模型了&#xff0c;被广泛的应用在工业、学术等领域。 YOLOv1&#xff08;You Only Look Once 第一版&#xff09;于 2…

基于麒麟信安操作系统的光伏发电功率预测系统完成大规模部署建设

麒麟信安操作系统&#xff0c;作为行业数智化建设的安全根基&#xff0c;为电力业务系统提供了稳定可靠的底层平台&#xff0c;在全球能源结构转型大潮中扮演着至关重要的角色。某光伏电站项目中&#xff0c;基于麒麟信安操作系统的光伏发电功率预测系统完成大规模部署建设&…

c#如何加密exe程序防止反编译附软件

1. 先说软件&#xff0c;使用的软件是Dotfuscator&#xff0c;下载地址如下&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/6f2e785c003f2. 软件使用方法&#xff0c;打开软件&#xff0c;选择Create New Project 3. 找到input&#xff0c;把你需要加密的文件导入 4.…

k8s项目的发布

目录 三种发布方式 1.蓝绿发布 2.金丝雀发布&#xff08;灰度发布&#xff09; 实验&#xff1a;k8s实现金丝雀发布 3.滚动发布&#xff08;默认形式&#xff09; 因为应用升级以及新旧业务切换&#xff0c;所以在这个过程当中如何保证对外的服务正常是一个非常重要的问题…

手把手教你如何使用Python连接MySQL数据

数据库编程是在应用程序中与数据库交互和管理数据的关键部分。MySQL是一种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;在Python中进行MySQL数据库编程相对容易。 本文介绍如何使用Python进行MySQL数据库编程&#xff0c;包括连接数据库、执行SQL查询…

高频面试题:SpringMVC的执行流程

SpringMVC一直以来都是面试中的重点&#xff0c;尽管随着近年来springboot和微服务的广泛流行&#xff0c;关于对springMVC的考察比重略有下降&#xff0c;但依然是面试中的重点&#xff0c;也需要我们对其有一个比较清楚和全面的认识。 如果将java的发展史中重要的组件进行排…

备忘录模式 详解

备忘录模式 简介: 保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象, 允许在不破坏封装性的前提下&#xff0c;捕获和恢复对象的内部状态。 场景: 很多地方都用到了备忘录模式, 比如网络消息的序列化和反序列化, 数据的本地保存与加载等, 最简单的json的dump和loa…

全能与专精:探索AI模型的未来之路

AI模型&#xff1a;追求全能还是专精&#xff1f; 近日&#xff0c;OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略&#xff0c;"草莓"模型展现出惊人的多样性。而这种全能型 AI 是否代表了未来趋势&#xff1f;相比专攻于某一领域…

OpenAI 将于今年秋天推出新的先进“Strawberry草莓”生成式人工智能产品

今年秋季&#xff0c;OpenAI将推出一款备受瞩目的新型生成式人工智能产品——“草莓”。据悉&#xff0c;这款名为“草莓”的AI程序将带来一系列创新突破&#xff0c;它将大幅提升人工智能处理复杂数学题、执行战略任务以及深入探索各种主题的能力&#xff0c;而这一切无需依赖…

前景堪忧?SaaS巨头Salesforce,25年辉煌后能否继续领跑市场?

最近&#xff0c;时常听到有人说Salesforce失去了活力&#xff0c;这或许是对整个生态系统的普遍感受。多年来&#xff0c;Salesforce一直保持着巨大的发展势头&#xff0c;通过收购、创新和建立良好的合作伙伴关系已发展成为云计算行业巨头。在经历了近25年创纪录的增长和创新…

记Spring HTTP Invoker远程调用的使用(二)基于Servlet方式,配置servlet映射url-pattern实现

目录 前言 一、概念 二、代码实现 1. 服务端实现 2. 客户端实现 前言 本篇接上一篇记Spring HTTP Invoker远程调用的使用&#xff08;一&#xff09;基于Url映射方式&#xff0c;DispatcherServlet统一处理实现-CSDN博客https://blog.csdn.net/u011529483/article/details/141…

论文解读:Prompt-aligned Gradient for Prompt Tuning

摘要 得益于CLIP等大型预训练的视觉语言模型VLM&#xff0c;我们可以通过离散的提示设计构建Zero-shot分类器&#xff0c;例如&#xff0c;利用图像与提示语句" a photo of a [ CLASS ] "之间的相似度&#xff0c;可以获得图像属于某个类别的置信度分数。此外&#…

【Material UI】Select组件的Customization详解

文章目录 一、Customization的基本概念1. 什么是Customization&#xff1f;2. 为什么要定制化Select组件&#xff1f; 二、定制化InputBase组件1. 定制化InputBase的步骤2. 定制化Select组件3. NativeSelect的定制化 三、Customization的最佳实践1. 使用标准变体&#xff08;St…

JAVA后端框架【spring】--超详解

什么是spring? spring是一个轻量级的ioc和Aop的一站式java开发框架&#xff0c;简化企业级开发 轻量级&#xff1a;框架体积小&#xff08;核心模块&#xff09; IOC IOC:inversion of control 控制反转 把创建对象的控制权反转给spring框架 AOP Aop:面向切面编程 将程…

HarmonyOS( Beta5版)鸿蒙开发:应用冷启动与加载绘制首页

应用冷启动即当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用。 应用冷启动过程大致可分成以下四个阶段&#xff1a;应用进程创建&初始化、Application&Ability初始化、Ability生命周期、加载绘制首页。 加载绘…

常用Pandas操作(笔记整理)

目录 一、常用 1、创建DataFrame&#xff08;数据导入&#xff09; 2. 查看数据前⼏⾏&#xff08;head&#xff09; 3. 查看数据后⼏⾏&#xff08;tail&#xff09; 4. 查看数据基本信息&#xff08;info&#xff09; 5. 使⽤ value_counts 计算唯⼀值的频率 6. 描述性…

SpringBoot 3.x+Mybatis Plus多数据源极简配置

1. 创建项目 创建一个名为mybatis-plus-demo的项目&#xff0c;使用MavenJDK17。不会的请看 IntelliJ IDEA快速创建Spring Boot项目&#xff0c;最终项目结构&#xff0c;如下图。 2. 编写代码 根据最终项目结构&#xff0c;从下往上依次列出各个文件的代码。 2.1 pom.xml…

迷雾大陆攻略:VMOS云手机流派辅助和技能加持助力!

在《迷雾大陆》这款游戏中&#xff0c;选择一个合适的流派和技能加点至关重要。使用VMOS云手机&#xff0c;玩家可以享受到专属定制的云手机&#xff0c;内置游戏安装包&#xff0c;无需重新下载安装游戏。同时&#xff0c;VMOS云手机能够24小时不间断运行&#xff0c;自动完成…

STM32(F103ZET6)第二十课:FreeRtos操作系统的应用

目录 调试方式一、任务堆栈溢出检测二、任务管理方式三、二值信号量(任务同步)四、计数信号量五、互斥信号量六、队列 调试方式 问题&#xff1a;传感器数据获取问题&#xff0c;有的DHT11能获取到&#xff0c;有的获取不到 两种方式&#xff1a;调优先级或者进临界区&#xf…