《MyBatis变形记:当SQL遇上“智能管家“》

各位代码魔法师们,准备好迎接MyBatis的"超级赛亚人"形态了吗?这次的升级可不是小打小闹,而是从"基础查询"跃升到了"智能管家"级别!让我们一起来看看这个"会思考"的SQL是如何工作的。

第一章:Student的"回归正常"

好消息!那个叛逆的`s_sex`字段终于想通了,回归了正常的`sex`字段:

java

private String sex; // 终于不再特立独行了!

而且它还多了两个构造方法:

  • 无参构造:public Student() - "我是空白简历"

  • 带参构造:public Student(String name, Integer age, String sex) - "我是完整档案"

最搞笑的是toString()方法里还有个小小的"笔误":

java

", s_sex='" + sex + '\'' // 等等,字段名不是改回sex了吗?

这就像一个人改了名字,但名片上还印着旧名字------小小的尴尬!

第二章:Dao接口的"批量超能力"

原来的Dao只是个"零售店",现在升级成了"批发市场":

java

// 批量删除 - 一次性送走多个学生

public int deleteByArray(@Param("ids") Integer[] ids);

// 批量添加 - 一次性迎接新生大军

public int insertMore(@Param("students") List<Student> students);

注意这里的`@Param("ids")`和`@Param("students")`,它们就像给参数起了个"外号",让MyBatis在XML里能准确识别。

第三章:动态SQL的"智能大脑"

这才是本次升级的精华!MyBatis不再是那个死板的"复读机",而是变成了会思考的"智能管家"。

场景一:条件搜索的"多重人格"

xml

<select id="search" parameterType="com.qcby.entity.Student" resultType="com.qcby.entity.Student">

<!-- 原来的死板方式 -->

<!-- select * from student where name=#{name} and age=#{age} and sex=#{sex} -->

<!-- 现在的智能方式 -->

select * from student

<where>

<choose>

<when test="name!=null and name!=''">

name=#{name}

</when>

<when test="age!=null">

and age=#{age}

</when>

<otherwise>

and sex=#{sex}

</otherwise>

</choose>

</where>

</select>

这就像有个聪明的管家在问:

  • "主人,你要按名字找吗?"

  • "不要?那按年龄找?"

  • "还不要?那我就默认按性别找咯!"

场景二:修改操作的"精准手术"

xml

<update id="update" parameterType="com.qcby.entity.Student">

update student

<trim prefix="set" suffixOverrides=",">

<if test="name!=null">name = #{name},</if>

<if test="age!=null">age=#{age},</if>

<if test="sex!=null">sex=#{sex}</if>

</trim>

where id = #{id}

</update>

这个<trim>标签就像个细心的编辑:

  • prefix="set":开头加上SET关键字

  • suffixOverrides=",":自动去掉最后一个多余的逗号

这样即使只修改年龄,SQL也不会变成`set age=50,`这种语法错误的样子。

第四章:批量操作的"流水线作业"

批量删除:一键清理

xml

<delete id="deleteByArray">

delete from student where id in

<foreach collection="ids" item="id" separator="," open="(" close=")">

#{id}

</foreach>

</delete>

这个<foreach>标签就像工厂的流水线:

  • collection="ids":原材料是id数组

  • item="id":每个零件叫id

  • separator=",":用逗号隔开

  • open="(" close=")":最后包装成(1,2,3)的样子

批量添加:新生入学仪式

xml

<insert id="insertMore">

insert into student(name,age,sex) values

<foreach collection="students" item="stu" separator=",">

(#{stu.name},#{stu.age},#{stu.sex})

</foreach>

</insert>

这就像开学季,校长不用一个个念名字,直接说:"欢迎张三(18,男)、李四(19,女)、王五(20,男)同时入学!"

第五章:测试类的"实战演练"

测试方法现在变得丰富多彩:

java

@Test

public void search() {

Student student = new Student();

student.setSex("男"); // 只按性别搜索

List<Student> students = mapper.search(student);

}

这个测试就像在说:"管家,帮我找出所有男生,不管他们叫什么名字、多少岁!"

批量操作的测试更是壮观:

java

@Test

public void insertMore(){

// 一次性添加三个学生,像批发市场进货

List<Student> students = Arrays.asList(

new Student("丽丽",21,"女"),

new Student("丽丽1",22,"女"),

new Student("丽丽2",23,"女")

);

int code = mapper.insertMore(students);

}

第六章:动态SQL标签的"武器库"

MyBatis为我们准备了一整套"智能武器":

  1. <if>:基础判断,"如果有...就..."

  2. <where>:智能WHERE,自动处理AND/OR问题

  3. <trim>:精准修剪,去掉多余符号

  4. <choose>/<when>/<otherwise>:多重选择,像switch-case

  5. <foreach>:循环处理,批量操作的利器

代码世界的"智慧箴言"

  1. 灵活性胜过死板:动态SQL让代码适应各种业务场景

  2. 批量操作省时省力:一条SQL搞定多次操作,效率倍增

  3. 注解让参数更清晰:@Param就像给参数贴标签,避免混淆

  4. 标签组合威力大:各种动态SQL标签组合使用,解决复杂问题

结语

这次的MyBatis升级就像给SQL装上了"人工智能":

  • 从"你问我答"变成了"你提需求,我智能解决"

  • 从"单打独斗"变成了"团队作战"

  • 从"固定套路"变成了"灵活应变"

现在我们的MyBatis不再是简单的"数据搬运工",而是升级成了懂得"察言观色"的智能管家!下次写SQL时,不妨想想:"我的SQL够智能吗?"

🎩 程序员魔法:记住,好的代码不是死板的指令,而是灵活的对话!让SQL学会"思考",你的开发效率将大幅提升!

相关推荐
懒羊羊不懒@7 小时前
【数据库 | 基础】DDL语句以及数据类型
数据库
泷羽Sec-静安7 小时前
Less-9 GET-Blind-Time based-Single Quotes
服务器·前端·数据库·sql·web安全·less
李宥小哥7 小时前
结构型设计模式2
网络·数据库·设计模式
猫头虎7 小时前
永久免费白嫖多个域名,一键托管Cloudflare,免费申请SSL加密证书,轻松建站、搭建线路伪装
服务器·开发语言·网络·数据库·python·网络协议·ssl
真正的醒悟8 小时前
什么是安全设备组网
服务器·数据库·php
nvd118 小时前
使用Terraform创建私有Cloud SQL实例及连接测试
sql·云原生·terraform
小哈里8 小时前
【软考架构】2025H2系统架构设计师考试复习.jpg(软件架构、软件工程、数据库、Web开发、高项)
数据库·架构·系统架构·软件工程·后端开发
B站_计算机毕业设计之家8 小时前
深度学习:Yolo水果检测识别系统 深度学习算法 pyqt界面 训练集测试集 深度学习 数据库 大数据 (建议收藏)✅
数据库·人工智能·python·深度学习·算法·yolo·pyqt
wei_shuo11 小时前
全场景自动化 Replay 技术:金仓 KReplay 如何攻克数据库迁移 “难验证“ 难题
数据库·自动化·king base
葡萄城技术团队11 小时前
打破误解!MongoDB 事务隔离级别深度实测:快照隔离竟能防住 8 种异常?
数据库