

在实际开发中,公共 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+服务地区

关注微信公众号
