跳到主要内容

7.2 从 v7 升级到 v8

v8 统一了入口和 Wrapper 命名,补充了 Table 直接 CRUD、批量结果模型和插件化操作选项。升级应以编译错误和回归测试为主,不要把旧示例机械替换后直接上线。

1. 升级依赖

Spring Boot:

<dependency>
<groupId>top.dlzio</groupId>
<artifactId>dlz-db-spring-boot-starter</artifactId>
<version>8.0.0</version>
</dependency>

Solon:

<dependency>
<groupId>top.dlzio</groupId>
<artifactId>dlz-db-solon-plugin</artifactId>
<version>8.0.0</version>
</dependency>

框架无关的手动集成使用 top.dlzio:dlz-db-core:8.0.0

2. 统一门面和 Wrapper

当前门面字段均为小写:

DB.pojo
DB.table
DB.jdbc
DB.sql
DB.batch
DB.ds
DB.tx
DB.config

Wrapper 入口统一为:

操作v8 入口
查询selectWrapper(...)
插入insertWrapper(...)
更新updateWrapper(...)
删除deleteWrapper(...)

selectWrapper(conditionBean)deleteWrapper(conditionBean) 等根据条件实体创建 Wrapper 的旧重载已移除。改为传入实体类型,再显式追加条件:

User user = DB.pojo.selectWrapper(User.class)
.eq(User::getId, id)
.queryBean();

3. 查询和条件命名

  • 查询投影使用 .select(...),不使用旧 .columns(...)
  • 复合条件使用 .ands(...).ors(...),不使用 .and(...).or(...)
  • .ors(...) 表示 lambda 内部条件使用 OR,整组与外层条件仍按 AND 连接。
  • in/notIn 优先传 CollectionObject[]、CSV 字符串或 sql:子查询Number 标量虽然可用,但单值应写 eq/ne,不要传原生类型数组。
List<User> users = DB.pojo.selectWrapper(User.class)
.select(User::getId, User::getName)
.eq(User::getStatus, 1)
.ors(o -> o.like(User::getName, keyword)
.like(User::getMobile, keyword))
.queryBeanList();

4. 返回模型

  • 分页类位于 com.dlz.db.model.Page,不是旧 modal 包,也不是 MyBatis-Plus IPage
  • 当前页数据使用 getRecords()records(),不使用 getRows()
  • count() 返回 long
  • queryOne/queryBean 是严格单条,多行时抛出非唯一结果异常;只取第一条时使用 queryFirst/queryFirstBean
  • DB.batch.* 返回 BatchResult,使用 isSuccess()status()failedPositions()cause() 判断结果。

5. 写操作

直接 CRUD 立即执行;更新和删除 Wrapper 必须以 .execute() 结束:

DB.pojo.insert(user);
DB.pojo.updateById(user);
DB.pojo.deleteById(User.class, id);

int affected = DB.pojo.updateWrapper(User.class)
.set(User::getStatus, 2)
.eq(User::getId, id)
.execute();

DbJdbc.insert/update/deleteDbSql.insert/update/delete 已统一为 execute

v8 新增 DB.table.insertinsertWithAutoKeyinsertOrUpdateselectById(s)deleteById(s) 等直接 API。insertOrUpdate 只是根据主键是否为空选择 INSERT/UPDATE,不是数据库原子 Upsert。

6. 逻辑删除

逻辑删除改由插件和操作选项参与 SQL 构建,但业务代码仍通过配置字段、DeleteOption.PHYSICAL 或 PojoDelete .physical() 使用。

升级时必须增加无条件写操作检查:逻辑删除自动加入的 deleted = 0 会让 WHERE 非空,因此不能依赖空 WHERE 兜底阻止全表更新或删除。

7. Spring Boot 和 Solon

  • Spring Boot Starter 自动绑定 dlz.db.* 并使用容器 DataSource,不需要继承 DLZ-DB 配置类。
  • 删除项目中对 SpringDlzDbConfigSpringDlzDbProperties 等旧类名的引用。
  • Solon 插件通过 SPI 自动加载,但容器必须有 DataSource Bean。
  • DB.ds.use(...) 只切换数据源;事务使用框架注解或 DB.tx

8. API 和实现边界

业务代码应限制在 API、SPI 与实现边界 明确的稳定 API 中。删除新出现的 com.dlz.db.internal.* import;IDE 能补全到 internal 类型不代表兼容承诺。

自定义方言、执行器或插件需要逐项核对 8.0 SPI。特别是底层执行器和 schema 接口仍存在实现类型泄漏,第三方适配层应锁定具体版本并执行集成测试。

9. 升级检查清单

  • 所有依赖版本统一为 8.0。
  • 入口字段为小写,Wrapper 入口使用 *Wrapper 命名。
  • 已替换 .columns/.and/.or/setPage 等旧调用。
  • PageBatchResultcount() 返回类型已修正。
  • JDBC/预设 SQL 写操作统一为 execute
  • 每个 UPDATE/DELETE Wrapper 都有明确业务条件。
  • 主键策略显式核对,数据库自增使用 IdType.AUTO
  • Spring/Solon 自动装配和数据源来源已验证。
  • 没有新增 internal 依赖。
  • 已运行单元测试、事务集成测试以及目标数据库回归。

构建和 JDK 矩阵以根目录 TESTING.md 为准。