鱼C论坛

 找回密码
 立即注册
查看: 14|回复: 2

MyBatis中的 10 个宝藏技巧!

[复制链接]
发表于 前天 09:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 科科科 于 2026-8-4 09:58 编辑

前言
说到 MyBatis,很多小伙伴都会用,但未必用得“惊艳”。
实际上,这个轻量级的持久层框架还有很多隐藏的“宝藏技巧”。
如果你能掌握这些技巧,不但能让开发更高效,还能避免掉入一些常见的“坑”。
今天就从浅入深,分享 10 个让人眼前一亮的 MyBatis 开发技巧,每一个都配上具体的场景和代码示例,务求通俗易懂,希望对你会有所帮助。

1. 灵活使用动态 SQL
很多小伙伴在写 SQL 的时候,喜欢直接用拼接字符串的方式,比如:
String sql = "SELECT * FROM user WHERE 1=1";if (name != null) {    sql += " AND name = '" + name + "'";}
这种写法不仅麻烦,而且安全性很差(容易引发 SQL 注入)。
MyBatis 的动态 SQL 是专门为解决这种问题设计的,你可以用 if、choose、foreach 等标签来动态构造 SQL。

示例:动态条件查询
<select id="findUser" resultType="User">    SELECT * FROM user    WHERE 1=1    <if test="name != null and name != ''">        AND name = #{name}    </if>    <if test="age != null">        AND age = #{age}    </if></select>
这个代码的好处是,SQL 逻辑清晰,不会因为某个参数为空就导致整个 SQL 报错。
&#8203;
顺便吆喝一声,民族企业[color=rgb(54, 115, 254) !important]机会,前、后端/测试缺人,待遇给的还可以哦~
[color=rgb(54, 115, 254) !important]&#8203;

2. 善用 resultMap 自定义结果映射
有些小伙伴会遇到这样的问题:数据库表字段是下划线命名,但 Java 对象是驼峰命名。比如 user_name 对应 userName。如果直接用默认的 resultType,MyBatis 是无法自动映射的。
这个时候,用 resultMap 就能完美解决。
示例:自定义结果映射
<resultMap id="userResultMap" type="User">    <id column="id" property="id"/>    <result column="user_name" property="userName"/>    <result column="age" property="age"/></resultMap><select id="getUserById" resultMap="userResultMap">    SELECT id, user_name, age FROM user WHERE id = #{id}</select>
有了 resultMap,再复杂的字段映射都可以轻松搞定。

3. 利用 foreach 实现批量操作
有些小伙伴可能会遇到这种需求:传入一个 ID 列表,查询所有匹配的用户信息。如果用拼接字符串的方式生成 IN 条件,不但代码丑,还容易踩坑。
MyBatis 提供了 foreach 标签,可以优雅地处理这种场景。
示例:批量查询
<select id="findUsersByIds" resultType="User">    SELECT * FROM user WHERE id IN    <foreach item="id" collection="idList" open="(" separator="," close=")">        #{id}    </foreach></select>
传入的 idList 是一个 List 或数组,MyBatis 会自动帮你展开为 IN (1, 2, 3) 这样的格式,完全不用担心语法问题。

4. MyBatis-Plus 的分页功能
很多小伙伴在做分页的时候,习惯自己写 LIMIT 的 SQL,这样不仅麻烦,还容易出错。
其实,用 MyBatis-Plus 的分页插件能省不少事。
示例:MyBatis-Plus 分页功能
Page<User> page = new Page<>(1, 10); // 第 1 页,每页 10 条IPage<User> userPage = userMapper.selectPage(page, null);System.out.println("总记录数:" + userPage.getTotal());System.out.println("当前页数据:" + userPage.getRecords());
只需引入分页插件,就能轻松完成分页操作,简直不要太爽。

5. 使用 @Mapper的接口代理
有些小伙伴觉得 XML 文件太多太麻烦,其实 MyBatis 支持纯注解的开发模式,尤其是对于简单的 SQL,非常方便。
示例:注解方式查询
@Mapperpublic interface UserMapper {    @Select("SELECT * FROM user WHERE id = #{id}")    User getUserById(int id);    @Insert("INSERT INTO user(name, age) VALUES(a class="linkToSearch" target="_blank" href="/platform/searchResult?k=%23%7Bname%7D%2C%26nbsp%3B%23&c=2" style="color:rgb(24,113,255);font-weight:600;padding:0 5px">#{name}, #{age})")    void addUser(User user);}
用这种方式,可以完全省掉 XML 配置,代码更加简洁。

6. 二级缓存
MyBatis 内置了一级缓存(SqlSession 范围内),但对于多次查询的场景,可以开启二级缓存来提升性能。
示例:开启二级缓存
<configuration>    <settings>        <setting name="cacheEnabled" value="true"/>    </settings></configuration><mapper namespace="com.example.mapper.UserMapper">    <cache/>    <select id="getUserById" resultType="User">        SELECT * FROM user WHERE id = #{id}    </select></mapper>
开启二级缓存后,同一个 Mapper 下的查询会自动命中缓存,大幅提高性能。

总结
MyBatis 的魅力在于简单、高效,但很多时候我们用得太“基础”,没有发挥它的全部潜力。
希望这 些技巧能帮你更高效地使用 MyBatis,也让你的代码看起来更“惊艳”。
如果觉得有帮助,记得收藏分享!

最后说一句
如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
——转载自:苏三说技术
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 09:57 | 显示全部楼层
鱼油你好!感谢分享这篇 MyBatis 技巧总结,确实很实用。这里帮你补充几个要点,让这些技巧用起来更稳:


1. 动态 SQL 注意“WHERE 1=1”的替代写法
虽然 WHERE 1=1 简单,但可能影响索引优化。更推荐用 <where> 标签:

  1. SELECT * FROM user
  2. <where>
  3.     <if test="name != null and name != ''">
  4.         AND name = #{name}
  5.     </if>
  6.     <if test="age != null">
  7.         AND age = #{age}
  8.     </if>
  9. </where>
复制代码


2. resultMap 也能自动映射下划线字段
其实可以开启驼峰映射,少写很多 resultMap:

  1. <settings>
  2.     <setting name="mapUnderscoreToCamelCase" value="true"/>
  3. </settings>
复制代码

这样 user_name 会自动映射到 userName,简单的查询就不用 resultMap 了。

3. foreach 批量操作注意“集合名”
如果参数是 List,默认 collection 可以写成 list;如果是数组,写 array。用 @Param 指定更清晰:

  1. List<User> getUsersByIds(@Param("idList") List<Integer> idList);
复制代码


4. 分页插件要配置拦截器
MyBatis-Plus 分页不是自动生效的,需要添加分页插件:

  1. @Bean
  2. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3.     MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4.     interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
  5.     return interceptor;
  6. }
复制代码


5. 注解 SQL 适合简单语句
复杂动态 SQL 还是建议用 XML,可读性和维护性更好。注解可以用 @SelectProvider 弥补,但不要硬凹。

6. 二级缓存慎用
二级缓存是 Mapper 级别的,如果多表操作涉及其他 Mapper 更新数据,容易出现脏读。建议在单表单查询场景或明确缓存策略下开启,并且理解 flushCache 的用法。

总结
你的技巧都很棒,只要结合实际场景灵活选择,就能让 MyBatis 真正成为开发利器。感谢分享!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 11:12 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-8-6 08:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表