Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(正在更新)

MyBatis 配置深入

核心配置

在这里插入图片描述

动态SQL

动态 SQL 是 MyBatis 的一个重要特性,用于根据条件动态生成不同的 SQL 语句。它允许开发者使用类似编程语言的逻辑结构来构建 SQL,解决了复杂查询条件下 SQL 的拼接问题,提高了开发效率和代码的可读性。
MyBatis 映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL 时动态变化的。

动态 SQL 的用途

  • 灵活性:处理动态变化的查询条件,例如用户界面的表单筛选条件。
  • 避免冗余:可以通过动态语法合并多个类似的 SQL 查询逻辑,减少代码冗余。
  • 提高效率:仅在需要时生成相应的 SQL,避免加载不必要的数据。

在这里插入图片描述

动态 SQL 的注意事项

null 值的处理

MyBatis 不会自动过滤 null 值,需在 SQL 标签中显式判断。

复杂逻辑的可读性

动态 SQL 逻辑过多会导致 XML 文件过于复杂,建议合理拆分。

性能问题

动态生成的 SQL 应尽量减少复杂性,避免影响数据库查询性能。

调试

可以开启 MyBatis 的日志功能,查看生成的 SQL,确保正确性。

参数拼接

我们需要根据实体的不同取值,使用不同的 SQL 语句来进行查询,比如在 ID 如果不为空的时候可以根据 ID 查询,如果 username 不空时还要加入 用户名作为条件,这种情况在我们的多条件组合查询中经常会碰到。

<!-- 查询所有用户信息 -->
<select id="selectList" resultType="icu.wzk.model.UserInfo">SELECT*FROMuser_info<where><if test="username != null and username != ''">and username=#{username}</if><if test="password != null and password != ''">and password=#{password}</if><if test="age != null and age != ''">and age=#{age}</if></where>
</select>

编写的 Mapper 内容如下图所示:
在这里插入图片描述

编写代码, 复用刚才的代码,加入了一些值:

public class WzkIcu05 {public static void main(String[] args) throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);UserInfo userInfo = UserInfo.builder().username("wzk").build();List<UserInfo> dataList = userInfoMapper.selectList(userInfo);dataList.forEach(System.out::println);sqlSession.close();}
}

执行之后,可以看到打印的日志:

24/11/11 15:59:59 DEBUG jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7f010382]
24/11/11 15:59:59 DEBUG UserInfoMapper.selectList: ==>  Preparing: SELECT * FROM user_info WHERE username=?
24/11/11 15:59:59 DEBUG UserInfoMapper.selectList: ==> Parameters: wzk(String)
24/11/11 15:59:59 DEBUG UserInfoMapper.selectList: <==      Total: 1
UserInfo(id=1, username=wzk, password=icu, age=18)

对应的截图如下所示:
在这里插入图片描述

循环拼接

我们在 UserMapper 中添加一个新的方法:


List<UserInfo> selectListByIdList(@Param("idList") List<Integer> idList);

对应的截图如下所示:
在这里插入图片描述

我们编写对应的 Mapper :

<select id="selectListByIdList" parameterType="icu.wzk.model.UserInfo" resultType="icu.wzk.model.UserInfo">SELECT*FROMuser_info<where>id IN<foreach collection="idList" open="(" close=")" separator="," index="index" item="item">#{item}</foreach></where>
</select>

对应的结果截图如下所示:
在这里插入图片描述

我们编写 Java 代码进行测试:

public class WzkIcu06 {public static void main(String[] args) throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);List<Integer> idList = Arrays.asList(1, 2, 3);List<UserInfo> dataList = userInfoMapper.selectListByIdList(idList);dataList.forEach(System.out::println);sqlSession.close();}
}

目前数据库的数据如下(手动写了几条):
在这里插入图片描述
我们运行代码,控制台中输出的日志如下所示:

24/11/11 16:15:16 DEBUG jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6d2a209c]
24/11/11 16:15:16 DEBUG UserInfoMapper.selectListByIdList: ==>  Preparing: SELECT * FROM user_info WHERE id IN ( ? , ? , ? )
24/11/11 16:15:16 DEBUG UserInfoMapper.selectListByIdList: ==> Parameters: 1(Integer), 2(Integer), 3(Integer)
24/11/11 16:15:16 DEBUG UserInfoMapper.selectListByIdList: <==      Total: 3
UserInfo(id=1, username=wzk, password=icu, age=18)

对应的截图如下所示:
在这里插入图片描述
foreach 标签属性如下:

  • collection 要遍历的集合元素,主要不要写 #{}
  • open 语句的开始部分
  • close 语句的结束部分
  • item 集合遍历的每个元素,生成的遍历名
  • sperator 分割符号

片段抽取

SQL 中重复的 SQL 提取出来,使用 include 引用即可,最终达到 SQL 重复使用的目的。
我们在 UserInfoMapper 的接口中添加一个方法:

UserInfo selectOneBySegment(UserInfo userInfo);

对应的截图如下所示:
在这里插入图片描述
编写对应的 XML:

<sql id="SELECT_USER_INFO">SELECT * FROM user_info
</sql><select id="selectOneBySegment" parameterType="icu.wzk.model.UserInfo" resultType="icu.wzk.model.UserInfo"><include refid="SELECT_USER_INFO"></include><where>id=#{id}</where>
</select>

对应的截图如下所示:
在这里插入图片描述

public class WzkIcu07 {public static void main(String[] args) throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserInfoMapper userInfoMapper = sqlSession.getMapper(UserInfoMapper.class);UserInfo userInfo = UserInfo.builder().id(1L).build();userInfo = userInfoMapper.selectOneBySegment(userInfo);System.out.println(userInfo);sqlSession.close();}
}

执行之后,控制台输出结果如下:

24/11/11 17:04:08 DEBUG UserInfoMapper.selectOneBySegment: ==>  Preparing: SELECT * FROM user_info WHERE id=?
24/11/11 17:04:08 DEBUG UserInfoMapper.selectOneBySegment: ==> Parameters: 1(Long)
24/11/11 17:04:08 DEBUG UserInfoMapper.selectOneBySegment: <==      Total: 1
UserInfo(id=1, username=wzk, password=icu, age=18)

对应的截图如下:
在这里插入图片描述

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

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

相关文章

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏&#xff0c;但UI元素被限制在安全区内…

五天SpringCloud计划——DAY1之mybatis-plus的使用

一、引言 咱也不知道为啥SpringCloud课程会先教mybatis-plus的使用&#xff0c;但是教都教了&#xff0c;就学了吧&#xff0c;学完之后觉得mybatis-plus中的一些方法还是很好用了&#xff0c;本文作为我学习mybatis-plus的总结提升&#xff0c;希望大家看完之后也可以熟悉myba…

Matlab 答题卡方案

在现代教育事业的飞速发展中&#xff0c;考试已经成为现代教育事业中最公平的方式方法&#xff0c;而且也是衡量教与学的唯一方法。通过考试成绩的好与坏&#xff0c;老师和家长可以分析出学生掌握的知识多少和学习情况。从而老师可以了解到自己教学中的不足来改进教学的方式方…

丹摩|丹摩助力selenium实现大麦网抢票

丹摩&#xff5c;丹摩助力selenium实现大麦网抢票 声明&#xff1a;非广告&#xff0c;为用户体验 1.引言 在人工智能飞速发展的今天&#xff0c;丹摩智算平台&#xff08;DAMODEL&#xff09;以其卓越的AI算力服务脱颖而出&#xff0c;为开发者提供了一个简化AI开发流程的强…

【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL

本文采用MATLAB编程&#xff0c;使用生成对抗网络GAN生成数据集&#xff1a;输出生成数据集EXCEL格式文件&#xff0c;方便大家使用。 实际工程应用中&#xff0c;由于经济成本和人力成本的限制&#xff0c;获取大量典型的有标签的数据变得极具挑战&#xff0c;造成了训练样本…

cocos creator 3.8 一些简单的操作技巧,材质的创建 1

这是一个飞机的3D模型与贴图 导入到cocos中&#xff0c;法线模型文件中已经包含了mesh、material、prefab&#xff0c;也就是模型、材质与预制。界面上创建一个空节点Plane&#xff0c;将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit&#xff0c;不需…

手机领夹麦克风哪个牌子好,哪种领夹麦性价比高,热门麦克风推荐

​在如今这个科技飞速发展的时代&#xff0c;麦克风的选择成了很多人关心的问题&#xff0c;特别是无线麦克风该怎么选呢&#xff1f;向我咨询麦克风选购事宜的人可不在少数。要是你只是想简单自娱自乐一下&#xff0c;其实真没必要大费周章&#xff0c;直接用手机自带的麦克风…

【功能实现】bilibili顶部鼠标跟随效果怎么实现?

我们在电脑端打开b站首页时&#xff0c;总会被顶部【鼠标跟随】的效果所吸引&#xff0c;那他是如何实现的&#xff0c;来研究一下。 b站效果&#xff1a; 分析&#xff1a; 1.监听鼠标的位置&#xff0c;当悬浮到该模块时&#xff0c;图片会随鼠标移动 2.引入图片的样式是动…

WebStorm 安装配置(详细教程)

文章目录 一、简介二、优势三、下载四、安装4.1 开始安装4.2 选择安装路径4.3 安装选项4.4 选择开始菜单文件夹4.5 安装完成 五、常用插件5.1 括号插件&#xff08;Rainbow Brackets&#xff09;5.2 翻译插件&#xff08;Translation&#xff09;5.3 代码缩略图&#xff08;Cod…

[C++]:C++11(三)

1. 可变参数模版 1.1 概念 可变参数模板允许我们定义能接受可变数目模板参数的模板。简单来说&#xff0c;就好比一个函数可以接受任意个数的实际参数一样&#xff0c;可变参数模板能应对不同数量的模板参数情况。比如&#xff0c;我们可以有一个模板类或者模板函数&#xff…

【Nginx从入门到精通】05-安装部署-虚拟机不能上网简单排错

文章目录 总结1、排查步骤 一、排查&#xff1a;Vmware网关二、排查&#xff1a;ipStage 1 &#xff1a;ping 127.0.0.1Stage 2 &#xff1a;ping 宿主机ipStage 3 &#xff1a;ping 网关 失败原因解决方案Stage 4 &#xff1a;ping qq.com 总结 1、排查步骤 Vmware中网关是否…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架&#xff0c;它专注于解决图像生成中的风格化问题&#xff0c;旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍&#xff1a; 1.技术特点 风格与内容的有效分离 &a…

卷积神经网络各层介绍

目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU&#xff08;Rectified Linear Unit&#xff09; 3.2 sigmoid 3.3 tanh&#xff08;双曲正切&#xff09; 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核&#xff08;滤波器&#xff09;对矩阵进…

Elastic 和 Red Hat:加速公共部门 AI 和机器学习计划

作者&#xff1a;来自 Elastic Michael Smith 随着公共部门组织适应数据的指数级增长&#xff0c;迫切需要强大、适应性强的解决方案来管理和处理大型复杂数据集。人工智能 (Artificial intelligence - AI) 和机器学习 (machine learning - ML) 已成为政府机构将数据转化为可操…

SAP B1 登陆报错解决方案 - 系统架构目录服务器选择

背景 登录时出现如下报错&#xff0c;报错显示为【系统架构目录服务器选择】 强行登录会发现过往账套都不见了 出现原因 出于各种原因在开机时没有把 SAP 所有的服务成功启动&#xff08;上一次启动科学上网后全局代理没关干净之类的&#xff09;。 解决方案 关机几分钟重启…

基于深度卷积神经网络(CNN)模型的图像着色研究与应用系统实现

1.摘要 许多历史照片都是黑白的&#xff0c;通过颜色化可以恢复这些照片的历史感和真实感&#xff0c;使人们更好地理解和感受历史事件。随着深度学习技术的发展&#xff0c;特别是卷积神经网络和自监督学习的兴起&#xff0c;研究人员提出了新的方法来解决这些问题。通过将颜色…

【CVE-2024-9413】SCP-Firmware漏洞:安全通告

安全之安全(security)博客目录导读 目录 一、概述 二、修订历史 三、CVE根因分析 四、问题修复解决 一、概述 在SCP固件中发现了一个漏洞&#xff0c;如果利用该漏洞&#xff0c;可能会允许应用处理器&#xff08;AP&#xff09;在系统控制处理器&#xff08;SCP&#xf…