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>

最新版 activejdbcmysql 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. 连接数据库

提供 BaseDB 两个类处理连接:

单数据库场景(推荐使用 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 获取。


原始标题:Introduction to ActiveJDBC