参考:https://segmentfault.com/a/1190000006748584?utm_source=tuicool&utm_medium=referral
JOOQ是啥
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的灵活。
具体的入门教程请移步ORM “杀器”之 JOOQ,要是英语自信也可以去JOOQ官网看看。