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优先传Collection、Object[]、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-PlusIPage。 - 当前页数据使用
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/delete 和 DbSql.insert/update/delete 已统一为 execute。
v8 新增 DB.table.insert、insertWithAutoKey、insertOrUpdate、selectById(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 配置类。 - 删除项目中对
SpringDlzDbConfig、SpringDlzDbProperties等旧类名的引用。 - Solon 插件通过 SPI 自动加载,但容器必须有
DataSourceBean。 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等旧调用。 -
Page、BatchResult和count()返回类型已修正。 - JDBC/预设 SQL 写操作统一为
execute。 - 每个 UPDATE/DELETE Wrapper 都有明确业务条件。
- 主键策略显式核对,数据库自增使用
IdType.AUTO。 - Spring/Solon 自动装配和数据源来源已验证。
- 没有新增 internal 依赖。
- 已运行单元测试、事务集成测试以及目标数据库回归。
构建和 JDK 矩阵以根目录 TESTING.md 为准。