摘要:在使用 MyBatis 开发项目时,Mapper 接口是为数据库操作提供最直观的方法,但在实现方式上,我们有两种选择:全注解模式和混合模式。那么,他们有什么区别,应该如何选择?我们一起来讨论一下。
在使用 MyBatis 开发项目时,Mapper 接口是为数据库操作提供最直观的方法,但在实现方式上,我们有两种选择:全注解模式和混合模式。那么,他们有什么区别,应该如何选择?我们一起来讨论一下。
全注解模式,两个字:直接。不过在 Mapper 接口中加上注解,将数据库操作直接通过 SQL 语句控制,想查询就用 @Select ,想插入就用 @Insert ,完全是一样的操作体验。
这里有一个基础的用户操作 Mapper:
@MapperpublicinterfaceUserMapper { @Insert("INSERT INTO user (username, password, role) VALUES (#{username}, #{password}, #{role})") @Options(useGeneratedKeys = true, keyProperty = "id") voidinsertUser(User user); @Select("SELECT * FROM user WHERE username = #{username}") User findByUsername(String username); @Update("UPDATE user SET password = #{password} WHERE id = #{id}") voidupdatePassword(@Param("id") Integer id, @Param("password") String password);}• SQL 语句直接嵌入代码中,容易导致代码臃肿:当查询逻辑变复杂时,大量 SQL 会堆积在接口文件中,导致文件过长且难以维护。• 扩展性差:复杂的查询条件需要硬编码在注解中,无法灵活调整,尤其对于需要动态拼接 SQL 的场景显得力不从心。• 团队协作时难以分工:开发人员需要同时熟悉 SQL 和 Java,且 SQL 的变更可能需要修改接口文件,增加沟通成本。混合模式,是使用“ 接口声明 + XML 配置文件 ”的方式实现。Mapper 接口直接定义操作类型,而 SQL 语句则存在于配置文件中。
一个复杂旅游线路查询 Mapper:
@Mapperpublic interface TourLineMapper { List filterTourLines(@Param("destination") String destination, @Param("minPrice") Double minPrice, @Param("maxPrice") Double maxPrice, @Param("minDuration") Integer minDuration, @Param("maxDuration") Integer maxDuration);}优势体现在 XML 配置文件中:
SELECT * FROM tour_line WHERE 1 = 1 AND destination = #{destination} AND price >= #{minPrice} AND price AND duration >= #{minDuration} AND duration这是一种防止 SQL 拼接错误的技巧,为后续条件拼接提供基础,即使没有后续条件,SQL 也不会因为没有 WHERE 子句而报错。
是 MyBatis 动态 SQL 的重要组成部分,用于判断条件是否为 true,从而决定是否拼接该部分 SQL。
例如:
AND destination = #{destination}如果 destination 参数不为空,就会将 AND destination = #{destination} 拼接到最终的 SQL 语句中。
每个条件中的 #{} 会被传入的参数动态替换为具体值,保证查询的安全性,防止 SQL 注入。
SQL 拼接优雅性
使用 标签时,可以避免在 Java 代码中手动拼接 SQL,提高代码的可读性和维护性。
参数命名一致性
确保 XML 文件中的参数名称与 Java 接口方法中 @Param 注解指定的名称一致,否则会导致参数映射失败。
灵活性
如果需要更多动态条件,比如基于某个字段的排序,可以在 标签外部增加 和 标签实现更复杂的逻辑。
例如:
ORDER BY ${sortField} ${sortDirection} ORDER BY id ASC 适用场景这段动态 SQL 非常适合以下场景:
• 参数较多且查询条件可能动态变化,比如多字段过滤、范围查询等。• 查询的复杂度较高,不适合直接写在 Java 中,分离到 XML 更易维护。不足• 如果你的项目规模较小 ,数据表结构简单,查询逻辑以基础的增删改查为主,可以选择全注解模式。它能够快速上手,开发效率高,适合对时间要求较高的场景。• 如果你的项目规模较大 ,查询逻辑复杂且动态变化较多,建议选择混合模式。它的灵活性和可维护性更强,能够为复杂需求提供更好的支持。• 团队协作时 ,混合模式的分离设计可以降低沟通成本,尤其对于 SQL 改动频繁的项目。无论选择哪种模式,最重要的是根据项目需求灵活运用,选择最适合自己团队和业务的方式。
转自:juejin.cn/post/7459983789731053579
后端专属技术群 构建高质量的技术交流社群,欢迎从事编程开发、技术招聘 HR 进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以 交流技术 、 职位内推 、 行业探讨 为主
来源:墨码行者