您的当前位置:首页 >人工智能 >MyBatis中的十个宝藏技巧! 正文
时间:2025-11-04 08:12:12 来源:网络整理编辑:人工智能
前言说到 MyBatis,很多小伙伴都会用,但未必用得“惊艳”。实际上,这个轻量级的持久层框架还有很多隐藏的“宝藏技巧”。如果你能掌握这些技巧,不但能让开发更高效,还能避免掉入一些常见的“坑”。今天就

说到 MyBatis,宝藏很多小伙伴都会用,技巧但未必用得“惊艳”。宝藏
实际上,技巧这个轻量级的宝藏持久层框架还有很多隐藏的“宝藏技巧”。
如果你能掌握这些技巧,技巧不但能让开发更高效,宝藏还能避免掉入一些常见的技巧“坑”。
今天就从浅入深,宝藏分享 10 个让人眼前一亮的技巧 MyBatis 开发技巧,每一个都配上具体的宝藏场景和代码示例,务求通俗易懂,技巧希望对你会有所帮助。宝藏
很多小伙伴在写 SQL 的技巧时候,喜欢直接用拼接字符串的宝藏方式,比如:
复制String sql = "SELECT * FROM user WHERE 1=1"; if (name != null) { sql += " AND name = " + name + ""; }1.2.3.4.这种写法不仅麻烦,而且安全性很差(容易引发 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>1.2.3.4.5.6.7.8.9.10.这个代码的好处是,站群服务器SQL 逻辑清晰,不会因为某个参数为空就导致整个 SQL 报错。
有些小伙伴会遇到这样的问题:数据库表字段是下划线命名,但 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>1.2.3.4.5.6.7.8.9.有了 resultMap,再复杂的字段映射都可以轻松搞定。
有些小伙伴可能会遇到这种需求:传入一个 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>1.2.3.4.5.6.传入的 idList 是一个 List 或数组,MyBatis 会自动帮你展开为 IN (1, 2, 3) 这样的格式,完全不用担心语法问题。高防服务器
很多小伙伴在做分页的时候,习惯自己写 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());1.2.3.4.只需引入分页插件,就能轻松完成分页操作,简直不要太爽。
有些小伙伴觉得 XML 文件太多太麻烦,其实 MyBatis 支持纯注解的开发模式,尤其是对于简单的 SQL,非常方便。
示例:注解方式查询
复制@Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User getUserById(int id); @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") void addUser(User user); }1.2.3.4.5.6.7.8.9.用这种方式,可以完全省掉 XML 配置,代码更加简洁。
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>1.2.3.4.5.6.7.8.9.10.11.12.开启二级缓存后,同一个 Mapper 下的查询会自动命中缓存,大幅提高性能。源码下载
有些多租户系统需要在运行时切换表名,比如按租户分表。这种情况下,可以用 MyBatis 的动态 SQL 特性来实现。
示例:动态表名 复制<select id="getDataFromDynamicTable" resultType="Map"> SELECT * FROM ${tableName} WHERE id = #{id} </select>1.2.3.在调用时传入 tableName 参数,MyBatis 会动态替换表名。
有些小伙伴可能遇到过这种场景:数据库存的是 1/0,但在代码里想用 true/false 表示。
这种情况可以通过自定义 typeHandler 来实现。
示例:自定义 TypeHandler 复制@MappedTypes(Boolean.class) @MappedJdbcTypes(JdbcType.INTEGER) public class BooleanTypeHandler extends BaseTypeHandler<Boolean> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter ? 1 : 0); } @Override public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getInt(columnName) == 1; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.在 MyBatis 配置中注册这个 typeHandler,就可以实现自动类型转换了。
开发中经常需要排查 SQL 执行的问题,这时 MyBatis 的日志功能非常好用。
通过配置,可以轻松打印出完整的 SQL 和参数。
示例:开启日志 复制<configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> </configuration>1.2.3.4.5.日志会输出类似下面的内容:
复制==> Preparing: SELECT * FROM user WHERE id = ? ==> Parameters: 1(Integer) <== Total: 11.2.3.有了这些日志,排查问题再也不头疼了。
当系统需要连接多个数据库时,可以通过 MyBatis 的多数据源配置轻松搞定。
示例:配置多数据源 复制@Configuration @MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef = "sqlSessionTemplate1") public class DataSourceConfig1 { @Bean(name = "dataSource1") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "sqlSessionFactory1") public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "sqlSessionTemplate1") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.通过类似的配置,就可以轻松切换多个数据源。
MyBatis 的魅力在于简单、高效,但很多时候我们用得太“基础”,没有发挥它的全部潜力。
希望这 10 个技巧能帮你更高效地使用 MyBatis,也让你的代码看起来更“惊艳”。
电脑安装ADM插线教程(一步步教你安装ADM插线,畅享高速网络)2025-11-04 08:00
DellSE2417HG显示器的综合评估及特点介绍(出色画质和广阔视野,DellSE2417HG为您带来沉浸式视觉体验)2025-11-04 07:50
苹果ID永久注销后的等待时间(详解注销苹果ID后需要等待多久才能彻底注销账户)2025-11-04 07:29
轻松掌握电脑操作技巧(快速上手,高效办公)2025-11-04 06:53
手机连接电脑删除的文件如何找回?(通过专业软件恢复被删除的手机文件)2025-11-04 06:53
使用U盘修复工具恢复丢失的数据(简单易懂的教程帮助您快速修复U盘问题)2025-11-04 06:34
电脑办公报表制作教程(快速学会制作高效报表的步骤与技巧)2025-11-04 06:21
华为nova2plus手机的全面评测(性能卓越,拍照精彩,细节出众,给你全新视觉体验!)2025-11-04 06:21
电脑QQ错误代码大全解析(了解电脑QQ常见错误代码,解决通信困扰)2025-11-04 06:13
苹果4s升级至iOS7.1.2的新体验(解锁更多功能,提升操作流畅度)2025-11-04 05:30
解决电脑关键事件错误的有效方法(保护您的电脑免受关键事件错误的影响)2025-11-04 08:01
探究电脑没有显示输密码错误的原因(密码输入正确却无法登录,电脑没有提示错误信息的问题研究)2025-11-04 07:23
iPad和MacMini的完美组合——提升办公和娱乐体验2025-11-04 07:23
小米1S与红米Note(对比分析小米1S和红米Note的性能、功能与性价比)2025-11-04 07:01
以5s升级iOS9.3.1的最佳方法(简单、快速、安全升级你的iPhone)2025-11-04 06:55
掌握新款拼音教程平板电脑,轻松学好拼音(拼音教学新利器的)2025-11-04 06:48
手把手教你制作桌面立体电脑(简单易懂的教程,让你轻松打造个性桌面电脑)2025-11-04 06:39
电脑连接Wi-Fi密码错误的解决方法(通过检查密码、重新连接和重启路由器来解决Wi-Fi密码错误问题)2025-11-04 06:37
三星台式电脑装机教程(简单易懂的三星台式电脑装机教程,助你快速搭建个人工作站)2025-11-04 06:10
苹果4s升级至iOS7.1.2的新体验(解锁更多功能,提升操作流畅度)2025-11-04 05:37