1. 简介
ActiveJDBC 是一个轻量级 ORM 框架,核心思想借鉴了 Ruby on Rails 的 ActiveRecord 模式。
它通过移除传统持久化管理器的额外层来简化数据库交互,并专注于使用原生 SQL 而非创建新的查询语言。
此外,它通过 DBSpec 类提供了数据库交互的单元测试方案。
接下来我们看看这个库与其他主流 Java ORM 的区别以及如何使用它。
2. ActiveJDBC 与其他 ORM 的对比
ActiveJDBC 与大多数 Java ORM 存在显著差异。它直接从数据库推断表结构参数,无需手动映射实体与表的关系。
✅ 无会话、无持久化管理器
✅ 无需学习新查询语言
✅ 无需 getter/setter 方法
✅ 依赖少、体积轻
⚠️ 但有个小代价:创建或更新模型时需要执行字节码增强,后续章节会详解。
该框架鼓励使用测试数据库,并在测试执行后自动清理,大幅降低测试数据库维护成本。
3. 设计原则
- 从数据库推断元数据
- 基于约定的配置
- 无会话、无"附加/重新附加"操作
- 轻量级模型,简单 POJO
- 无代理机制
- 避免贫血领域模型
- 不需要 DAO 和 DTO
4. 环境搭建
使用 MySQL 的典型 Maven 配置:
<dependency>
<groupId>org.javalite</groupId>
<artifactId>activejdbc</artifactId>
<version>3.4-j11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
最新版 activejdbc 和 mysql connector 可在 Maven Central 获取。
字节码增强是简化设计的代价,必须配置以下插件:
<plugin>
<groupId>org.javalite</groupId>
<artifactId>activejdbc-instrumentation</artifactId>
<version>3.4-j11</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>instrument</goal>
</goals>
</execution>
</executions>
</plugin>
最新版 activejdbc-instrumentation 插件同样在 Maven Central。
执行以下命令触发增强:
mvn process-classes
# 或
mvn activejdbc-instrumentation:instrument
5. 使用 ActiveJDBC
5.1. 定义模型
只需继承 Model 类即可创建模型:
import org.javalite.activejdbc.Model;
public class Employee extends Model {}
👉 框架通过英语单词变形规则自动转换单复数(如 Employee → employees 表),可用 @Table 注解覆盖默认规则。
5.2. 连接数据库
提供 Base 和 DB 两个类处理连接:
单数据库场景(推荐使用 Base):
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://host/organization", "user", "xxxxx");
多数据库场景(使用 DB):
new DB("default").open(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost/dbname",
"root",
"XXXXXX");
💡 模型会自动使用当前线程的连接,无需像其他 ORM 那样管理会话或持久化上下文。
5.3. 插入记录
无需 getter/setter,操作简单粗暴:
Employee e = new Employee();
e.set("first_name", "Hugo");
e.set("last_name", "Choi");
e.saveIt();
或链式调用:
new Employee()
.set("first_name", "Hugo", "last_name", "Choi")
.saveIt();
5.4. 更新记录
先查询再修改:
Employee employee = Employee.findFirst("first_name = ?", "Hugo");
employee
.set("last_name","Choi")
.saveIt();
5.5. 删除记录
Employee e = Employee.findFirst("first_name = ?", "Hugo");
e.delete();
批量删除:
Employee.deleteAll();
级联删除(主表删除时同步删除子表):
Employee employee = Employee.findFirst("first_name = ?","Hugo");
employee.deleteCascade();
5.6. 查询记录
查询单条记录:
Employee e = Employee.findFirst("first_name = ?", "Hugo");
查询多条记录:
List<Employee> employees = Employee.where("first_name = ?", "Hugo");
6. 事务支持
没有显式的连接或管理对象(如 JPA 的 EntityManager)。事务通过线程绑定的连接管理:
Base.openTransaction(); // 开启事务
// ... 执行操作
Base.commitTransaction(); // 提交
// 或
Base.rollbackTransaction(); // 回滚
📌 Base.open() 会将连接绑定到当前线程,所有模型复用此连接;Base.close() 则关闭并移除连接。
7. 支持的数据库
当前版本支持:SQLServer、MySQL、Oracle、PostgreSQL、H2、SQLite3、DB2。
8. 总结
本文快速介绍了 ActiveJDBC 的核心特性和基础用法。完整示例代码可在 GitHub 获取。