Contents

ActiveJDBC简介

1. 简介

ActiveJDBC 是一个轻量级的 ORM,它遵循ActiveRecord的核心思想,它是 Ruby on Rails 的主要 ORM。

它侧重于**通过删除典型持久性管理器的额外层来简化与数据库的交互,**并侧重于 SQL 的使用,而不是创建新的查询语言。

此外,它通过DBSpec类为数据库交互提供了自己的编写单元测试的方式。

让我们看看这个库与其他流行的 Java ORM 有何不同以及如何使用它。

2. ActiveJDBC 与其他 ORM

与大多数其他 Java ORM 相比,ActiveJDBC 有明显的不同。它从数据库中推断出 DB 模式参数,从而无需将实体映射到基础表。

没有会话,没有持久性管理器,不需要学习新的查询语言,没有 getter/setter。库本身在大小和依赖数量方面很轻。

该实现鼓励使用在执行测试后由框架清理的测试数据库,从而降低维护测试数据库的成本。

但是,每当我们创建或更新模型时,都需要一些额外的检测步骤 。我们将在接下来的部分讨论这个问题。

3. 设计原则

  • 从数据库推断元数据
  • 基于约定的配置
  • 没有会话,没有“附加,重新附加”
  • 轻量级模型,简单 POJO
  • 无代理
  • 避免贫血域模型
  • 不需要 DAO 和 DTO

4. 建立图书馆

使用 MySQL 数据库的典型 Maven 设置包括:

<dependency>
    <groupId>org.javalite</groupId>
    <artifactId>activejdbc</artifactId>
    <version>1.4.13</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.34</version>
</dependency>

可以在 Maven 中央存储库中找到最新版本的activejdbcmysql 连接器工件。

Instrumentation 是简化的代价,在处理 ActiveJDBC 项目时需要。

有一个仪器插件需要在项目中配置:

<plugin>
    <groupId>org.javalite</groupId>
    <artifactId>activejdbc-instrumentation</artifactId>
    <version>1.4.13</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类。

该库使用英语的变形 来实现名词的复数和单数形式的转换。这可以使用*@Table*注释覆盖。

让我们看看一个简单的模型是什么样子的:

import org.javalite.activejdbc.Model;
public class Employee extends Model {}

5.2. 连接到数据库

提供了两个类——BaseDB——来连接数据库。

连接数据库的最简单方法是:

Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://host/organization", "user", "xxxxx");

当模型在运行时,它们利用在当前线程中找到的连接。在任何 DB 操作之前,此连接由BaseDB类放在本地线程上。

上述方法允许使用更简洁的 API,无需像其他 Java ORM 中那样使用 DB Session 或 Persistence 管理器。

让我们看看如何使用DB类连接到数据库:

new DB("default").open(
  "com.mysql.jdbc.Driver", 
  "jdbc:mysql://localhost/dbname", 
  "root", 
  "XXXXXX");

如果我们看看BaseDB用于连接数据库的不同之处,它有助于我们得出结论,如果在单个数据库上操作应该使用Base ,而DB应该与多个数据库一起使用。

5.3. 插入记录

向数据库中添加记录非常简单。如前所述,不需要 setter 和 getter:

Employee e = new Employee();
e.set("first_name", "Hugo");
e.set("last_name", "Choi");
e.saveIt();

或者,我们可以通过这种方式添加相同的记录:

Employee employee = new Employee("Hugo","Choi");
employee.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();

如果我们想从级联到子表的主表中删除一条记录,请使用deleteCascade

Employee employee = Employee.findFirst("first_name = ?","Hugo");
employee.deleteCascade();

5.6. 获取记录

让我们从数据库中获取一条记录:

Employee e = Employee.findFirst("first_name = ?", "Hugo");

如果我们想获取多条记录,我们可以使用where方法:

List<Employee> employees = Employee.where("first_name = ?", "Hugo");

6. 事务支持

在 Java ORM 中,存在显式连接或管理器对象(JPA 中的 EntityManager、Hibernate 中的 SessionManager 等)。ActiveJDBC 中没有这样的东西。

调用*Base.open()打开一个连接,将其附加到当前线程,因此所有模型的所有后续方法都重用此连接。调用Base.close()*关闭连接并将其从当前线程中删除。

为了管理事务,有几个方便的调用:

开始事务:

Base.openTransaction();

提交事务:

Base.commitTransaction();

回滚事务:

Base.rollbackTransaction();

7. 支持的数据库

最新版本支持 SQLServer、MySQL、Oracle、PostgreSQL、H2、SQLite3、DB2 等数据库。