平时估计大家日常开发应该搞java的都是用ssm框架,也就是spring+springmvc+mybatis,这个框架组合基本上就是开发平时的web业务系统的常见组合了,加一个springboot直接就可以起飞,一个系统直接就可以快速的启动拉起一个web server,然后spirngmvc写一堆controller对外暴露http接口。
接着就是spring bean实现service和dao,写业务逻辑,dao用mybatis来实现,可以用mybatis的mapper功能写一堆sql语句,然后一个crud业务系统就可以搞出来了。现在大家都流行时髦一点搞微服务,那就加上spring cloud alibaba技术栈,直接nacos+dubbo就可以搞成微服务分布式系统架构了。
外加一个seata分布式事务都搞出来了,sentinel一上接口流量监控、限流、熔断、降级,都可以搞上了,大家现在平时都是这么写系统的,是不是?
好,那今天就给大家分享一下我们平时用mybatis开发的时候,有哪些有用的技巧和高级的功能可以用,可以更好的帮助我们做一个好的系统!
那MyBatis呢是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。使用 MyBatis,你可以通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。今天,我们就来探讨 10 种超赞的 MyBatis 写法,让你的数据库操作更加高效和灵活。
1. 使用 <foreach> 实现批量操作
<foreach>
是 MyBatis 中一个非常强大的元素,它允许你遍历集合并对每个元素执行 SQL 语句的一部分。这在批量插入、更新或删除操作中尤其有用。
示例代码:批量插入用户信息
<insert id="batchInsertUsers" parameterType="java.util.List"> INSERT INTO users (id, name, age) VALUES <foreach collection="list" item="user" separator=","> (#{user.id}, #{user.name}, #{user.age}) </foreach> </insert> // Mapper接口 List<Integer> batchInsertUsers(List<User> users);
2. <if> 实现动态 SQL
<if>
元素用于根据条件包含部分 SQL 语句。这在构建动态查询时非常有用,特别是当查询条件不是固定的时候。
示例代码:根据用户ID和用户名查询用户
<select id="selectUsersByCondition" parameterType="map" resultType="User"> SELECT * FROM users WHERE 1=1 <if test="id != null"> AND id = #{id} </if> <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if> </select> // Mapper接口 List<User> selectUsersByCondition(Map<String, Object> params);
3. <choose>、<when>、<otherwise> 实现多条件分支查询
类似于 Java 中的 switch
语句,<choose>
、<when>
、<otherwise>
元素允许你在 SQL 语句中执行多条件分支查询。
示例代码:根据用户ID或用户名查询用户
<select id="selectUserByChoose" parameterType="map" resultType="User"> SELECT * FROM users <where> <choose> <when test="id != null"> id = #{id} </when> <when test="name != null and name != ''"> name LIKE CONCAT('%', #{name}, '%') </when> <otherwise> 1=1 <!-- 总是为真,相当于无条件 --> </otherwise> </choose> </where> </select> // Mapper接口 List<User> selectUserByChoose(Map<String, Object> params);
4. <trim> 优化 SQL 语句
<trim>
元素可以用来去除 SQL 语句中不需要的部分,比如多余的 AND
、OR
或者前缀。
示例代码:更新用户信息,去除多余的逗号和 AND
<update id="updateUser" parameterType="User"> UPDATE users <trim prefix="SET" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="age != null">age = #{age},</if> </trim> WHERE id = #{id} </update> // Mapper接口 int updateUser(User user);
5. 使用 <selectKey> 获取自动生成的主键
在插入记录时,经常需要获取数据库自动生成的主键值。<selectKey>
元素可以在插入操作后执行一个查询来获取这个值。
示例代码:插入用户并获取自动生成的主键
<insert id="insertUserAndGetId" parameterType="User" useGeneratedKeys="true" keyProperty="id"> <!-- 这里 useGeneratedKeys="true" 和 keyProperty="id" 也可以不使用 selectKey,取决于数据库和 MyBatis 配置 --> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert> // Mapper接口 int insertUserAndGetId(User user);
注意:对于支持自动生成主键的数据库(如 MySQL 的 AUTO_INCREMENT),通常不需要 <selectKey>
,因为 MyBatis 可以自动捕获这些值。
6. 使用 Mapper 接口和注解
除了 XML 配置外,MyBatis 还支持使用 Mapper 接口和注解来简化开发。
示例代码:使用 @Select
注解查询用户
@Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User selectUserById(@Param("id") Integer id); }
7. 关联查询
MyBatis 支持多种关联查询方式,包括嵌套查询和延迟加载。
示例代码:使用嵌套查询查询用户及其订单
<!-- 查询用户 --> <select id="selectUserWithOrders" resultMap="userOrderResultMap"> SELECT * FROM users WHERE id = #{id} </select> <resultMap id="userOrderResultMap" type="User"> <id property="id" column="id" /> <result property="name" column="name" /> <collection property="orders" ofType="Order" select="selectOrdersByUserId" column="id"/> </resultMap> <!-- 根据用户ID查询订单 --> <select id="selectOrdersByUserId" resultType="Order"> SELECT * FROM orders WHERE user_id = #{userId} </select>
8. 延迟加载
延迟加载是一种优化技术,它允许在真正需要关联数据时再去加载这些数据,从而减少数据库的访问次数。
配置:在 MyBatis 配置文件中启用延迟加载
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>
9. 分页查询
MyBatis 本身不直接支持分页查询,但可以通过 SQL 的 LIMIT 语句或结合插件来实现。
示例代码:使用 LIMIT 实现分页
<select id="selectUsersByPage" parameterType="map" resultType="User"> SELECT * FROM users LIMIT #{offset}, #{limit} </select> // Mapper接口 List<User> selectUsersByPage(Map<String, Object> params);
10. 使用 MyBatis-Plus 简化开发
MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
示例:使用 MyBatis-Plus 的 Service
层进行分页查询
@Autowired private IUserService userService; public Page<User> selectUserPage(int pageNum, int pageSize) { Page<User> page = new Page<>(pageNum, pageSize); return userService.page(page, null); // null 表示不添加任何查询条件 }
总结
以上 10 种 MyBatis 的写法涵盖了从基础到高级的各种应用场景,包括批量操作、动态 SQL、关联查询、分页查询以及使用 MyBatis-Plus 简化开发等。掌握这些技巧,将极大地提升你的数据库操作效率和灵活性。希望这篇文章对你有所帮助!