MyBatis 03 -MyBatis动态SQL与分页插件
动态SQL与分页插件
动态SQL与分页插件
- 动态SQL与分页插件
- 1 动态SQL
- 1.1 < sql >
- 1.2 < if >
- 1.3 < where >
- 1.4 < set >
- 1.5 < choose >
- 1.6 < trim >
- 1.7 < foreach >
- 2 mybatis缓存
- 2.1 一级缓存
- 2.2 二级缓存
- 3 分页插件
- 3.1 概念
- 3.2 访问与下载
- 3.3 开发步骤
- 3.3.1 引入依赖
- 3.3.2 配置MyBatis-config.xml
- 3.3.3 PageHelper使用
- 3.4 PageInfo对象
- 3.4.1 PageInfo应用方式
1 动态SQL
MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。
- 动态查询 where标签和if标签组合使用
- 动态修改
1.1 < sql >
sql标签的作用是提取公共的sql代码片段
- sql id属性:唯一标识
- include refid属性:参照id
<!-- 定义SQL片段:抽取公共的SQL语句 -->
<sql id="product_col">p_id pid,t_id tid ,p_name name ,p_time time ,p_image image,p_price price, p_info info , isdel,p_state state
</sql>
<select id="selectAll" resultType="product">select <include refid="product_col"/> from product
</select>
动态查询
1.2 < if >
if标签的作用适用于条件判断
<if test="判断条件"> 在test属性中获取对象属性值的时候,不需要#{} </if>
- test 属性:判断条件(必填)
<!--if标签用于判断使用注意:1、在test中获取属性值的时候,不需要加上#{},在sql语句中获取属性值要加上#{}2、在sql语句中进行使用特殊字符,最好不要使用 > 或者 <,应该使用 > <
-->
<select id="selectByCondition" resultType="product">select <include refid="productSql"/> from product where 1 = 1<if test="name != null">and p_name like concat('%',#{name},'%')</if><if test="time != null">and p_time > #{time}</if><if test="price != null">and p_price > #{price}</if><if test="state != null">and p_state > #{state}</if>
</select>
1.3 < where >
where 标签作用是添加where条件。一般和if标签配合使用
- 如果没有条件,不会加上where。
- 会自动去掉前的and、or、not等关键字
<!--where标签用于添加where条件特点:1、如果where有条件自动加上where关键字,如果没有则不会where关键字2、会自动去除前面的and或者or等关键字
-->
<select id="selectByCondition" resultType="product">select <include refid="productSql"/> from product<where><if test="name != null">and p_name like concat('%',#{name},'%')</if><if test="time != null">and p_time > #{time}</if><if test="price != null">and p_price > #{price}</if><if test="state != null">and p_state > #{state}</if></where>
</select>
1.4 < set >
set 标签的作用是添加set,与where类似
<!-- set标签用于添加修改的字段值特点:1、如果set有条件自动加上set关键字,如果没有则不会set关键字2、会自动去除后面的,-->
<update id="updateByCondition">update product<set><if test="name != null">p_name = #{name},</if><if test="time != null">p_time = #{time},</if><if test="state != null">p_state = #{state},</if><if test="price != null">p_price = #{price},</if>p_id = #{pid}</set>where p_id = #{pid}
</update>
1.5 < choose >
choose标签作用是条件选择。类似于Java中的多重if
- choose 、when 、otherwise
<!--choose、when、otherwise标签用于多值判断使用类似于java中的switch...case
-->
<select id="selectOrderByCondition" resultType="product">select <include refid="productSql"/> from product order by<choose><when test="price != null">p_price desc</when><when test="time != null">p_time desc</when><when test="state != null">p_state desc</when><otherwise>p_id desc</otherwise></choose>
</select>
1.6 < trim >
< trim prefix=“” suffix=“” prefixOverrides=“” suffixOverrides=“” >代替< where > 、< set >
- prefix 前缀
- suffix 后缀
- prefixOverrides 前缀覆盖
- suffixOverrides 后缀覆盖
<!--trim:用灵活的定义任意的前缀和后缀,以及覆盖多余前缀和后缀
-->
<update id="updateByCondition">update product<trim prefix="set" suffixOverrides=","><if test="name != null">p_name = #{name},</if><if test="time != null">p_time = #{time},</if><if test="state != null">p_state = #{state},</if><if test="price != null">p_price = #{price},</if>p_id = #{pid}</trim>where p_id = #{pid}
</update>
1.7 < foreach >
foreach 标签的作用是遍历集合或者数组
参数 | 描述 | 取值 |
---|---|---|
collection | 容器类型 | list、array、map(可以在形参上加注解改变名称) |
open | 起始符 | ( |
close | 结束符 | ) |
separator | 分隔符 | , |
index | 下标号 | 从0开始,依次递增 |
item | 当前项 | 任意名称(循环中通过 #{任意名称} 表达式访问) |
案例1:批量增加
<!-- insert into 表名 (字段名1,字段名2,...) values (值1,...),(值1,...) ,(值1,...) -->
<insert id="insertProduct">insert into product (p_name,p_time,p_state,p_price) values<foreach collection="productList" item="product" separator=",">(#{product.name},#{product.time},#{product.state},#{product.price})</foreach>
</insert>
案例2:批量删除
<!-- delete from 表名 where p_id in (id1,id2,..) -->
<delete id="deleteProduct">delete from product where p_id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach>
</delete>
2 mybatis缓存
mybatis一共有两级缓存,分别是一级缓存和二级缓存。默认开启了一级缓存
2.1 一级缓存
一级缓存是mybatis中默认开启的
生命周期:在同一个SqlSession下
- 一级缓存何时生效
- 默认生效
- 一级缓存何时失效
- 1、两次查询使用不是同一个SqlSession
- 2、手动将缓存清空
- 3、当sqlSession关闭之后
- 4、当两次查询操作中间,如果执行了增删改的操作,缓存失效
2.2 二级缓存
mybatis中二级缓存是需要手动开启
生命周期: 二级缓存是在namespace级别
- 二级缓存生效:
- 1、在主配置文件中开启二级缓存
- 2、在mapper映射文件中添加标签
- 3、在查询之间,SqlSession需要提交
- 4、如果没有缓存配置,那么这个类需要实现序列化接口
- 二级缓存失效
- 1、当两次查询操作中间,如果执行了增删改的操作,二级缓存失效
开启二级缓存
<configuration><!-- 开启二级缓存(当前这个版本是默认开启的) --><settings><setting name="cacheEnabled" value="true"/></settings>...
</configuration>
mapper映射配置缓存
<!--eviction:缓存淘汰策略 FIFO(先进先出) LRU(最近最少使用)flushInterval:缓存的刷新时间size:缓存的大小readOnly:缓存只读
-->
<cache eviction="LRU"flushInterval="60000"size="512"readOnly="true"/>
3 分页插件
3.1 概念
PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。
3.2 访问与下载
官方网站:https://pagehelper.github.io/
下载地址:https://github.com/pagehelper/Mybatis-PageHelper
3.3 开发步骤
3.3.1 引入依赖
pom.xml中引入PageHelper依赖。
<!-- 引入分页插件依赖 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.10</version>
</dependency>
3.3.2 配置MyBatis-config.xml
在MyBatis-config.xml中添加< plugins >。
<configuration><typeAliases></typeAliases><plugins><!-- 添加分页拦截器查询 --><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins><environments>...</environments>
</configuration>
3.3.3 PageHelper使用
@Test
public void test01() throws IOException {SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();SqlSessionFactory sf = sfb.build(Resources.getResourceAsReader("mybatis-config.xml"));SqlSession sqlSession = sf.openSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);//在查询之前执行!!!!PageHelper.startPage(3,3);List<Emp> empList = empMapper.getAll();PageInfo pageInfo = new PageInfo(empList);//empList.stream().forEach(System.out::println);System.out.println(pageInfo);
}
3.4 PageInfo对象
PageInfo对象中包含了分页操作中的所有相关数据。
PageInfo结构图 |
---|
![]() |
3.4.1 PageInfo应用方式
使用PageInfo保存分页查询结果。
/*** 分页插件(物理分页 (sql语句中添加limit))* 1、导入pageHelper依赖* 2、在mybatis核心配置文件中添加插件(配置分页拦截器)* 3、在执行查询操作之前执行 PageHelper.startPage(当前页,每页条数)* 4、如果要获取完整结果,创建一个PageInfo对象即可(PageInfo pageInfo = new PageInfo(empList);)*///创建一个分页信息类
PageInfo<Product> pageInfo = new PageInfo<>(productList);
相关文章:

MyBatis 03 -MyBatis动态SQL与分页插件
动态SQL与分页插件 动态SQL与分页插件 动态SQL与分页插件1 动态SQL1.1 < sql >1.2 < if >1.3 < where >1.4 < set >1.5 < choose >1.6 < trim >1.7 < foreach > 2 mybatis缓存2.1 一级缓存2.2 二级缓存 3 分页插件3.1 概念3.2 访问与…...
4.10、字节序列转换函数
4.10、字节序列转换函数 1.字节序转换函数2.字节序转换函数有哪些3.字节序转换函数的使用 1.字节序转换函数 当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之。解决问题的方法是:发送端总是把要发送的数据转换成大端字…...

研究LLMs之前,不如先读读这五篇论文!
目标:了解 LMM 背后的主要思想 ▪️ Neural Machine Translation by Jointly Learning to Align and Translate ▪️ Attention Is All You Need ▪️ BERT ▪️ Improving Language Understanding by Generative Pre-Training ▪️ BART Neural Machine Translati…...

认识BASH这个Shell
文章目录 认识BASH这个Shell硬件、内核与shell为什么要学命令行模式的Shell?Bash Shell的功能命令与文件补全(TAB)命令别名设置(alias)历史命令(history)任务管理、前台、后台控制(jobs,fg,bg)通配符程序化脚本 查询命令是否为Bash shell 的内…...

用SQL语句操作Oracle数据库——数据更新
数据更新 数据库中的数据更新操作有3种:1)向表中添加若干行数据(增);2)删除表中的若干行数据(删);3)修改表中的数据(改)。对于这3种操作…...

二维码+互联网云技术在中建二局施工项目管理中的应用实践
中建二局(全称:中国建筑第二工程局有限公司)是世界500强企业—中国建筑股份有限公司的全资子公司,是集房建、基建、核电、火电、风电等多种建设和投资相融合的、国内最具综合实力的大型国有企业集团公司。中建二局具有土木建筑、设…...

扩散模型原理记录
1 扩散模型原理记录 参考资料: [1]【54、Probabilistic Diffusion Model概率扩散模型理论与完整PyTorch代码详细解读】 https://www.bilibili.com/video/BV1b541197HX/?share_sourcecopy_web&vd_source7771b17ae75bc5131361e81a50a0c871 [2] https://t.bili…...
Metasploit高级技术【第九章】
预计更新第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Met…...

RK3568平台开发系列讲解(调试篇)IS_ERR函数的使用
🚀返回专栏总目录 文章目录 一、IS_ERR函数用法二、IS_ERR函数三、内核错误码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 IS_ERR 函数的使用。 一、IS_ERR函数用法 先看下用法: 二、IS_ERR函数 对于任何一个指针来说,必然存在三种情况: 一种是合…...

TouchGFX界面开发 | TouchGFX软件安装
TouchGFX软件安装 TouchGFX和STemWin类似,都是一个GUI框架,可以方便的在STM32 Cortex-M4 以及更高级别的STM32芯片上创建GUI应用程序。 本文中的TouchGFX软件安装,是基于已经安装有STM32CubeMX Keil MDK-ARM开发环境的情况下进行的&#x…...

使用 IDEA 远程 Debug 调试
背景 有时候我们需要进行远程的debug,本文研究如何进行远程debug,以及使用 IDEA 远程debug的过程中的细节。看完可以解决你的一些疑惑。 配置 远程debug的服务,以springboot微服务为例。首先,启动springboot需要加上特定的参数。…...
红黑树和平衡二叉树的优缺点及应用场景
红黑树和平衡二叉树都是为了解决二叉搜索树的缺陷而提出的自平衡二叉树结构。它们的优缺点和应用场景如下: 红黑树: 优点: 时间复杂度为O(logN),可以快速查找、插入和删除。 红黑树具有良好的平衡性,树的高度保持较小,因此查找效率较高。 缺点: 实现比较复杂,需要遵守红黑树的…...

软文推广:真实有效提升软文排名与收录的三大方法!
软文是一种具有良好传播效果的文体,可以通过在搜索引擎中排名靠前的方式,为品牌或企业带来更多曝光。但是,如何让软文在搜索引擎中得到更好的收录和排名呢?在本文中,我们将讨论如何提升软文的收录和排名,以…...
SElinux的介绍及配置
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统 SELinux安全增强型Linux系统,是Linux内核子系统,旨在最大限度的减少服务进程对文件、端口等资源…...
vscode-python环境配置
vscode-python环境配置 1、环境基础 下载vscode找到python插件并安装安装python环境并配置环境变量 2、选择python解释器 尝试执行了一下,直接运行py文件,会使用c的调试工具,需要告诉vscode哪些是python Ctrl Shift P打开命令面板 执行…...

问卷调查样本量的确定方法
我们在进行问卷调查的时候,问卷的收集数量是重要的流程之一。问卷数量取决于几个因素,包括研究的目的和研究的类型。接下来,我们就聊一聊怎么确定所需的调查问卷数量。 1、确定研究目标。 确定所需问卷数量的第一步是明确研究目标。这一步是…...
ios客户端学习笔记(三):学习Swift的设计模式
设计模式是指在软件开发中常用的一些解决问题的方法和思想,它可以帮助你更好地组织代码和提高代码的可维护性。你需要学习常见的设计模式,如MVC、MVVM、单例模式、工厂模式等,在开发应用程序时应用它们。 当你学习常见的设计模式时ÿ…...

406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 peopl…...

ESP32使用ESP-NOW协议实现一对多通信和MAC地址存储
目录 介绍ESP-NOW 协议概述在 ESP32 上配置 ESP-NOW使用 ESP-NOW 进行一对多通信在 ESP32 上存储发件人的 MAC 地址代码结论 介绍 ESP32 是一款功能强大的 Wi-Fi 和蓝牙双模模块,可用于使用 ESP-NOW 协议实现低功耗、高效率的一对多通信。本文将介绍如何使用ESP-NO…...

Qt 学生信息数据库管理
1 添加样式表 我们采用了样式表 通过添加Qt resources文件 添加前缀 添加文件,将我们的图标进行添加 2 拖动部件 用到的部件 Label 标签Pushbutton 按钮table view 视图LineEdit 输入框 3 程序编写 1 配置sql环境 在 pro文件中 添加 连接数据库跟访问数据…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...