跳到主要内容

6.1 公共 API

本页汇总 DLZ-DB 8.0 面向业务代码的公开入口。它是使用索引,不替代源码签名,也不罗列实现包中的类型。AI 生成代码时应优先读取 DLZ-DB AI 编程速读

1. 统一入口

入口用途
DB.pojo基于实体类和 Lambda 的 CRUD,默认首选
DB.table基于表名和 JSONMap/ResultMap 的动态表操作
DB.jdbc使用 ? 占位符的一次性 SQL
DB.sql使用 #{key} 参数的预设 SQL/Key-SQL
DB.batchPojo、表数据或原生 SQL 批处理
DB.ds数据源注册、切换、查询和移除
DB.tx当前或指定数据源上的编程式事务
DB.config插件、方言、预设 SQL 和底层执行器配置

2. Pojo API

2.1 直接 CRUD

User inserted = DB.pojo.insert(user);
User saved = DB.pojo.insertOrUpdateById(user);
User one = DB.pojo.selectById(User.class, id);
List<User> list = DB.pojo.selectByIds(User.class, ids);
int updated = DB.pojo.updateById(user);
int deleted = DB.pojo.deleteById(User.class, id);
boolean exists = DB.pojo.existsById(User.class, id);
  • selectByIdsdeleteByIds 支持 Collection<?> 或 CSV 字符串。
  • add(entity)save(entity) 为已废弃别名;新代码使用 insertinsertOrUpdateById
  • 写入可传 DbOption...,如 InsertOption.INCLUDE_NULLUpdateOption.INCLUDE_NULLDeleteOption.PHYSICAL

2.2 Pojo Wrapper

PojoQuery<User> query = DB.pojo.selectWrapper(User.class);
PojoInsert<User> insert = DB.pojo.insertWrapper(user);
PojoUpdate<User> update = DB.pojo.updateWrapper(User.class);
PojoDelete<User> delete = DB.pojo.deleteWrapper(User.class);

常用查询:

User one = DB.pojo.selectWrapper(User.class)
.select(User::getId, User::getName)
.eq(User::getStatus, 1)
.queryBean();

Page<User> page = DB.pojo.selectWrapper(User.class)
.orderByDesc(User::getCreateTime)
.page(1, 20)
.queryBeanPage();

常用写操作:

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

int deleted = DB.pojo.deleteWrapper(User.class)
.eq(User::getId, id)
.execute();

int physicalDeleted = DB.pojo.deleteWrapper(User.class)
.eq(User::getId, id)
.physical();

Wrapper 写操作应始终带明确业务条件。当最终 WHERE 为空时,当前构建器会生成 WHERE false;但逻辑删除插件注入的 deleted = 0 也会被视为 WHERE,所以这不是“无业务条件一定拒绝”的强安全保证。

3. Table API

3.1 直接 CRUD

方法返回值
insert(table, values, options...)影响行数 int
insertWithAutoKey(table, values, options...)自增主键 Long
insertOrUpdate(table, values, options...)影响行数 int
selectById(table, id, options...)ResultMap
selectByIds(table, ids)List<ResultMap>
updateById(table, values, options...)影响行数 int
deleteById/deleteByIds影响行数 int

3.2 Table Wrapper

List<ResultMap> rows = DB.table.selectWrapper("user")
.select("id", "name")
.eq("status", 1)
.queryList();

int updated = DB.table.updateWrapper("user")
.set("status", 2)
.eq("id", id)
.execute();

可用 Wrapper:TableQueryTableInsertTableUpdateTableDeleteinsertWrapper/updateWrapper 还提供 .batch(...) 批处理。

4. JDBC 与预设 SQL

4.1 JDBC

ResultMap one = DB.jdbc.one("SELECT * FROM user WHERE id = ?", id);
List<User> list = DB.jdbc.list(
"SELECT * FROM user WHERE status = ?", User.class, 1);
long count = DB.jdbc.count("SELECT * FROM user WHERE status = ?", 1);
Page<User> page = DB.jdbc.page(
"SELECT * FROM user WHERE status = ?",
PageRequest.of(1, 20), User.class, 1);
int affected = DB.jdbc.execute("UPDATE user SET status = ? WHERE id = ?", 2, id);
  • one 是严格单条,first 是取第一条。
  • 链式入口是 selectWrapper(...)executeWrapper(...),对应类是 JdbcSelectJdbcExecute
  • JdbcExecute.executeAndReturnId() 返回自增主键 Long
  • count()page() 会自动从 SELECT 改写 count SQL;当前原生 SQL 改写要求存在大写 FROM,复杂 GROUP BY / DISTINCT / UNION 应使用经过验证的显式 SQL。

4.2 预设 SQL

List<User> users = DB.sql.selectWrapper("key.user.findActive")
.addPara("status", 1)
.queryList(User.class);

int affected = DB.sql.execute(
"key.user.disable", new JSONMap("id", id));
  • 链式入口是 SqlQuerySqlExecute
  • 直接入口提供 onefirstlistcountexecute
  • DB.sql 目前没有与 DB.jdbc.page(...) 对称的直接分页方法;分页时使用 selectWrapper(...).page(...).queryPage(...)
  • 类路径预设 SQL 从 classpath*:sql/<sqllist>.sql 读取,默认 sqllistapp/*。文件扩展名是 .sql,文件内容使用 <sqlList> XML 结构。

5. 条件、排序与分页

5.1 条件

常用条件包括:

  • eq/ne/gt/ge/lt/le
  • isNull/isNotNull
  • in/notIn
  • between/notBetween
  • like/likeLeft/likeRight/notLike
  • sql(sql, JSONMap) 自定义命名参数片段
  • ands(consumer)ors(consumer) 复合条件
List<User> rows = DB.pojo.selectWrapper(User.class)
.eq(User::getStatus, 1)
.ors(o -> o.like(User::getName, keyword)
.like(User::getMobile, keyword))
.queryBeanList();

ors(...) 表示 lambda 内部用 OR 连接,整组与外层仍按 AND 连接;它不等同于 MyBatis-Plus 的同名语义。

5.2 排序与分页

Page<User> page = DB.pojo.selectWrapper(User.class)
.orderByAsc(User::getName)
.orderByDesc(User::getCreateTime)
.page(1, 20)
.queryBeanPage();
  • Wrapper 支持 page(Page)page(current, size, Order...)limit(size)sort(...)
  • Page<T> 字段包括 currentsizetotalpagesrecords,也提供 pageNo()pageSize()hasNext() 等简洁方法。
  • 当前 Page.setSize 会把页大小上限限制为 5000。

6. 查询返回类型

方法返回类型
queryOne/queryFirstResultMap
queryList/queryPageList<ResultMap> / Page<ResultMap>
queryOne(Class)/queryFirst(Class)指定 Bean
queryList(Class)/queryPage(Class)指定 Bean 列表/分页
queryBean/queryFirstBeanPojo Wrapper 绑定的实体类
queryBeanList/queryBeanPagePojo 列表/分页
queryStr/Long/Int/Double单列单值
queryStrList/queryLongList/queryIntList/queryDoubleList单列列表
countlong

queryOne/queryBean 在多条时抛出非唯一结果异常;queryFirst/queryFirstBean 只取第一条。

7. 批量操作

BatchResult r1 = DB.batch.insert(users);
BatchResult r2 = DB.batch.update(users, 500);
BatchResult r3 = DB.batch.insert("user", values, 500);
BatchResult r4 = DB.batch.execute(sql, params, 500);

if (!r1.isSuccess()) {
log.warn("batch status={}, failed={}", r1.status(), r1.failedPositions());
}

BatchResult 对外提供 totalItems()batchSize()batchCount()completedBatches()knownAffectedRows()unknownAffectedRows()failedPositions()status()cause()isSuccess()

8. 事务与数据源

DB.ds.use("slave", () -> DB.pojo.selectById(User.class, id));

DB.tx.run(() -> {
DB.pojo.insert(order);
DB.pojo.insert(orderItem);
});

DB.tx.run("slave", () -> {
// 在 slave 数据源上开启事务
});
  • DB.ds.use(...) 只切换数据源,不自动开启事务。
  • DB.ds 还提供 setDefaultDataSourcesetDataSourceremoveDataSourcetestConnectiongetAllDataSourceNames 等方法。
  • 多数据源切换不是分布式事务。

9. 继续阅读