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 中央存储库中找到最新版本的activejdbc 和mysql 连接器工件。
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. 连接到数据库
提供了两个类——Base和DB——来连接数据库。
连接数据库的最简单方法是:
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://host/organization", "user", "xxxxx");
当模型在运行时,它们利用在当前线程中找到的连接。在任何 DB 操作之前,此连接由Base或DB类放在本地线程上。
上述方法允许使用更简洁的 API,无需像其他 Java ORM 中那样使用 DB Session 或 Persistence 管理器。
让我们看看如何使用DB类连接到数据库:
new DB("default").open(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost/dbname",
"root",
"XXXXXX");
如果我们看看Base和DB用于连接数据库的不同之处,它有助于我们得出结论,如果在单个数据库上操作应该使用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 等数据库。