dbaplus社群 4小时前
人傻了!面试官问:你写代码会复用公共 SQL 么?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

在Java后端开发中,复用公共SQL是一个实用且能提升代码质量的做法。本文介绍了如何使用MyBatis的标签、动态SQL与Java代码封装、常量类管理SQL片段等方式来实现SQL复用,并阐述了复用SQL的几个明显好处:减少重复代码,提高可维护性,提升一致性。

😊MyBatis的标签:可以用来定义可复用的SQL片段,例如在用户管理模块中,用标签把经常需要查询的用户基础字段(id、username、email等)抽出来,通过标签在多个SQL语句中复用,方便后续维护和更新。

🔄动态SQL与Java代码封装:结合MyBatis的动态SQL和Java代码来实现复用,例如写一个通用的分页工具类PageHelper,在Mapper接口中调用,任何需要分页的查询都可以复用PageHelper,只需要传入页码和每页大小即可,既灵活又可控。

🔧常量类管理SQL片段:如果项目中不完全依赖MyBatis,或者有些SQL是直接通过JDBC执行的,可以用Java的常量类来管理公共SQL片段,简单直观,适合小型项目或者需要快速开发的场景。

✅复用公共SQL的好处:减少重复代码,避免在多个地方写相同的SQL片段,符合DRY(Don't Repeat Yourself)原则;提高可维护性,改动一处,全局生效,降低出错风险;提升一致性,比如字段顺序、命名规范都能统一,避免开发人员各自发挥。

2025-07-31 07:16 广东

面试官听完点了点头,似乎对我的回答还挺满意……

在一次Java后端开发的面试中,面试官问了我一个问题:“你在写代码时会复用公共SQL吗?如果会的话,能详细介绍一下你是如何实现的吗?”

这个问题让我眼前一亮,因为在实际项目中,SQL复用确实是一个非常实用且能提升代码质量的做法。

下面是我当时的回答,也借此机会整理成一篇博客,和大家分享一下我的经验。

我的回答:是的,我会复用公共SQL

我告诉面试官:“是的,我在开发中经常会复用公共SQL,尤其是在Java后端项目中。复用SQL不仅能减少代码重复,还能提高可维护性和一致性。我通常会结合具体的业务场景和框架特性来实现,比如使用MyBatis这样的ORM框架,或者通过自定义工具类来管理公共SQL片段。”

接着,面试官让我详细讲讲实现方式,我就从以下几个方面展开了说明。


实现方式一:MyBatis的<sql>标签

在Java后端开发中,我最常用的ORM框架是MyBatis。MyBatis提供了一个非常方便的特性——<sql>标签,可以用来定义可复用的SQL片段。

比如,在一个用户管理的模块中,经常需要查询用户的某些基础字段,像id、username、email等。如果每次都手写这些字段,既麻烦又容易出错,我就用<sql>标签把它们抽出来。

举个例子,我的UserMapper.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>

    通过<include>标签,我可以在多个SQL语句中复用userBaseColumns这个片段。这样,如果以后需要调整查询字段(比如新增phone字段),只需要改动<sql>定义的地方,所有引用它的查询都会自动更新,省时省力。


    实现方式二:动态SQL与Java代码封装

    有时候,SQL的复用不仅仅是字段列表,还可能是复杂的条件逻辑。比如,很多业务场景下会有分页查询的需求,LIMIT和OFFSET是固定的模式。我会结合MyBatis的动态SQL和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接口中调用:

        @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);
            }
        }

        这样,任何需要分页的查询都可以复用PageHelper,只需要传入页码和每页大小即可。这种方式在Java层实现了SQL的动态拼接,既灵活又可控。

        实现方式三:常量类管理SQL片段

        如果项目中不完全依赖MyBatis,或者有些SQL是直接通过JDBC执行的,我会用Java的常量类来管理公共SQL片段。比如:

          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层使用:

            public User getUserById(Long id) {
                String sql = SqlConstants.SELECT_USER_BY_ID;
                return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
            }

            这种方式的好处是简单直观,适合小型项目或者需要快速开发的场景。不过缺点是缺乏动态性,如果SQL逻辑复杂,维护起来会稍显麻烦。


            为什么复用SQL很重要?

            我还跟面试官补充了一下为什么要这样做。复用公共SQL有几个明显的好处:

              减少重复代码: 避免在多个地方写相同的SQL片段,符合DRY(Don't Repeat Yourself)原则。

              提高可维护性: 改动一处,全局生效,降低出错风险。

              提升一致性: 比如字段顺序、命名规范都能统一,避免开发人员各自发挥。


            总结

            最后,我总结道:“在Java后端开发中,复用公共SQL是一个很实用的习惯。我会根据项目规模和需求选择合适的方式,小项目可能用常量类就够了,大项目则更倾向于MyBatis的<sql>标签或者动态SQL结合工具类。关键是要让代码既高效又易于维护。”

            面试官听完点了点头,似乎对我的回答还挺满意……


            作者丨Asthenian

            来源丨网址:juejin.cn/post/7489358088379187227

            dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

            阅读原文

            跳转微信打开

            Fish AI Reader

            Fish AI Reader

            AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

            FishAI

            FishAI

            鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

            联系邮箱 441953276@qq.com

            相关标签

            Java后端开发 SQL复用 MyBatis 代码质量
            相关文章