当前位置: 首页 > news >正文

【Java EE进阶 --- SpringBoot】Mybatis操作数据库(进阶)


🚀 欢迎来到我的CSDN博客:Optimistic _ chen
一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐:

专栏内容特色适合人群
🔥C语言从入门到精通系统讲解基础语法、指针、内存管理、项目实战零基础新手、考研党、复习
🔥Java基础语法系统解释了基础语法、类与对象、继承Java初学者
🔥Java核心技术面向对象、集合框架、多线程、网络编程、新特性解析有一定语法基础的开发者
🔥Java EE 进阶实战Servlet、JSP、SpringBoot、MyBatis、项目案例拆解想快速入门Java Web开发的同学
🔥Java数据结构与算法图解数据结构、LeetCode刷题解析、大厂面试算法题面试备战、算法爱好者、计算机专业学生

🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客  #编程学习  #Java  #C语言  #算法  #程序员

文章目录

  • 动态SQL
    • < if >标签
    • < trim >标签
    • < where>标签
    • < set>标签
    • < foreach>标签
    • < include>标签
  • 完结撒花!🎉

动态SQL

动态 SQL 是 MyBatis 的强大特性之一。如果使用JDBC等框架,拼接SQL语句是一件很痛苦的事。现在使用MyBatis能够完成不同条件下不同的SQL拼接。

< if >标签

当我们在注册登录时,面临填写必要信息的情况,密码等字段是必填字段,生日等类似的字段是非必填字段。那在注册(添加)用户时,我们不确定用户填写的字段传入(可能会填也可能不会填),程序要如何编写呢?

这个时候需要动态标签来判断了
定义Mapper接口:

@Mapper
public interface UserInfoMapperXML {Integer insertUser3(UserInfo userInfo);
}

数据库中可以设置字段的默认值,如果未传入参数,那就会使用数据库中默认值
xml实现:

<insert id="insertUser3">insert into user_info (username,`password`,age,<if test="gender !=null>//如果gender参数不为null,此处使用属性名称gender,//拼接SQL字段,使用字段名</if>phone)values(#{username},#{age},<if test="gender !=null>//如果gender参数不为null,赋值#{gender},//进行赋值</if>#{phone})</insert>

< trim >标签

前面只是一个gender字段是选填项,如果有多个字段是选填(提前设置好数据库字段的结构),我们要使用 标签结合标签,对多个字段采用动态生成的方法。
首先,介绍一下< trim>标签的属性(后面会用到):
prefix: 为SQL语句添加前缀。
suffix: 为SQL语句添加后缀。
prefixOverrides: 去除SQL语句前面的关键字或字符。
suffixOverrides: 去除SQL语句后面的关键字或字符

现在有两个选填,我们运行测试一下:

<insert id="insertUser3">insert into user_info (username,`password`,age,<if test="gender!=null">gender,</if><if test="phone!=null">phone</if>)VALUES (#{username},#{password},#{age},<if test="gender!=null">#{gender},</if><if test="phone!=null">#{phone}</if>)</insert>

在这里插入图片描述
当选填的两个选项都为空时,会发现报错,仔细观察。
报错原因是:逗号;三个选项填完后,age后面有一个逗号,但是按照上面的情况会发现age后面木有选项了,这个逗号应该怎么办呢?

或许有聪明的大佬会说:把逗号放在属性的前面,就可以正常运行了
在这里插入图片描述

但是如果不止两个选填,字段全是选填 该如何放置呢?
按照大佬的思路,继续放到字段前面:
在这里插入图片描述
在这里插入图片描述
显然,这个办法在多个选填面前失效了。此时就需要拿出前面给出的标签属性了。

    <insert id="insertUser3">insert into user_info (<trim prefixOverrides=","><if test="username!=null">username</if><if test="password!=null">,password</if><if test="age!=null">,age</if><if test="gender!=null">,gender</if><if test="phone!=null">,phone</if></trim>)VALUES (<trim prefixOverrides=","><if test="username!=null">#{username}</if><if test="password!=null">,#{password}</if><if test="age!=null">,#{age}</if><if test="gender!=null">,#{gender}</if><if test="phone!=null">,#{phone}</if></trim>)</insert>

在这里插入图片描述

< where>标签

我们在数据库中查询时,肯定要有查询条件,多个条件之间要用and连接。

定义Mapper接口:

    List<UserInfo> selectByCondition(UserInfo userInfo);

xml实现:从user表中查以phone和deleteFlag为条件的数据

<select id="selectByCondition" resultType="com.zc.mybatis.model.UserInfo">select *from user_infowhere phone=#{phone} and delete_flag=#{deleteFlag}
</select>     

但是在各大购物平台,都有商品筛选功能,他的实现就是动态组装where条件
在这里插入图片描述
仿照前面标签的做法,选择多个选项时,使用prefixOverrides去除前缀(否则会出现SQL语句错误的情况哦)

<select id="selectByCondition" resultType="com.zc.mybatis.model.UserInfo">select *from user_info<trim prefixOverrides="and"><if test="phone!=null">and phone=#{phone}</if><if test="deleteFlag!=null">and delete_flag=#{deleteFlag}</if></trim>
</select>

当然,你也可以使用where标签:
当where语句为空时,会去除where关键字
当where语句块有查询条件时,会添加where关键字,也会去除前缀and关键字,使用更加便利。

<select id="selectByCondition" resultType="com.zc.mybatis.model.UserInfo">select *from user_info<where><if test="phone!=null">and phone=#{phone}</if><if test="deleteFlag!=null">and delete_flag=#{deleteFlag}</if></where>
</select>

在这里插入图片描述

< set>标签

根据传入用户对象属性来更新用户数据,可以使用标签指定动态内容
xml实现:

<update id="updateByCondition">update user_info<set><if test="password!=null">password=#{password},</if><if test="age!=null">age=#{age},</if><if test="gender!=null">gender=#{gender}</if></set>where id=#{id}//更新条件</update>

在这里插入图片描述
注意:set标签:动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号.当然,你也可以根据< trim>标签替换

< foreach>标签

对集合进行遍历使用该标签,属性如下:
collection:绑定⽅法参数中的集合,如List,Set,Map或数组对象
item:遍历的每一个对象
open:语句开头的字符串
close:语句结束的字符串
separator:每次遍历之间间隔的字符串

mapper接口:

Integer batchDelete(List<Integer> ids);

xml实现:根据多个id,删除用户数据

<delete id="batchDelete">delete from user_info where id in//collection="ids":元素集合//item="id":元素变量名//separator=",":元素分隔符<foreach collection="ids" open="(" close=")" separator="," item="id">#{id}</foreach></delete>

在这里插入图片描述

< include>标签

在xml映射⽂件中配置的SQL,有时可能会存在很多重复的⽚段,此时就会存在很多冗余的代码

我们通过对这些代码进行抽取,将其封装到一个SQL片段,然后再通过< include> 标签引用

//<sql>定义可重用的sql片段 <sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time</sql>

通过< include>标签在原来抽取的地方进行引用即可

 <select id="queryById" resultType="com.example.demo.model.UserInfo">select<include refid="allColumn"></include>from userinfo where id= #{id}</select>

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen
📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中……


悄悄说:点击主页有更多精彩内容哦~ 😊

http://www.dtcms.com/a/490093.html

相关文章:

  • 成都海鸥手表网站crm系统的销售管理功能包括
  • 『 QT 』QT信号机制深度解析
  • stp,rstp,mstp的区别
  • 海外盲盒APP开发:从“未知”到“精准”的用户体验革命
  • 网站建设yuanmus站长工具seo综合查询5g
  • 使用 IntelliJ IDEA 结合 DBeaver 连接 MySQL 数据库并实现数据增删查改的详细步骤:
  • 零知IDE——基于STM32F407VET6和ESP-01的SHT2X温湿度监测与云传输系统
  • 记一次生产服务器磁盘I/O性能瓶颈与负载过高分析与处理
  • MEMS加速度计深度解析:从智能手机到结构健康监测
  • LLMs-from-scratch(dataloader)
  • 兴义哪有做网站婚纱影楼网站源码
  • C++_394_tableWidget控件,两种模式,1、行显示模式 2、网格显示模式
  • MyBatis拦截器实现saas租户同库同表数据隔离
  • 求n以内最大的k个素数以及它们的和
  • 手机 网站建设在线自动取名网站怎么做
  • PHP电动汽车租赁管理系统-计算机毕业设计源码35824
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十二)Python3编程之python基础
  • 大型网站怎样做优化PHP营销推广的主要方法
  • 【泛3C篇】AI深度学习在手机前/后摄像头外观缺陷检测应用方案
  • 建设网站需要申请网站建设与管理专业好找工作吗
  • 绿色在线网站模板下载工具别人做的网站不能用怎么办
  • Initiater for mac 小巧的菜单栏OCR工具
  • ntfs可以用在mac上吗?3 种实用方案,解决Mac与NTFS硬盘兼容问题
  • 数据结构——二十、树与森林的遍历
  • 洛杉矶服务器常见问题汇总与解决方案大全
  • Linux云计算基础篇(27)-NFS网络文件系统
  • Mac安装使用Gradle
  • 夜莺监控设计思考(二)边缘机房架构思考
  • AI+大数据时代:时序数据库的架构革新与生态重构
  • 【记录】MAC本地微调大模型(MLX + Qwen2.5)并利用Ollama接入项目实战