使用 NW.ORM 简化 ORM






4.33/5 (3投票s)
NW.ORM,一个用于处理 Hibernate 的辅助框架。
目录
引言
在实现与数据库相关的软件时,对于像我这样的普通 Java 开发人员在使用 hibernate 时,通常会发生以下操作。
- 添加 hibernate 依赖
- 创建所需的实体
- 将实体映射添加到配置文件
- 实现 Session Factory Builder
- 实现一个服务层来查询系统(可能为每个实体创建 DAO)
- 在服务层实现 CRUD 方法
- 开始编写应用程序.....
问题不在于要做的事情数量,而在于每次出现新项目时所需的重复程度。此外,多个开发人员的项目通常趋向于不同的实现,每个开发人员都按照自己认为最好的方式处理数据库会话。在处理多个数据库时,需要开发人员重新实现系统的某些方面。
NW.ORM 旨在通过创建统一且可重用的方法来简化数据库访问,从而实现需要数据库访问的软件。让开发人员有更多时间专注于实际的项目工作。该框架底层使用 hibernate 库进行数据库事务。
NW.ORM 提供什么
- 所有数据库事务的单一接口。不需要多个数据访问对象。
- 在同一应用程序中同时处理多个数据库
- 使用 Hibernate Criteria、HQL 或 SQL 查询
- 支持基于 JPA 和基于 HBM 文件的配置
- 返回适当的类对象,无需强制类型转换
- 提供映射的超类,用于快速创建基于 JPA 的实体
如何使用
使用该框架
依赖项
NW.ORM 具有以下依赖项
- Hibernate 框架
- Neemworks Commons
- Slf4j Logger
Hibernate 和 slf4j 依赖项可以从它们各自的网站下载,而 Neemworks commons 可在 NW.ORM sourceforge 文件目录中找到。
设置开发环境
只需将 NW.ORM jar 文件及其依赖项添加到您的项目类路径中。
设置好项目类路径后,就可以开始实际使用了。基本上,要开始使用数据库,通常需要先创建必要的实体对象。您可以扩展 REntity
对象或 IEntity
,而不是从头开始。REntity
提供基于 UUID 的主键,而 IEntity
提供 Long
类型的。它还提供了我的一些方法,例如能够在运行时获取目标数据库 TABLE
(不一定需要与对象名称匹配)的名称。请参见下面的代码片段。
定义和映射实体
@Entity
@Table(name = "ACCESS_TOKEN")
public class AccessToken extends REntity {
private static final long serialVersionUID = -5221279551618337736L;
}
所有实体都必须在 hibernate 配置文件中进行映射,这是 hibernate 所必需的。在需要访问多个数据库的情况下,允许多个配置。下面是一个使用 PostgreSQL 数据库的示例配置文件,映射了 4 个实体。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.format_sql">false</property>
<property name="use_sql_comments">false</property>
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">false</property>
<property name="hibernate.dialect">
org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">
org.postgresql.Driver</property>
<property name="hibernate.connection.url">
jdbc:postgresql://:5432/**db</property>
<property name="hibernate.connection.username">**d**</property>
<property name="hibernate.connection.password">*minds</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">30</property> <!-- seconds -->
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<!-- add classes to map from here -->
<mapping class="com.nw.napi.model.NUser" />
<mapping class="com.nw.napi.model.NimblarClient" />
<mapping class="com.nw.napi.model.AccessToken" />
<mapping class="com.nw.napi.model.ReleaseNotificationRequest" />
</session-factory>
</hibernate-configuration>
对于非 JPA 配置(即基于 hbm 的配置),只需要在类路径中添加适当的 hibernate 配置文件。
查询
此时,要初始化特定数据库的服务层,其配置文件名为 hibernate.cfg.xml。需要一个 REntityManager
实例,如下所示。
// Create an instance
REntityManager rm = REntityManager.getInstance("hibernate.cfg.xml");
如果需要多个数据库配置,可以重复此操作。请参见下面的代码片段,这是一个使用配置文件 text.cfg.xml 的另一个配置。
// Create an instance
REntityManager rmText = REntityManager.getInstance("text.cfg.xml");
REntityManager
为所有实体提供基本的 CRUD 操作。
// Create Sample Entity RAUdit
RAudit ra = new RAudit();
ra.setSourceMachine("mac");
rm.create(ra);
rm.update(ra);
rm.remove(ra);
下面显示了查询数据库的示例方法。
查询 sourceMachine
列值为 mac 的表,该方法接受一个结果类以启用适当的返回类型。
// Find By Criteria
RAudit audit = rm.getByCriteria(RAudit.class, Restrictions.eq("sourceMachine", "mac"));
System.out.println(audit.getSourceMachine());
HQL 查询示例
// Find By HQL
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("sa", "mac");
RAudit audit2 = rm.getByHQL("FROM RAudit r where
r.sourceAddress = :sa", parameters, RAudit.class);
System.out.println(audit2.getSourceMachine());
列表结果可以使用 getListxxxxxx 方法返回,如下所示。
// Find All List
List<RAudit> laudits = rm.getListByCriteria(RAudit.class);
// Find List by conditions
List<RAudit> lauditsc = rm.getListByCriteria(RAudit.class,
Restrictions.eq("sourceMachine", "mac"),
Restrictions.eq("sourceMachinePublic", "mac"));
按条件查询
可以根据需要构建各种条件,并将其传递给按条件查询方法。此方法可以接受 Java varargs
允许的任意数量的限制条件。
// Find By Criteria
RAudit audit = rm.getByCriteria(RAudit.class, Restrictions.eq
("sourceMachine", "mac"), Restrictions.eq("sourceMachineId", "23-A"));
System.out.println(audit.getSourceMachine());
按 HQL 查询
按 HQL 查询是通过 getByHQL
方法实现的,参数在哈希图中指定(参数名称和值)。
// Find By HQL
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("sa", "mac");
RAudit audit2 = rm.getByHQL("FROM RAudit r
where r.sourceAddress = :sa", parameters, RAudit.class);
System.out.println(audit2.getSourceMachine());
许可证
本文没有明确的许可证附加到它,但可能包含在文章文本或下载文件本身中的使用条款。如有疑问,请通过下面的讨论区联系作者。