orm-demo —— ACE ORM(对标 TypeORM)
演示 ace-orm 模块:声明式实体、仓储模式、真实 SQLite 后端、声明式事务,全程零运行时反射(实体映射由 @Entity 宏编译期生成)。
运行
source scripts/env.sh
cjpm build
./target/release/bin/orm_demo
核心用法
import aceboot::orm.*
import aceboot::framework_macros.*
// 1) 声明实体:@Entity 生成 UserMapper(表/列/DDL/行映射/参数,零反射)
@Entity["users"]
public class User {
@Id public var id: Int64 = 0 // 主键(自增)
@Column public var name: String = "" // 数据列(列名=字段名)
@Column public var age: Int64 = 0
}
// 2) 连接 + 仓储
let ds = DataSource(SqliteDriver(":memory:")) // 或文件路径 "app.db"
setGlobalDataSource(ds) // 供 @Transactional 使用
let repo = Repository<User>(ds, UserMapper())
repo.createTable()
// 3) CRUD(参数化,防注入)
let u = User(); u.name = "alice"; u.age = 30
let id = repo.insert(u) // 返回自增 id 并回填 u.id
repo.findById(DbInt(id)) // ?User
repo.findAll() // Array<User>
repo.findBy("name", DbText("bob")) // 按列等值
repo.update(u); repo.deleteById(DbInt(id)); repo.count()
声明式事务
class UserService {
let repo: Repository<User>
init(repo: Repository<User>) { this.repo = repo }
@Transactional // 成功 commit,抛异常自动 rollback 并重抛
public func addTwo(a: User, b: User): Unit {
repo.insert(a)
repo.insert(b)
}
}
@Transactional 把方法体包进全局数据源的事务。demo 里 addThenFail 插入后抛异常 → 计数不变,证明真实回滚。
设计要点
| 关注点 | 实现 |
|---|---|
| 实体映射 | @Entity 宏生成 XMapper <: EntityMapper<X>,零反射 |
| 仓储 | 泛型 Repository<T>,一份实现服务所有实体(差异在 mapper) |
| 后端 | SqliteDriver 经 FFI 直连 libsqlite3(可换 Driver 接口的其他实现) |
| 安全 | SQL 全参数化(? 占位 + DbValue 绑定) |
| 事务 | @Transactional 织入 runInTransaction(全局数据源) |
可执行模块需链接 sqlite:cjpm.toml 里 link-option = "-lsqlite3"。