ORM全称是:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来。举例来说就是,我定义一个对象,那就对应着一张表,这个对象的实例,就对应着表中的一条记录。
JOOQ 是基于Java访问关系型数据库的工具包。JOOQ 既吸取了传统ORM操作数据的简单性和安全性,又保留了原生sql的灵活性,它更像是介于 ORMS和JDBC的中间层。对于喜欢写sql的码农来说,JOOQ可以完全满足你控制欲,可以是用Java代码写出sql的感觉来。就像官网说的那样 :
get back in control of your sql
JOOQ优点
DSL(Domain Specific Language )风格,代码够简单和清晰。遇到不会写的sql可以充分利用IDEA代码提示功能轻松完成。
保留了传统ORM 的优点,简单操作性,安全性,类型安全等。不需要复杂的配置,并且可以利用Java 8 Stream API 做更加复杂的数据转换。
支持主流的RDMS和更多的特性,如self-joins,union,存储过程,复杂的子查询等等。
丰富的Fluent API和完善文档。
runtime schema mapping 可以支持多个数据库schema访问。简单来说使用一个连接池可以访问N个DB schema,使用比较多的就是SaaS应用的多租户场景。
例子展示
原生SQL为:
select * from `product` as `prod`
left outer join
(select `comment`.`product_id`,count(*) as `comment_num` from `comment`
where `commment`.`product_id`=?
group by `comment`.`product_id`
)
as `c1`
on `prod`.`id`=`c1`.`product_id`
where `prod`.`id`=?;
JOOQ的语法为:
List<MyProduct> products = dslContext.select()
.from(Tables.PRODUCT)
.leftJoin(DSL.table(
DSL.select(Comment.COMMENT.PRODUCT_ID, DSL.count().as("comment_num"))
.from(Tables.COMMENT)
.where(Comment.COMMENT.PRODUCT_ID.in(ids))
.groupBy(Comment.COMMENT.PRODUCT_ID)
).as("c1")
)
.on(Product.PRODUCT.ID.eq(DSL.field(DSL.name("c1",
Comment.COMMENT.PRODUCT_ID.getName()),UInteger.class)))
.where(Product.PRODUCT.ID.in(ids))
.fetch()
.map(record -> {
MyProduct product = record.into(MyProduct.class);
return product;
});
通过上面代码的对比可以看出JOOQ既享受了Java封装带来的便捷又保留了原生sql的灵活。
---------------------
作者:不认路的河水
来源:CSDN
原文:https://blog.csdn.net/juny9123/article/details/72633138