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