我了解 hibernate,但我想知道是否有一个更轻的 ORM 引擎用于 只读 数据库。我的意思是,我不需要一些事务查询或更新一些记录。另一方面,我需要处理一些大的记录列表:
List<MyRecord> list= object.getMyRecords(); // list.size() > 1E7
这样的发动机存在吗? 非常感谢,
皮埃尔
我认为你应该考虑 MyBatis (IBatis 3) ORM 库。它满足从轻量级工作到一些大批量执行的要求。因此,它将非常适合您当前的需求,并且当您需要底层 ORM 库中的一些繁重工作时,它不会让您失望。
大约一年前,我也在 lite ORM 中搜索了一个项目。并尝试了其中几个。我对所有解决方案都有点不满意,因为每个解决方案都试图朝某个方向前进。
Hibernate 非常庞大,当您只需要简单的解决方案时,它可能会带来额外的麻烦。目前我正在开发一个不错的项目,它在表格上使用了很少的自定义层。
您可以尝试使用 Active Record 或表网关等模式,通过 JDBC 在数据库上实现一个小层。
任何 ORM 解决方案只是试图非常统一,并为您的项目添加额外的内容。但是您可以创建自己的自定义无层解决方案 - 如果您的数据库有预定义的一组表并且不会经常更改其结构,那么这将特别有效。
Spring 的 SimpleJDBCTemplate 与结果映射器相结合,在只读场景中为我带来了奇迹,您不会获得 Hibernate 不必要的开销,所有伪 ORM 映射都捆绑在一起,这对于此类场景来说是真正的胜利。
如果您正在寻找轻量级 ORM,我会推荐 jORM。请注意,我的回答是有偏见的,因为我是该项目的贡献者之一。
我们决定编写一个轻量级替代方案的主要原因是(需要):
简而言之;发展迅速。
配置示例
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");
Bean Searcher 是一个非常轻量级的只读 ORM,专注于高级查询:
专注于高级查询的只读ORM,天然支持链表,消除DTO/VO转换,只需一行代码即可实现复杂的列表检索!