当前位置:首页>java>面试官:写代码如何复用公共 SQL ?

面试官:写代码如何复用公共 SQL ?

  • 2026-01-21 14:52:18
面试官:写代码如何复用公共 SQL ?

面试里被问“怎么复用公共 SQL”,其实挺能看出一个人代码风格和工程思维的。 我前段时间面了个同学,简历上写着“精通 MyBatis、熟悉 SQL 优化”,我就顺嘴问了句:你们项目里相同条件的 SQL 是怎么复用的?结果他愣了三秒,说“就复制粘贴嘛”。这就有点危险了。

我用一个简单的用户查询场景,慢慢把这个事讲清楚,你回头也可以照着这套思路在面试里回答。

先看“惨案版”:满项目到处复制的 SQL

假设有张用户表 user:

CREATETABLEuser (
idBIGINT PRIMARY KEY,
    username    VARCHAR(64),
    mobile      VARCHAR(20),
statusTINYINT,        -- 1=启用 0=禁用
    deleted     TINYINT,        -- 0=正常 1=删除
    created_at  DATETIME
);

常见几个需求:

  • 页面列表查询用户
  • 导出 Excel 查询用户
  • 后台风控系统按同样条件查用户

很多项目里,会变成下面这种写法,在不同地方写三个几乎一样的 SQL。

// A 模块
String sql1 = "select id, username, mobile, status, created_at " +
"from user " +
"where deleted = 0 " +
"and status = ? " +
"and created_at between ? and ? " +
"order by created_at desc limit ?, ?";

// B 模块
String sql2 = "select id, username, mobile, status, created_at " +
"from user " +
"where deleted = 0 " +
"and status = ? " +
"and created_at between ? and ? " +
"order by created_at desc";

// C 模块
String sql3 = "select count(1) " +
"from user " +
"where deleted = 0 " +
"and status = ? " +
"and created_at between ? and ?";

一旦业务改了个需求,比如“deleted 字段逻辑变更成 2 代表删除”,你要在项目里全局搜 deleted = 0,挨个改,极容易漏。 这个时候面试官问“怎么复用公共 SQL”,如果你还能说自己到处复制粘贴,就说不过去了。

第一层:先把 SQL 收拢到一处,再谈复用

最基础的一步,其实就是“分层”:别在 service、controller 里乱写 SQL,统一塞到 Repository / DAO 里,让 SQL 至少只在一处出现。

比如用 Spring 的 JdbcTemplate,可以先收拢成这样:

@Repository
publicclassUserRepository{

@Autowired
private JdbcTemplate jdbcTemplate;

// 公共的 SELECT 片段
privatestaticfinal String BASE_SELECT =
"select id, username, mobile, status, created_at " +
"from user " +
"where deleted = 0 ";

// 公共的 WHERE 业务逻辑
privatestaticfinal String BASE_WHERE =
"and status = ? " +
"and created_at between ? and ? ";

public List<User> queryPage(int status, LocalDateTime start, LocalDateTime end,
int offset, int pageSize)
{
        String sql = BASE_SELECT + BASE_WHERE + "order by created_at desc limit ?, ?";
return jdbcTemplate.query(sql,
new Object[]{status, start, end, offset, pageSize},
new UserRowMapper());
    }

public List<User> queryForExport(int status, LocalDateTime start, LocalDateTime end){
        String sql = BASE_SELECT + BASE_WHERE + "order by created_at desc";
return jdbcTemplate.query(sql,
new Object[]{status, start, end},
new UserRowMapper());
    }

publicintcount(int status, LocalDateTime start, LocalDateTime end){
        String sql = "select count(1) from user where deleted = 0 " + BASE_WHERE;
return jdbcTemplate.queryForObject(sql,
new Object[]{status, start, end},
                Integer.class);
    }
}

这一步其实就已经是“SQL 复用”的雏形:公共条件抽成一个常量或方法,分页、导出、计数这些场景共用一套 where 条件。 以后改业务逻辑,只动 BASE_WHERE 就行。

第二层:公共 SQL + 条件对象,做到既复用又好扩展

上面这种写法还有两个小问题:

  • 参数一长串,方法签名很丑,也容易顺序写错
  • 新增条件时,方法要改签名、调用方都要动

比较舒服的做法:定义一个查询条件对象,再写个“SQL 构造方法”,统一拼公共 SQL。

publicclassUserQuery{
private String username;
private Integer status;
private LocalDateTime startTime;
private LocalDateTime endTime;
private Integer pageNo;
private Integer pageSize;
// getter/setter 省略
}

Repository 里这样写:

@Repository
publicclassUserRepository{

@Autowired
private JdbcTemplate jdbcTemplate;

privatestaticfinal String BASE_SELECT =
"select id, username, mobile, status, created_at " +
"from user where deleted = 0 ";

privatestaticfinal String BASE_COUNT =
"select count(1) from user where deleted = 0 ";

privatestaticclassSqlAndArgs{
privatefinal String sql;
privatefinal List<Object> args;

        SqlAndArgs(String sql, List<Object> args) {
this.sql = sql;
this.args = args;
        }
    }

// 核心:公共 SQL 拼装逻辑
private SqlAndArgs buildWhereSql(String baseSql, UserQuery query, boolean needPage){
        StringBuilder sb = new StringBuilder(baseSql);
        List<Object> args = new ArrayList<>();

if (query.getUsername() != null && !query.getUsername().isEmpty()) {
            sb.append(" and username like ? ");
            args.add("%" + query.getUsername() + "%");
        }
if (query.getStatus() != null) {
            sb.append(" and status = ? ");
            args.add(query.getStatus());
        }
if (query.getStartTime() != null) {
            sb.append(" and created_at >= ? ");
            args.add(query.getStartTime());
        }
if (query.getEndTime() != null) {
            sb.append(" and created_at <= ? ");
            args.add(query.getEndTime());
        }

        sb.append(" order by created_at desc ");

if (needPage && query.getPageNo() != null && query.getPageSize() != null) {
            sb.append(" limit ?, ? ");
int offset = (query.getPageNo() - 1) * query.getPageSize();
            args.add(offset);
            args.add(query.getPageSize());
        }

returnnew SqlAndArgs(sb.toString(), args);
    }

public List<User> queryList(UserQuery query){
        SqlAndArgs sqlAndArgs = buildWhereSql(BASE_SELECT, query, true);
return jdbcTemplate.query(sqlAndArgs.sql,
                sqlAndArgs.args.toArray(),
new UserRowMapper());
    }

publicintcount(UserQuery query){
// 计数不需要分页
        SqlAndArgs sqlAndArgs = buildWhereSql(BASE_COUNT, query, false);
return jdbcTemplate.queryForObject(sqlAndArgs.sql,
                sqlAndArgs.args.toArray(),
                Integer.class);
    }

public List<User> export(UserQuery query){
// 导出不分页
        SqlAndArgs sqlAndArgs = buildWhereSql(BASE_SELECT, query, false);
return jdbcTemplate.query(sqlAndArgs.sql,
                sqlAndArgs.args.toArray(),
new UserRowMapper());
    }
}

这里有几个点,面试时可以顺嘴提一下:

  • 公共 SQL 片段体现在 BASE_SELECTBASE_COUNT 和 buildWhereSql
  • 业务条件统一通过 UserQuery 传递,调用方扩展条件不用改一堆参数签名
  • 条件拼接统一走 ? 占位符,避免 SQL 注入问题

这种“条件对象 + SQL 构造器”的写法,在不用 ORM、只用 JDBC 的项目里非常常见,用来做 SQL 复用是很合理的。

第三层:如果用 MyBatis,就好好用 <sql> 片段

面试官一听你说 MyBatis,一般会追问一句:“那你公共 SQL 怎么抽?” 很典型的就是 <sql> + <include>

比如还是用户表的例子,可以这样:

<!-- 公共字段列表 -->
<sqlid="Base_Column_List">
    id, username, mobile, status, created_at
</sql>

<!-- 公共查询条件 -->
<sqlid="User_Base_Where">
<where>
        deleted = 0
<iftest="username != null and username != ''">
            and username like concat('%', #{username}, '%')
</if>
<iftest="status != null">
            and status = #{status}
</if>
<iftest="startTime != null">
            and created_at &gt;= #{startTime}
</if>
<iftest="endTime != null">
            and created_at &lt;= #{endTime}
</if>
</where>
</sql>

<selectid="listUser"resultType="com.demo.User">
    select
<includerefid="Base_Column_List" />
    from user
<includerefid="User_Base_Where" />
    order by created_at desc
<iftest="pageSize != null and pageSize &gt; 0">
        limit #{offset}, #{pageSize}
</if>
</select>

<selectid="countUser"resultType="int">
    select count(1)
    from user
<includerefid="User_Base_Where" />
</select>

这里“公共 SQL 复用”的点就很清晰了:

  • 字段列表复用:Base_Column_List 一改,全改
  • 业务 where 复用:User_Base_Where 被列表、统计、导出等多个语句引用

你可以顺便提一句: 如果有“订单公共条件”“有效商品公共条件”,也可以抽成不同 <sql id="Order_Base_Where"> 这类片段,避免 XML 写成“复制地狱”。

第四层:ORM 的“查询构造器”其实也是在复用 SQL

如果项目用的是 MyBatis-Plus、JPA Specification、Querydsl 这些库,公共 SQL 很多时候就不再体现为“文本片段”,而是公共的“条件构造方法”。

还是用 MyBatis-Plus 举个例子:

publicclassUserQuery{
private String username;
private Integer status;
private LocalDateTime startTime;
private LocalDateTime endTime;
// 分页字段省略
}
@Service
publicclassUserService{

@Autowired
private UserMapper userMapper;

// 构造公共查询条件
private QueryWrapper<User> buildWrapper(UserQuery query){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("deleted"0);
if (query.getUsername() != null && !query.getUsername().isEmpty()) {
            wrapper.like("username", query.getUsername());
        }
if (query.getStatus() != null) {
            wrapper.eq("status", query.getStatus());
        }
if (query.getStartTime() != null) {
            wrapper.ge("created_at", query.getStartTime());
        }
if (query.getEndTime() != null) {
            wrapper.le("created_at", query.getEndTime());
        }
        wrapper.orderByDesc("created_at");
return wrapper;
    }

public IPage<User> pageUser(UserQuery query){
        Page<User> page = new Page<>(query.getPageNo(), query.getPageSize());
return userMapper.selectPage(page, buildWrapper(query));
    }

public List<User> exportUser(UserQuery query){
return userMapper.selectList(buildWrapper(query));
    }

publicintcountUser(UserQuery query){
return userMapper.selectCount(buildWrapper(query)).intValue();
    }
}

看着虽然没有一句“裸 SQL”,但本质上,你还是在复用“同一套 where 条件”,只是换成了对象的形式。 面试时可以直接说:“如果项目用 ORM,我的做法是统一封装条件构造逻辑,比如 MyBatis-Plus 的 buildWrapper,让分页、导出、统计共用同一套条件。”

第五层:数据库层面的复用——视图、存储过程、公共 CTE

有些面试官会再追问一句:“那有没有考虑在数据库层面复用,比如视图、存储过程?” 这里可以选一些你熟悉的说,不需要全覆盖。

比如业务上有个“活跃用户”的概念,条件很复杂,Java 里写起来一大坨,你可以直接在数据库里建视图:

CREATEVIEW v_active_user AS
SELECTid, username, mobile, status, created_at
FROMuser
WHERE deleted = 0
ANDstatus = 1
AND created_at >= DATE_SUB(NOW(), INTERVAL30DAY);

Java 里就变成:

privatestaticfinal String BASE_ACTIVE_SQL =
"select id, username, mobile, status, created_at " +
"from v_active_user ";

public List<User> listActive(UserQuery query){
// 在这个基础上再叠加一些简单条件
}

优点是业务含义很清晰:看见 v_active_user,就知道是“活跃用户”的那套条件。 缺点也要顺便提一下:视图、存储过程改起来要走 DBA 流程,不如应用层改代码灵活,所以适合相对稳定的公共逻辑。

如果数据库版本支持 CTE(with 语句),有时候也能写出更好复用的“公共子查询”,不过一般面试里点到为止就够了。

第六层:回答面试官时,可以这么组织话术

把上面的东西揉一揉,你可以用一种比较自然的方式说出来,比如:

“我们线上项目里公共 SQL 复用,我一般分两层做。 应用层会先把 SQL 收拢到 Repository/Mapper 这一层,然后把相同业务含义的 where 条件抽成公共片段,比如 MyBatis 用 <sql> + <include>,JDBC 就用一个统一的 buildWhereSql 方法,所有列表、导出、统计都走这一套逻辑,避免到处复制粘贴。 另外如果用 MyBatis-Plus 或者 JPA,我会再封一层查询构造器方法,比如 buildWrapper(UserQuery query) 或者 Specification,这样既复用条件,也方便扩展。 如果某些查询特别复杂、比较稳定,比如‘活跃用户’、‘有效订单’,我会考虑在数据库里建视图,让 Java 里直接查视图,做到跨系统的 SQL 复用。”

基本上你能把这几层意思讲清楚,再穿插一两个简单代码例子,面试官一般就知道你不是只会写“select * from table where 1=1”的那种人。

顺带提一个容易被忽略的小点

有些同学会说:“那我把 SQL 公共片段抽成静态字符串常量不就行了?” 比如:

publicstaticfinal String USER_BASE_WHERE =
" where deleted = 0 and status = ? ";

这一看像是复用了,但有两个坑:

  • 这些常量如果放在某个 util 里到处被引用,很容易写成“看不懂语义的模板字符串”,比如 " and a = ? and b = ? ",只要参数位置搞错就出事
  • where 前面有没有空格、and 前面有没有空格,稍微不注意就拼出语法错误

更稳妥的做法,还是像前面那样:封装成“构造 SQL 的方法”,统一用 StringBuilder 追加,让条件逻辑和参数顺序都在一个地方看得清楚,而不是一堆散落的魔法字符串。

最后随口说一句

面试里问“公共 SQL 怎么复用”,表面看是在问 SQL,其实是在看你有没有工程化思维: 你是只顾眼前“能跑就行”,还是会想半年之后这段代码好不好维护、好不好改。

上面的这些写法,你在自己项目里试着改一两个查询,很快就有感觉了。行了,我也得去把自己老项目里那堆 copy 过来的 where 条件收拾一下,不然迟早被自己坑。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥东哥私藏精品 🔥
东哥作为一名超级老码农,整理了全网最全《Java高级架构师资料合集》总量高达650GB。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 16:53:34 HTTP/2.0 GET : https://f.mffb.com.cn/a/462060.html
  2. 运行时间 : 0.113334s [ 吞吐率:8.82req/s ] 内存消耗:4,472.38kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a352cf6023f3ef60dcf9c5d8e00fcd89
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000592s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000886s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000373s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000256s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000648s ]
  6. SELECT * FROM `set` [ RunTime:0.000283s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000596s ]
  8. SELECT * FROM `article` WHERE `id` = 462060 LIMIT 1 [ RunTime:0.000650s ]
  9. UPDATE `article` SET `lasttime` = 1770540814 WHERE `id` = 462060 [ RunTime:0.018800s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000787s ]
  11. SELECT * FROM `article` WHERE `id` < 462060 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001164s ]
  12. SELECT * FROM `article` WHERE `id` > 462060 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001154s ]
  13. SELECT * FROM `article` WHERE `id` < 462060 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001429s ]
  14. SELECT * FROM `article` WHERE `id` < 462060 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001906s ]
  15. SELECT * FROM `article` WHERE `id` < 462060 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004324s ]
0.117266s