MyBatis 核心标签使用场景及用法详解

在这里插入图片描述

MyBatis标签使用心得:这些年我用过的那些标签

最近整理项目代码,翻出了不少老旧的MyBatis映射文件。看着这些XML配置,突然想起刚工作时被MyBatis各种标签支配的恐惧。今天就跟大家聊聊这些标签的使用心得,都是血泪教训换来的经验。

一、基础标签:从入门到放弃

刚开始用MyBatis时,觉得<select><insert>这些基础标签简直太简单了。直到有一天…

<!-- 新手常见错误示例 -->
<insert id="addUser" parameterType="User">
    INSERT INTO user VALUES(#{id}, #{name}, #{age})
</insert>

结果上线后各种报错,原来数据库加了新字段。这才明白要显式指定列名:

<!-- 正确写法 -->
<insert id="addUser" parameterType="User">
    INSERT INTO user(name, age, create_time)
    VALUES(#{name}, #{age}, NOW())
</insert>

血泪教训

  1. 永远明确指定插入列名
  2. 日期处理最好在SQL里完成
  3. 别相信"表结构不会变"这种鬼话

二、动态SQL:从惊艳到抓狂

第一次见到<if>标签时惊为天人,再也不用写恶心的字符串拼接了!于是写出了这样的代码:

<select id="findUsers" resultType="User">
    SELECT * FROM user WHERE
    <if test="name != null">name = #{name}</if>
    <if test="age != null">AND age = #{age}</if>
</select>

结果当name为null时,SQL直接变成SELECT * FROM user WHERE AND age=xx,当场爆炸。

后来才知道要用<where>标签:

<select id="findUsers" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">name = #{name}</if>
        <if test="age != null">AND age = #{age}</if>
    </where>
</select>

实用技巧

  1. <where>会自动去除开头AND/OR
  2. 简单条件用<if>,复杂逻辑用<choose>
  3. 记得在测试用例里覆盖所有条件分支

三、<foreach>标签:性能杀手?

做批量操作时,<foreach>简直是救命稻草:

<insert id="batchInsert">
    INSERT INTO user(name, age) VALUES
    <foreach collection="list" item="user" separator=",">
        (#{user.name}, #{user.age})
    </foreach>
</insert>

但是有一次导入10万条数据,直接把数据库干趴了。后来学乖了,要分批处理:

// 每批1000条
int batchSize = 1000;
List<List<User>> batches = ListUtils.partition(userList, batchSize);

batches.forEach(batch -> {
    userMapper.batchInsert(batch);
});

性能心得

  1. MySQL单批建议500-2000条
  2. Oracle单批建议100-500条
  3. 记得加事务,但别太大

四、<resultMap>:对象映射的艺术

最让我头疼的就是复杂的对象关系映射。比如用户有角色,还有订单:

<resultMap id="userDetailMap" type="User">
    <id property="id" column="id"/>
    <!-- 基础字段 -->
    <result property="name" column="name"/>
    
    <!-- 一对一 -->
    <association property="role" javaType="Role">
        <id property="id" column="role_id"/>
        <result property="name" column="role_name"/>
    </association>
    
    <!-- 一对多 -->
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="amount" column="amount"/>
    </collection>
</resultMap>

踩过的坑

  1. 别忘了<id>标签,否则性能很差
  2. 列名别名要写清楚,避免冲突
  3. 太复杂的映射考虑拆成多个查询

五、那些不常用但好用的标签

  1. <trim>:当<where><set>不够灵活时使用
<update id="updateSelective">
    UPDATE user
    <trim prefix="SET" suffixOverrides=",">
        <if test="name != null">name=#{name},</if>
        <if test="age != null">age=#{age},</if>
    </trim>
    WHERE id=#{id}
</update>
  1. <bind>:预处理变量
<select id="search">
    <bind name="pattern" value="'%' + keyword + '%'"/>
    SELECT * FROM products 
    WHERE name LIKE #{pattern}
</select>

六、我的MyBatis标签使用准则

  1. KISS原则:能简单就别复杂
  2. 显式优于隐式:明确指定列名和映射关系
  3. 性能意识:注意批量操作的数据量
  4. 可读性:适当换行和注释
  5. 安全第一:永远用#{},不用${}

这些年用下来,MyBatis的标签设计确实很实用。刚开始可能会觉得复杂,但熟悉后会发现它们能优雅地解决各种SQL问题。关键是要理解每个标签的设计初衷,而不是死记硬背。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech_Jia_Hui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值