【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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中……
悄悄说:点击主页有更多精彩内容哦~ 😊