用于只读数据库的java ORM

问题描述 投票:0回答:8

我了解 hibernate,但我想知道是否有一个更轻的 ORM 引擎用于 只读 数据库。我的意思是,我不需要一些事务查询或更新一些记录。另一方面,我需要处理一些大的记录列表:

List<MyRecord> list= object.getMyRecords(); // list.size() > 1E7

这样的发动机存在吗? 非常感谢,

皮埃尔

java database forms readonly
8个回答
2
投票

你可以查看JIRM(是的,这是一个无耻的插件),这是一个专注于使用不可变对象的 ORM。

它位于 Spring JDBC 之上,因此,如果您使用 Spring,尝试它的风险非常低。

它还有非常好的 SQL 占位符模板,不需要 Spring。

您应该检查的另一个项目是jOOQ


2
投票

我认为你应该考虑 MyBatis (IBatis 3) ORM 库。它满足从轻量级工作到一些大批量执行的要求。因此,它将非常适合您当前的需求,并且当您需要底层 ORM 库中的一些繁重工作时,它不会让您失望。


1
投票

如果您正在寻找轻量级 ORM 框架,那么OrmLite就是最好的选择。它可以让您避免设置 Hibernate 等更复杂的 ORM 框架的大部分开销。该框架的缺点是它不支持标准 JPA 注释,因此以后将此 ORM 替换为不同的 ORM 并不容易。

我建议尝试OpenJPA,这是一个由 Apache 基金会维护的符合 JPA 标准的 ORM 框架。它是Hibernate的主要竞争对手之一。它的设置确实需要更多的开销,但它的优点是,如果它不再满足您的需求,您可以在将来将其更换为不同的 JPA 兼容框架(例如 Hibernate)。

这两个框架也是开源的,这始终是使用它们的一个很好的理由。


1
投票

大约一年前,我也在 lite ORM 中搜索了一个项目。并尝试了其中几个。我对所有解决方案都有点不满意,因为每个解决方案都试图朝某个方向前进。

Hibernate 非常庞大,当您只需要简单的解决方案时,它可能会带来额外的麻烦。目前我正在开发一个不错的项目,它在表格上使用了很少的自定义层。

您可以尝试使用 Active Record 或表网关等模式,通过 JDBC 在数据库上实现一个小层。

任何 ORM 解决方案只是试图非常统一,并为您的项目添加额外的内容。但是您可以创建自己的自定义无层解决方案 - 如果您的数据库有预定义的一组表并且不会经常更改其结构,那么这将特别有效。


1
投票

看看Ebeans,这是一个轻量级 ORM 工具:

  • 重用 JPA 注释(@Entity、@OneToMany ...)进行映射。
  • 使用Session Less架构(即具有比 JPA 更简单的 API)。
  • 支持不可变值对象。
  • 允许使用ORM或关系功能
  • 声称提供良好的大查询支持

在我看来值得一看。


0
投票

Spring 的 SimpleJDBCTemplate 与结果映射器相结合,在只读场景中为我带来了奇迹,您不会获得 Hibernate 不必要的开销,所有伪 ORM 映射都捆绑在一起,这对于此类场景来说是真正的胜利。


0
投票

如果您正在寻找轻量级 ORM,我会推荐 jORM。请注意,我的回答是有偏见的,因为我是该项目的贡献者之一。

我们决定编写一个轻量级替代方案的主要原因是(需要):

  • 无眩配置
  • 清晰的交易定义
  • 内存管理和速度
  • 简单的代码生成
  • 手动调整SQL

简而言之;发展迅速。

配置示例

DataSource dataSource = new DataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost:5432/moria");
dataSource.setUsername("gandalf");
dataSource.setPassword("mellon");

Database.configure("moria", dataSource); // now there's a named database

示例记录

@Jorm(database="moria", table="goblins", id="id")
public class Goblin extends Record {  
    public Integer getId() {
        return get("id", Integer.class);
    }
    public void setId(Integer id) {
        set("id", id);
    }
    public Integer getTribeId() {
        return get("tribe_id", Integer.class);
    }
    public void setTribeId(Integer id) {
        set("tribe_id", id);
    }
    public Tribe getTribe() {
        return get("tribe_id", Tribe.class);
    }
    public void setTribe(Tribe tribe) {
        set("tribe_id", tribe);
    }
    public String getName() {
        return get("name", String.class);
    }
    public void setName(String name) {
        set("name", name);
    }
}

映射查询示例

Goblin goblin = Record.findById(Goblin.class 42);

List<Goblin> goblins = Record.findAll(Goblin.class);Goblin bolg = Record.find(Goblin.class, new Column("name", "Bolg"));

自定义查询示例

Tribe tribe = new Tribe();
tribe.setId(1);
String name = "Azog";

Goblin azog = Record.select(
    Goblin.class,
    "SELECT * FROM goblins WHERE name = #1# AND tribe_id = #2:id#",
    name, // #1#
    tribe // #2#
);

Goblin bolg = Record.find(Goblin.class, "SELECT * FROM goblins WHERE name = #1#", "Bolg");

0
投票

Bean Searcher 是一个非常轻量级的只读 ORM,专注于高级查询:

专注于高级查询的只读ORM,天然支持链表,消除DTO/VO转换,只需一行代码即可实现复杂的列表检索!

Github: https://github.com/troyzhxu/bean-searcher

文件: https://bs.zhxu.cn/

© www.soinside.com 2019 - 2024. All rights reserved.