MyBatis 与 JDBC 场景的解决方案

公共 SQL 复用实践:MyBatis 与 JDBC 场景的

在实际开发中,公共 SQL 的复用是我非常重视的一项实践。通过合理复用 SQL 片段,不仅能提升开发效率,还能显著增强代码的可维护性。以下是我常用的几种实现方式:


实现方式一:基于 MyBatis 的 <sql> 标签实现片段复用


在 MyBatis 框架中,我经常使用 <sql> 标签来定义可复用的 SQL 片段。例如,在用户管理模块中,多个查询操作都需要返回相同的基础字段,我会这样组织代码:

xml

<!-- 定义公共 SQL 片段 --><sql id="userBaseColumns">

   id, username, email, created_at, updated_at</sql>

<!-- 在查询用户列表时引用 --><select id="selectUserList" resultType="User">

   SELECT

       <include refid="userBaseColumns"/>

   FROM users

   WHERE status = #{status}</select>

<!-- 在查询单个用户时引用 --><select id="selectUserById" resultType="User">

   SELECT

       <include refid="userBaseColumns"/>

   FROM users

   WHERE id = #{id}</select>


这种方式的最大优势在于维护性——当需要增减查询字段时,只需修改一处定义即可全局生效,极大地减少了重复代码和出错概率。


实现方式二:结合动态 SQL 与 Java 代码封装复杂逻辑


对于包含条件判断或固定模式的复杂 SQL(如分页查询),我会通过 Java 代码进行封装,实现更高层次的复用:

java

public class PageHelper {

   public static String appendPageSql(String sql, int pageNum, int pageSize) {

       int offset = (pageNum - 1) * pageSize;

       return sql + " LIMIT " + pageSize + " OFFSET " + offset;

   }}

在 Mapper 层配合使用:

java

@SelectProvider(type = UserSqlProvider.class, method = "getUserListSql")List<User> getUserList(int status, int pageNum, int pageSize);

class UserSqlProvider {

   public String getUserListSql(int status, int pageNum, int pageSize) {

       String sql = "SELECT id, username, email FROM users WHERE status = #{status}";

       return PageHelper.appendPageSql(sql, pageNum, pageSize);

   }}


这种方式既保持了 SQL 的灵活性,又实现了通用逻辑的封装,特别适合需要动态组合查询条件的场景。


实现方式三:通过常量类统一管理 SQL 片段


在不完全依赖 MyBatis 或需要直接使用 JDBC 的项目中,我会采用常量类来管理 SQL:

java

public class SqlConstants {

   public static final String USER_BASE_COLUMNS = "id, username, email, created_at, updated_at";

   public static final String USER_TABLE = "users";

   public static final String SELECT_USER_BY_ID =

       "SELECT " + USER_BASE_COLUMNS + " FROM " + USER_TABLE + " WHERE id = ?";}

在 DAO 层直接引用:

java

public User getUserById(Long id) {

   String sql = SqlConstants.SELECT_USER_BY_ID;

   return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());}


这种方法实现简单、直观,适合逻辑相对固定的小型项目或快速开发场景。


总结


在 Java 后端开发中,我会根据项目实际情况选择合适的 SQL 复用策略:

1.对于基于 MyBatis 的中大型项目,首选 <sql> 标签结合动态 SQL

2.对于需要高度灵活性的复杂查询,采用 Java 代码封装

3.对于简单项目或 JDBC 直连场景,使用常量类管理

4.关键在于找到效率与可维护性之间的最佳平衡点,让代码既简洁又易于后续演进。

软件开发 就找木风!

一家致力于优质服务的软件公司

8年互联网行业经验1000+合作客户2000+上线项目60+服务地区

关注微信公众号

在线客服

在线客服

微信咨询

微信咨询

电话咨询

电话咨询