阅读提示:
- 适合对象:正在将存量 DAO/Mapper 迁移到统一 Repository 的项目
- 建议前置:先阅读
API_CONTRACT.md明确稳定语义 - 若还未跑通最小示例:先看
QUICKSTART.md
将历史 IDatabaseOperations 直调代码与 MyBatis-Plus 仓储调用,统一重构为 @MuYunRepository + EntityDao。
适用边界:
- 单表高频 CRUD / 条件查询 / 分页。
- 特例 SQL(显式 SQL 注解方法)使用同一仓库接口中的 Jdbi SQL Object 注解(
@SqlQuery/@SqlUpdate)。 - 多表复杂 SQL 不强行抽象为
EntityDao。
- 先定义
@MuYunRepository接口并继承EntityDao<T, ID>。 - 将 service 对
mapper/db的依赖替换为entityDao。 - 替换单表 CRUD、查询、分页、count、exists。
- 将特例 SQL 迁到同一仓库接口的 Jdbi 注解方法(
@SqlQuery/@SqlUpdate)。 - 配置并验证表结构拉齐策略(全局 + 仓库覆盖)。
说明:若仓库继承 EntityDao<T, ID>,特例 SQL 的 @SqlQuery 返回 T / List<T> 默认会自动映射,无需再加 @RegisterBeanMapper(T.class)。若列名与属性名不一致,请在 SQL 中使用别名对齐。
| 旧接口(IDatabaseOperations) | 新接口(EntityDao) |
|---|---|
new TableBuilder(db).build(Entity.class) |
entityDao.ensureTable() |
db.insertItem("table", map) |
entityDao.insert(entity) |
db.getItem("table", id) |
entityDao.findById(id) |
db.updateItem("table", map) |
entityDao.updateById(entity) |
db.upsertItem("table", map) |
entityDao.upsert(entity) |
db.deleteItem("table", id) |
entityDao.deleteById(id) |
db.getItem("table", id) != null |
entityDao.existsById(id) |
| 手工分页查询 SQL | entityDao.query(...) / entityDao.pageQuery(...) |
手工 count(*) SQL |
entityDao.count(criteria) |
db.query(sql, params)(复杂场景) |
同一仓库内 Jdbi SQL 注解方法 |
class UserService {
private final UserDao userDao;
}
@MuYunRepository(alignTable = MuYunRepository.AlignTable.DEFAULT)
interface UserDao extends EntityDao<UserEntity, String> {
}| MyBatis-Plus | Muyun Repository |
|---|---|
baseMapper.insert(entity) |
entityDao.insert(entity) |
baseMapper.updateById(entity) |
entityDao.updateById(entity) |
baseMapper.selectById(id) |
entityDao.findById(id) |
baseMapper.deleteById(id) |
entityDao.deleteById(id) |
baseMapper.insertOrUpdate(entity)(业务封装) |
entityDao.upsert(entity) |
selectCount(wrapper) |
entityDao.count(criteria) |
selectById(id) != null |
entityDao.existsById(id) |
| QueryWrapper | Criteria |
|---|---|
eq("v_name", name) |
Criteria.of().eq("v_name", name) |
ne("status", 0) |
.ne("status", 0) |
gt("age", 18) |
.gt("age", 18) |
like("name", "ali%") |
.like("name", "ali%") |
in("id", ids) |
.in("id", ids) |
between("age", 18, 30) |
.between("age", 18, 30) |
| MyBatis-Plus | Muyun Repository |
|---|---|
Page<T> page = new Page<>(pageNum, pageSize) |
PageRequest.of(pageNum, pageSize) |
selectPage(page, wrapper) |
entityDao.pageQuery(criteria, pageRequest, sorts...) |
IPage.getRecords() |
PageResult.getRecords() |
IPage.getTotal() |
PageResult.getTotal() |
orderByAsc("i_age") |
Sort.asc("i_age") |
orderByDesc("create_time") |
Sort.desc("create_time") |
说明:entityDao.page(...) 是 entityDao.pageQuery(...) 的别名。
- 全局配置:
muyun.database.repository-schema-mode=NONE|ENSURE。 - 仓库覆盖:
@MuYunRepository(alignTable = DEFAULT|ENABLED|DISABLED)。 - 优先级:仓库显式配置优先于全局,
DEFAULT跟随全局。
- MySQL/PostgreSQL 均跑通
ensureTable + CRUD + query/pageQuery/count。 @Transactional中EntityDao与 Jdbi SQL 注解方法同边界回滚。repository-schema-mode与alignTable组合行为符合预期。
下一步:迁移完成后,回到 ROADMAP.md 对齐后续能力优先级与技术债计划。