为什么项目中用了JOOQ后大家都不愿再用Mybatis?

本文探讨了JOOQ作为一个ORM框架相较于Mybatis的优势,指出JOOQ代码更简洁,性能优异。通过JOOQ,开发者可以使用面向对象的方式编写SQL,同时避免了Mybatis自动生成代码的冗余。JOOQ在保持灵活性的同时减轻了开发负担,尤其在处理复杂业务逻辑时。文章还介绍了JOOQ在SpringBoot项目中的集成方法,强调了其在高并发支付系统中的可靠性,并鼓励读者尝试使用JOOQ。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=jpeg


前言

640?wx_fmt=png


今天给大家介绍一个新的ORM框架->JOOQ,可能很多朋友还没有听说过这个框架,码农哥之前也是一直在使用Mybatis框架作为Java工程中的持久层访问框架,但是最近的一些项目采用JOOQ框架开发后,码农哥表示再也不想用Mybatis了!


为什么这么说呢?因为JOOQ在代码层面要比Mybatis简洁得多,而且性能也非常优异。相信大家都有过这样的体会,我们在项目工程中使用Mybatis进行数据库相关代码的编写时,为了提高工程效率,一般会在数据库模型设计完成后,一次性使用Mybatis代码插件(如:mybatis-generator),来生成Mybatis数据库访问的实体类代码以及XML、Mapper等映射代码,从而尽量以面向对象的方式来操作和访问数据库。而通过这样的方式,虽然在工程效率上提高了很多,但是从代码的简洁和优雅性上来说就会让人感觉特别的啰嗦,因为自动生成的代码并不完全都是你在项目中能够用得到的。


所以,有些对代码有追求的同学就会以比较简洁的方式来手写SQL代码。如在@Mapper接口中编写这样的代码:


 
 
@Select("select max(t.balance_id) from balance t where t.country=#{country}\n")String selectMaxId(Map<String, String> paramMap);"select max(t.balance_id) from balance t where t.country=#{country}\n")
String selectMaxId(Map<StringString> paramMap);


而虽然这种方式可以减少很多无用的代码量,但是在业务逻辑比较复杂的场景下这种方式显然又会大大降低开发的效率,因为通过这样的方式不仅SQL编写的通用层度需要我们花费额外的时间去考虑,而且由于Java面向对象的编程方式,我们还需要花费很多的时间来将数据库查询结果映射成为实体对象,所以使用Mybatis进行持久层开发时有时候真的是让人又爱又恨


那么有没有一种新的ORM框架既能够保持Mybatis的灵活性又不像Hibernate那样重呢?毕竟大家也都是从Hibernate的魔爪中逃离出来后才选择使用Mybatis直到今天的!在软件工程领域就是这样,有痛点的地方就一定会有人提供解决方案,JOOQ就是这样一个产物!


JOOQ简介

640?wx_fmt=png


JOOQ是基于Java访问关系型数据库的工具包,它具有轻量、简单、并且足够灵活的特点,通过JOOQ我们可以轻松的使用Java面向对象的语法来实现各种复杂的SQL。相比于传统ORM框架,如Hibernate、Mybatis来说,JOOQ汲取了即汲取了它们操作数据的简单性和安全性、同时也保留了原生SQL的灵活性,从某种程度上说JOOQ更像是介于ORM和JDBC的中间层。


JOOQ目前在国内相对来说还比较小众,对于大部分从SSH或者SSM成长起来的码农朋友们来说,心里估计会质疑“这玩意用的这么少,到底靠不靠谱?”。在这里码农哥可以很负责任的说JOOQ是靠谱的!因为码农哥已经在好几个生产项目上实践过了,而且是在比较核心的支付系统上完全使用了JOOQ来替代Mybatis作为持久层框架,并且这个支付系统的并发量也是非常高的,所以JOOQ框架本身是能够经受住真实业务场景的考验的!


关于更多JOOQ的细节介绍,大家可以在Github上看,反正都是开源的,源代码大家也是可以去看的,地址如下:

https://github.com/jOOQ/jOOQ


SpringBoot项目集成JOOQ

640?wx_fmt=png


接下来我们就来一起看看,如何在SpringBoot的项目中集成和使用JOOQ吧!首先,我们在项目中引入JOOQ的stater依赖包,如下:


 
 
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jooq</artifactId></dependency>
    <artifactId>spring-boot-starter-jooq</artifactId>
</dependency>


因为JOOQ对Spring Boot有很好的支持,所以我们只需要引入相应的starter依赖即可,而具体的版本则是与Spring Boot的版本关联的,这里并不需要我们去指定。


其次,我们需要在项目中配置JOOQ的代码生成插件,这样JOOQ就可以自动在项目编译的时候为我们生成所需要的数据库以来对象了,在项目的pom.xml中配置Maven插件,如下:


 
 
<plugin><groupId>org.jooq</groupId><artifactId>jooq-codegen-maven</artifactId><executions>    <execution>        <id>default</id>        <phase>generate-sources</phase>        <goals>            <goal>generate</goal>        </goals>        <configuration>            <jdbc>                <driver>com.mysql.jdbc.Driver</driver>                <url>jdbc:mysql://127.0.0.1:3306</url>                <user>root</user>                <password><![CDATA[123456]]></password>           &nbs
jdao是一个轻量级的orm工具包,通过简单配置或者连接数据库提供表名它便可以自动生成与数据库表一一对应的dao类,生成的dao类提供了与SQL无关的增删改查的功能。在复杂的查询SQL中,我建议编程人员自己编写高效的SQL,再通过jdao查询后返回封装好的QureyDao类,很方便的获取数据。在jdao底层,目前有spring的jdbcTemplate实现与我自己封装的jdaoHandlerImpl实现。jdao有支持事务,支持批量插入数据等特性。同时jdao底层数据库操作提供接口,编程人员可以自己实现。       如果你觉得hibernate,ibatis等orm框架过于笨重,不烦试下jdao,它可以在团队开发中规范团队持久层代码,较少开发量,特别在单表操作上基本是对象操作,对于复杂SQL查询也有较好的封装。一、使用DAO方式操作数据:查询SQL: select value,rowname from hstest where id between 2 and 10;jdao对象操作如下:Hstest t = new Hstest();t.where(Hstest.ID.BETWEEN(2, 10));t.query(Hstest.VALUE, Hstest.ROWNAME);插入SQL:  insert into hstest (id,rowname,value) values(1,"donnie","wuxiaodong")jdao对象操作如下:Hstest t = new Hstest();t.setId(1);t.setRowname("donnie");t.setValue("wuxiaodong");t.save();批量插入SQL:  insert into hstest (id,rowname,value) values(1,"donnie1","wuxiaodong1"),(2,"donnie2","wuxiaodong2"),(3,"donnie3","wuxiaodong3")jdao对象操作如下:Hstest t = new Hstest();t.setId(1);t.setRowname("donnie1");t.setValue("wuxiaodong1");t.addBatch();t.setId(2);t.setRowname("donnie2");t.setValue("wuxiaodong2");t.addBatch();t.setId(3);t.setRowname("donnie3");t.setValue("wuxiaodong3");t.addBatch();t.batchForSave();更新SQL:  update hstest set rowname="wuxiaodong",value="wuxiaodong" where id=10jdao对象操作如下:Hstest t = new Hstest();t.setRowname("wuxiaodong");t.setValue("wuxiaodong");t.where(Hstest.ID.EQ(10));t.update();删除SQL:  delete from hstest where id=2jdao对象操作如下:Hstest t = new Hstest();t.where(Hstest.ID.EQ(2));t.delete();二、使用QueryDao查询数据,建议用于复杂SQL查询,单表增删改查建议还是使用DAO对象操作。QueryDao qd = new QueryDao(JdaoHandlerFactory.getDBHandler4c3p0(), "select id,rowname from hstest limit ?,?", 0, 10);//获取数据方式一while (qd.hasNext()) {    QueryDao q = qd.next();    //获取字段方式一    System.out.println(q.fieldValue(1) "   " q.fieldValue(2));    //获取字段方式二    System.out.println(q.fieldValue("id") "   " q.fieldValue("rowname"));}//获取数据方式二for(QueryDao q:qd.queryDaoList()){    System.out.println(q.fieldValue(1) "   " q.fieldValue(2));} 标签:orm  jdao
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值