MyBatis的学习————下篇

目录

一、动态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>@Testpublic 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>@Testpublic 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两次查询期间手动清空了缓存

    @Testpublic 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、查询的数据所转换的实体类类型必须实现序列化的接口

失效情况:

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

    @Testpublic 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>
    @Testpublic 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.rhkb.cn/news/412335.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【滑动窗口法解决子数组,子串问题】

前言 在leetCode题解中看到一位大佬针对滑动窗口法解决子数组&#xff0c;子串问题的总结&#xff0c;觉得总结的非常好&#xff0c;成功地将滑动窗口法变成了默写题&#xff0c;在这里学习记录一下。 适用于 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词…

WPF- vs中的WPF应用项目模板 如何自己实现

读书笔记 1. 单个 c#文件的 空白window应用程序 (只展示了一个button按钮) 2.C#文件 和xml文件 的空白window程序 .xml文件作为程序的资源 (只一个button按钮) 3. xmal和c#共同编译 形如使用VS 创建WPF应用项目模板 1.新建一个wpf空白项目 ,添加一个主c#文件 和xaml文件(属…

手算神经网络MAC和FLOP

在本文中&#xff0c;我们将深入探讨神经网络背景下的 MAC&#xff08;乘法累加运算&#xff09;和 FLOP&#xff08;浮点运算&#xff09;概念。通过学习如何使用笔和纸手动计算这些内容&#xff0c;你将对各种网络结构的计算复杂性和效率有基本的了解。 这是 colab 笔记本中…

Java语言程序设计基础篇_编程练习题*17.13 (带GUI的组合文件工具)

目录 题目&#xff1a;*17.13 (带GUI的组合文件工具) 代码示例 结果展示 题目&#xff1a;*17.13 (带GUI的组合文件工具) 改写编程练习题17.12使之带有GUI&#xff0c;如图1721b所示 可以使用编程练习题17.11的GUI代码和编程练习题17.12的程序代码&#xff1a; Java语言…

linux系统使用 docker 来部署运行 mysql5.7 并配置 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

SpringMVC 笔记篇

1.1 执行流程 1.1.5 DispatcherServlet的init()——> 创建Spring容器 ——> initStrategies()方法 在1.1.4中DispatcherServlet中的init()方法创建Spring容器之外&#xff0c;其实还会做一件特别重要的事&#xff0c;在FrameworkServlet中的refresh()方法执行之前&…

景联文科技提供运动数据采集服务

运动数据的重要性 运动数据的收集与分析对于提升个人健康管理和运动表现具有重要意义。 通过收集心率、步态、速度等生理和运动参数&#xff0c;不仅可以为运动员提供个性化的训练方案&#xff0c;帮助其优化表现&#xff0c;还能早期发现并预防伤病。对于普通健身者而言&…

CSS溢出——WEB开发系列20

在网页设计中&#xff0c;“溢出”是一个常见且重要的概念。它涉及到如何处理那些超出预定范围的内容&#xff0c;以确保网页的布局和视觉效果达到预期。 一、什么是溢出&#xff1f; 在 CSS 中&#xff0c;“溢出”&#xff08;overflow&#xff09;指的是内容超出其包含块的…

python-pptx - Python 操作 PPT 幻灯片

文章目录 一、关于 python-pptx设计哲学功能支持 二、安装三、入门1、你好世界&#xff01;例子2、Bullet 幻灯片示例3、add_textbox()示例4、add_picture()示例5、add_shape()示例6、add_table()示例7、从演示文稿中的幻灯片中提取所有文本 四、使用演示文稿1、打开演示文稿2、…

Marscode:程序员的智能伙伴,2024 活动震撼来袭

在程序员的世界里&#xff0c;高效的开发工具如同手中的利器&#xff0c;能让我们在代码的海洋中披荆斩棘。今天&#xff0c;我要向大家隆重介绍一款强大的智能开发工具——Marscode&#xff0c;以及它带来的精彩 2024 活动。 一、Marscode&#xff1a;智能开发的新势力 Mars…

SQLite的安装和使用

一、官网链接下载安装包 点击跳转 步骤&#xff1a;点击安装这个红框的dll以及红框下面的tools &#xff08;如果有navicat可以免上面这个安装步骤&#xff0c;安装上面这个是为了能在命令行敲SQL而已&#xff09; 二、SQLite的特点 嵌入的&#xff08;无服务器的&#x…

【机器学习】 7. 梯度下降法,随机梯度下降法SGD,Mini-batch SGD

梯度下降法,随机梯度下降法SGD,Mini-batch SGD 梯度下降法凸函数(convex)和非凸函数梯度更新方向选择步长的选择 随机梯度下降SGD(Stochastic Gradient Descent)梯度下降法&#xff1a;SGD: Mini-batch SGD 梯度下降法 从一个随机点开始决定下降方向&#xff08;重要&#xff…

基于PHP+MySQL组合开发的微信投票小程序 带完整的安装代码包以及搭建教程

系统概述 这款基于 PHPMySQL 组合开发的微信投票小程序是一款专门为满足各类投票需求而设计的应用程序。它利用 PHP 强大的服务器端编程能力和 MySQL 高效的数据存储和管理能力&#xff0c;为用户提供了一个稳定、可靠、功能丰富的投票平台。 该小程序支持多种投票类型&#…

centos安装docker并配置加速器

docker安装与卸载&#xff1a; 1、检查当前是否安装docker yum list installed | grep docker2、卸载docker 根据yum list installed | grep docker查询出来的内容&#xff0c;逐个进行删除 yum remove docker.x86 64 -y3、启动与关闭docker 4、删除/etc/docker文件夹 如果…

jmeter 响应乱码

Jmeter在做接口测试的时候的&#xff0c;如果接口响应的内容中有中文&#xff0c;jmeter的响应内容很可能显示乱码&#xff0c;为了规避这种出现乱码的问题&#xff0c;就要对jmeter的响应结果进行编码处理。 打开jmeter进行接口、压力、性能等测试&#xff0c;出现以下乱码问…

Java短剧系统新生态智能系统打造个性化影视体验小程序源码

短剧新生态&#xff0c;智能系统打造个性化影视体验✨&#x1f3ac; &#x1f389; 开篇&#xff1a;短剧新纪元&#xff0c;个性化体验来袭 在这个快节奏的时代&#xff0c;短剧以其精炼的剧情和高效的传播力&#xff0c;正逐渐成为影视娱乐的新宠儿&#xff01;&#x1f38…

如何恢复删除的微信好友?不留遗憾,这5招教你找回

在社交生活中&#xff0c;微信成为了我们日常沟通的重要工具之一。然而&#xff0c;偶尔因一时冲动或误操作删除了重要好友&#xff0c;当我们想找回好友时是否也在懊悔呢&#xff1f;如何恢复删除的微信好友就成为了我们必须学会的技能。那么&#xff0c;今天我们就来分享5种高…

10、ollama启动LLama_Factory微调大模型(llama.cpp)

在前面章节中介绍了如何使用LLama_Factory微调大模型&#xff0c;并将微调后的模型文件合并导出&#xff0c;本节我们我们看下如何使用ollama进行调用。 1、llama.cpp LLama_Factory训练好的模型&#xff0c;ollama不能直接使用&#xff0c;需要转换一下格式&#xff0c;我们…

STM32G474之TIM1更新中断

STM32G474之TIM1能产生如下的中断&#xff1a; 1、捕获比较1个事件&#xff08;Capture compare 1 event&#xff09; 用来获取“捕获输入脉冲的时间”&#xff0c;其次用来输出“比较输出波形”&#xff1b; 2、捕获比较2个事件&#xff08;Capture compare 2 event&#x…

【HTML源码】上传即可使用的在线叫号系统源码

这个叫号系统的过程是这样的 接了一个任务&#xff0c;某学校要对学生进行逐个面试&#xff0c;希望能有类似医院门诊那种叫号系统。 条件&#xff1a;首先说硬件&#xff0c;就是教室里边一台笔记本电脑&#xff0c;同屏到教室外面的电视机。 需求&#xff1a;软件需求是可…