《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学会"思考",你的开发效率将大幅提升!

相关推荐
byte轻骑兵2 小时前
突破文档型数据库迁移困境:金仓多模方案破解电子证照系统国产化难题
数据库
xdpcxq10293 小时前
EF Core框架数据库连接管理
java·jvm·数据库
野老杂谈3 小时前
Hive SQL 中的时间戳转换详解
hive·hadoop·sql
嘉禾望岗5033 小时前
hive SQL查询与函数
hive·hadoop·sql
期待のcode4 小时前
MyBatis框架—延迟加载与多级缓存
java·数据库·后端·缓存·mybatis
老华带你飞4 小时前
小区服务|基于Java+vue的小区服务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·小区服务管理系统
龙茶清欢4 小时前
具有实际开发参考意义的 MyBatis-Plus BaseEntity 基类示例
java·spring boot·spring cloud·mybatis
计算机学姐5 小时前
基于微信小程序的扶贫助农系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
柯南二号5 小时前
【Java后端】MyBatis 和 MyBatis-Plus (MP) 的区别
java·数据库·tomcat