几种mybatis的超赞写法

描述

MyBatis 是一款卓越的持久层框架,支持定制化 SQL、存储过程及高级映射。它几乎完全避免了 JDBC 代码、手动设置参数以及获取结果集的繁琐过程。MyBatis 允许开发者通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Objects,普通 Java 对象)映射为数据库中的记录。

在 MyBatis 中,有许多技巧和写法可以帮助我们更好地管理和优化数据库操作。本文将介绍几种常见且实用的 MyBatis 写法,旨在提升代码质量与性能。

1. 使用动态 SQL 生成复杂查询

动态 SQL 根据传入的参数生成不同的 SQL 语句,从而避免复杂条件下的 SQL 拼接问题。它提供了灵活的查询条件,使 SQL 语句能够按需动态变化,减少冗余代码。

text
复制代码
<select id="selectUsersByCondition" parameterType="map" resultType="User"> SELECT * FROM users WHERE 1=1 <if test="username != null">AND username = #{username}</if> <if test="age != null">AND age = #{age}</if> </select>

2. 使用 foreach 实现批量操作

对于批量查询或批量插入,foreach 标签能够生成批量 SQL,简化处理批量数据的插入或更新,减少多次调用的性能消耗。

text
复制代码
<insert id="batchInsert" parameterType="list"> INSERT INTO users (username, age) VALUES <foreach collection="list" item="user" separator=","> (#{user.username}, #{user.age}) </foreach> </insert>

3. 使用 resultMap 映射复杂结果

当查询返回的列与实体类的字段名称不一致时,resultMap 可以实现映射。它使 SQL 结果与 Java 对象之间的映射更加灵活和清晰,适用于复杂查询结果。

text
复制代码
<resultMap id="userResultMap" type="User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="age" column="user_age"/> </resultMap> <select id="selectUser" resultMap="userResultMap"> SELECT user_id, user_name, user_age FROM users WHERE user_id = #{id} </select>

4. 分页查询的实现

使用分页插件(如 MyBatis-Plus)简化分页查询。分页插件自动处理分页逻辑,减少手动拼接 LIMIT 和 OFFSET 的繁琐工作,提升分页查询效率。

text
复制代码
// 第 1 页,10 条数据 Page<User> page = new Page<>(1, 10); List<User> users = userMapper.selectPage(page, new QueryWrapper<>());

5. 处理一对多关系

使用 resultMap 的 collection 标签处理一对多关系。它自动将结果封装到父对象中,方便后续处理。

text
复制代码
<resultMap id="userWithOrders" type="User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="amount" column="order_amount"/> </collection> </resultMap> <select id="selectUserWithOrders" resultMap="userWithOrders"> SELECT u.user_id, u.user_name, o.order_id, o.order_amount FROM users u LEFT JOIN orders o ON u.user_id = o.user_id </select>

6. 批量更新操作

通过 foreach 批量更新数据,提高执行效率。它有效减少数据库操作次数,带来更高的性能。

text
复制代码
<update id="batchUpdateUsers" parameterType="list"> <foreach collection="list" item="user" separator=";"> UPDATE users SET username = #{user.username}, age = #{user.age} WHERE id = #{user.id} </foreach> </update>

7.使用 bind 处理复杂表达式

bind 标签用于处理复杂的字符串拼接和计算逻辑,减少 Java 中的拼接操作,使 SQL 更加简洁。

text
复制代码
<bind name="pattern" value="'%' + keyword + '%'"/> <select id="selectUsersByKeyword" resultType="User"> SELECT * FROM users WHERE username LIKE #{pattern} </select>

8. 实现逻辑删除

使用逻辑删除替代物理删除,保留数据历史,便于后续恢复。

text
复制代码
<update id="deleteUser" parameterType="int"> UPDATE users SET deleted = 1 WHERE id = #{id} </update>

9.复用 SQL 片段

通过 sql 标签重用 SQL 片段,减少重复代码,提升代码的可维护性。

text
复制代码
<sql id="baseUserColumns"> id, username, age, email </sql> <select id="selectUsers" resultType="User"> SELECT <include refid="baseUserColumns"/> FROM users </select>

10. 延迟加载

延迟加载按需加载关联数据,避免不必要的查询,优化性能。

text
复制代码
<settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>

总结

MyBatis 提供了多种灵活功能,助力开发者高效进行数据库操作。通过掌握这些实用写法,可以显著提升代码质量与性能。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP