松鼠乐园 松鼠乐园
  • 注册
  • 登录
  • 首页
  • 快捷入口
    • Vue
    • Tensorflow
    • Springboot
    • 语言类
      • CSS
      • ES5
      • ES6
      • Go
      • Java
      • Javascript
    • 工具类
      • Git
      • 工具推荐
    • 服务器&运维
      • Centos
      • Docker
      • Linux
      • Mac
      • MySQL
      • Nginx
      • Redis
      • Windows
    • 资源类
      • 论文
      • 书籍推荐
      • 后端资源
      • 前端资源
      • html网页模板
      • 代码
    • 性能优化
    • 测试
  • 重大新闻
  • 人工智能
  • 开源项目
  • Vue2.0从零开始
  • 广场
首页 › Java › 为什么项目中用了JOOQ后大家都不愿再用Mybatis?

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

迦娜王
2年前Java
511 0 0

前言

今天给大家介绍一个新的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);

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

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

JOOQ简介

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

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

SpringBoot项目集成JOOQ

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

<dependency>
<groupId>org.springframework.boot</groupId>
<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>
</jdbc>
<generator>
<name>org.jooq.util.DefaultGenerator</name>
<generate>
<instanceFields>true</instanceFields>
<pojos>true</pojos>
<daos>true</daos>
</generate>
<database>
<inputSchema>jets</inputSchema>
<name>org.jooq.util.mysql.MySQLDatabase</name>
<includes>.*</includes>
<excludes>schema_version</excludes>
</database>
<target>
<packageName>${app.package}</packageName>
<directory>target/generated-sources/jooq</directory>
</target>
</generator>
</configuration>
</execution>
</executions>
</plugin>

配置完成这个Maven插件后,基本上JOOQ就算差不多与SpringBoot集成完成了,如果此时编译项目JOOQ代码插件就会在target/generated-sources/jooq目录下根据数据库中的表结构生成相应的数据库操作对象,而这个过程则完成对开发人员透明,我们并不需要做额外的事情。

而在具体的业务逻辑中,需要操作数据库时我们就可以很方便的使用这些自动生成的代码来进行操作,例如,我们需要在业务代码中执行insert操作,代码如下:

@Slf4j
@Service
public class OpenServiceImpl implements OpenService {

@Autowired
protected DSLContext dslContext;

@Override
public BalanceChargeTradeResVo balanceChargeTrade(BalanceChargeTradeReqVo balanceChargeTradeReqVo)
throws VerifyDataException, BalanceCreateOrderException {
BalanceChargeTradeResVo balanceChargeTradeResVo;
try {
WalletUserBalanceOrderRecord walletUserBalanceOrderRecord = createBalanceChargeOrder(
balanceChargeTradeReqVo);
dslContext.executeInsert(walletUserBalanceOrderRecord);
balanceChargeTradeResVo = BalanceChargeTradeResVo.builder().userId(balanceChargeTradeReqVo.getUserId())
.amount(balanceChargeTradeReqVo.getAmount()).currency(balanceChargeTradeReqVo.getCurrency())
.orderId(walletUserBalanceOrderRecord.getOrderId()).businessType(BusinessType.TOP_UP.getCode())
.build();
return balanceChargeTradeResVo;
} catch (Exception e) {
throw new BalanceCreateOrderException(ErrorCode.BALANCE_CHARGE_ORDER_ERROR.getCode(),
ErrorCode.BALANCE_CHARGE_ORDER_ERROR.getDesc());
}
}

在以上代码中,我们只需要在service业务类中注入DSLContext对象,并在组装完自动生成的数据库类的对象后执行executeInsert方法就可以完成insert操作了。而如果我们要完成查询操作,也可以很简单的实现,代码如下:

@Slf4j
@Service
public class OpenServiceImpl implements OpenService {

@Autowired
protected DSLContext dslContext;

@Override
public BalanceQueryResVo balanceQuery(long userId) throws AccountNoExistException {
List<WalletUserBalanceRecord> walletUserBalanceRecordList = dslContext
.selectFrom(WalletUserBalance.WALLET_USER_BALANCE)
.where(WalletUserBalance.WALLET_USER_BALANCE.USER_ID
.eq(String.valueOf(userId))).fetchInto(WalletUserBalanceRecord.class);
if (walletUserBalanceRecordList == null || walletUserBalanceRecordList.size() <= 0) {
throw new AccountNoExistException(ErrorCode.ACCOUNT_NO_EXIST_ERROR.getCode(),
ErrorCode.ACCOUNT_NO_EXIST_ERROR.getDesc());
}
Optional<WalletUserBalanceRecord> walletUserBalanceRecord = walletUserBalanceRecordList.stream()
.filter(o -> o.getAccType().equals(String.valueOf(AccType.CASH_ACCOUNT.getCode()))).findFirst();
BalanceQueryResVo balanceQueryResVo = BalanceQueryResVo.builder().userId(userId)
.balance(walletUserBalanceRecordList.stream().mapToInt(o -> o.getBalance().intValue()).sum())
.currency(walletUserBalanceRecord.get().getCurrency()).build();
return balanceQueryResVo;
}

在如代码中,我们需要通过自动代码生成的类指定表名,并以面向对象的语法方式组装查询条件后就可以完成查询操作了!这里只是简单介绍了两种通过JOOQ实现常见数据库操作的方法,更多的细节,大家可以参考JOOQ用户手册!

这样你会发现操作数据库更加方便快捷了,而且因为自动代码生成对开发者是透明的,所以整个工程的代码整洁度也提高了!PS:大家可以在自己的项目中试试JOOQ,相信你一定不会后悔!

rom框架
0
70 行 Go 代码打败 C
上一篇
我收集了12款自动生成器,无聊人士自娱自乐专用
下一篇
评论 (0)

请登录以参与评论。

现在登录
聚合文章
Servicios profesionales Organizaciones
1年前
在Gitee收获近 5k Star,更新后的Vue版RuoYi有哪些新变化?
1年前
vue3.x reactive、effect、computed、watch依赖关系及实现原理
1年前
Vue 3 新特性:在 Composition API 中使用 CSS Modules
1年前
标签
AI AI项目 css docker Drone Elaticsearch es5 es6 Geometry Go gru java Javascript jenkins lstm mysql mysql优化 mysql地理位置索引 mysql索引 mysql规范 mysql设计 mysql配置文件 mysql面试题 mysql高可用 nginx Redis redis性能 rnn SpringBoot Tensorflow tensorflow2.0 UI设计 vue vue3.0 vue原理 whistle ZooKeeper 开源项目 抓包工具 日志输出 机器学习 深度学习 神经网络 论文 面试题
相关文章
Java基础知识」超级详细的Java基础知识,你还记得多少
学习java最基本的27个知识点你会吗?
要精通Java,先研究它的执行原理
java干货大集合
松鼠乐园

资源整合,创造价值

小伙伴
墨魇博客 无同创意
目录
重大新闻 Centos CSS Docker ES5 ES6 Go Java Javascript Linux Mac MySQL Nginx Redis Springboot Tensorflow Vue Vue2.x从零开始 Windows 书籍推荐 人工智能 前端资源 后端资源 壁纸 开源项目 测试 论文
Copyright © 2018-2022 松鼠乐园. Designed by nicetheme. 浙ICP备15039601号-4
  • 重大新闻
  • Centos
  • CSS
  • Docker
  • ES5
  • ES6
  • Go
  • Java
  • Javascript
  • Linux
  • Mac
  • MySQL
  • Nginx
  • Redis
  • Springboot
  • Tensorflow
  • Vue
  • Vue2.x从零开始
  • Windows
  • 书籍推荐
  • 人工智能
  • 前端资源
  • 后端资源
  • 壁纸
  • 开源项目
  • 测试
  • 论文
热门搜索
  • jetson nano
  • vue
  • java
  • mysql
  • 人工智能
  • 人脸识别
迦娜王
坚持才有希望
1224 文章
35 评论
242 喜欢
  • 0
  • 0
  • Top