简单了解java ORM框架JOOQ

这篇文章主要介绍了简单了解java ORM框架JOOQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java ssm框架实现分页功能的示例代码(oracle)

    java web 实现分页功能,分享给大家,具体如下: 使用框架:ssm 数据库:oracle 话说 oracle 的分页查询比 mysql 复杂多了,在这里简单谈一下: 查询 前十条数据: SELECT * FROM( SELECT ROWNUM WN,RN.* FROM ( SELECT id, title, create_time as createTime, musictor, musictitle FROM krry_blog ORDER BY create_time desc )RN

  • java接口自动化测试框架及断言详解

    我们介绍了Get方法的设计过程和测试结果,现在我们需要对前面代码进行重构和修改,本篇需要完成以下目标. 1)重构Get方法 2)如何进行JSON解析 3)使用TestNG方法进行测试断言 1.重构Get方法 在前面文章,说过,之前写的Get方法比较繁琐,不光写了如何进行Get请求,还写了获取http响应状态码和JSON转换.现在我们需要抽取出来,设计Get请求方法,就只干一件事情,那就是如何发送get请求,其他的不要管. 我们知道,请求之后会返回一个HTTP的响应对象,所以,我们把get方法的返

  • java定时任务框架elasticjob详解

    前言 Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分.该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发. ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX. 项目开源地址:https://github.com/dangdangdotcom/elastic-job Elastic-Job是ddframe中d

  • Java使用MyBatis框架分页的5种方式

    本文为大家分享了Java使用MyBatis框架分页的五种方式,供大家参考,具体内容如下 初始准备 1.创建分页对象类,方便模块间传值 //PageInfo.java import lombok.Data; @Data public class PageInfo { private int pageNo; private int pageSize; } 2.定义DAO层接口 import org.apache.ibatis.session.RowBounds; import org.springf

  • Java框架Struts2实现图片上传功能

    Struts 2 框架为处理文件上传提供了内置支持,它使用"在 HTML 中基于表单的文件上传".当上传一个文件时,它通常会被存储在一个临时目录中,而且它们应该由 Action 类进行处理或移动到一个永久的目录,用来确保数据不丢失.服务器在恰当的位置可能有一个安全策略,它会禁止你写到除了临时目录以外的目录,而且这个目录属于你的web应用应用程序. 通过预定义的名为文件上传的拦截器,Struts 的文件上传是可能的,这个拦截器在 org.apache.struts2.intercepto

  • Java接口自动化测试框架设计之Get请求方法和测试详解

    我来介绍通过代码逐步实现接口自动化测试框架的设计过程.先不要着急,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了.这篇我们来演示,如果通过Java代码来实现一个用纯代码实现Http中的Get请求过程. 1.Get请求API举例 浏览器打开网址https://reqres.in,然后下拉一屏,我们就可以看到这个网站的API举例,我们来看看显示用户的get接口. 通过这个图,我们能够获取这些信息 1)网站host地址:https://reqres.in/ 2)用户展

  • Java开发SSM框架微信支付的实现

    微信小程序的Java支付开发一直是一块坑,网上的教程也是琳琅满目.笔者六月的时候接触到了微信的小程序开发摸到了微信支付方面的东西,腾讯的官方文档也是一言难尽很多地方看不懂,而且官方也没有提供Java的示范导致Java做微信支付不得不自己踩坑.现在我把自己微信支付开发的步骤和代码都在下面展示出来,希望有没有做出来的朋友不要心急跟着我的步骤走就没问题. 第一步:首先微信支付的话只能是企业的开发账户才能使用的如果你是个人开发者是无法开通微信支付的.我们首先拿到账号,然后拿到微信支付相关的商户号和商户支

  • Spring框架JavaMailSender发送邮件工具类详解

    本文实例为大家分享了Spring框架JavaMailSender发送邮件工具类,供大家参考,具体内容如下 需要用到的jar包: 下面是发送工具类代码: package com.test.email; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.Jav

  • 简单了解java ORM框架JOOQ

    这篇文章主要介绍了简单了解java ORM框架JOOQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 今天给大家介绍一个新的ORM框架->JOOQ,可能很多朋友还没有听说过这个框架,码农哥之前也是一直在使用Mybatis框架作为Java工程中的持久层访问框架,但是最近的一些项目采用JOOQ框架开发后,码农哥表示再也不想用Mybatis了! 为什么这么说呢?因为JOOQ在代码层面要比Mybatis简洁得多,而且性能也非常优异.相信大家都有过

  • 分享一个简单的java爬虫框架

    反复给网站编写不同的爬虫逻辑太麻烦了,自己实现了一个小框架 可以自定义的部分有: 请求方式(默认为Getuser-agent为谷歌浏览器的设置),可以通过实现RequestSet接口来自定义请求方式 储存方式(默认储存在f盘的html文件夹下),可以通过SaveUtil接口来自定义保存方式 需要保存的资源(默认为整个html页面) 筛选方式(默认所有url都符合要求),通过实现ResourseChooser接口来自定义需要保存的url和资源页面 实现的部分有: html页面的下载方式,通过Htt

  • 基于Java ORM框架的使用详解

    ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立了很好的映射关系.我们在这里主要关注Java中常用的两个ORM框架:Hibernate和iBatis.下面来介绍这两个框架简单的使用方法,如果将来有时间,我会深入的写一些更有意思的相关文章.HibernateHibernate是一个持久化框架和ORM框架,持久化和ORM是两个有区别的概念,持久化注重对象的存储方法是否随着程序的退出而消亡,ORM关注的是如何在数据库表和内存

  • 简单了解java集合框架LinkedList使用方法

    代码如下 package cn.burce.List; import java.util.LinkedList; public class LinkedListdemo { // LinkedList 链表集合的特有 // 自身特点:链表底层实现,查询慢,增删快 // 子类特有功能,不能多态 public static void main(String[] args) { fun(); } public static void fun() { LinkedList<String> list =

  • 搭建Go语言的ORM框架Gorm的具体步骤(从Java到go)

    目录 [提问] [解答] 1.检查Go的安装 2.安装Gorm 3.安装对应数据库的驱动 4.编写「数据库连接」代码 5.编写「数据Model」代码 6.编写「数据查询」代码 [提问] 如何使用Goland软件,搭建一个ORM框架GORM? [解答] 具体步骤如下: 1.检查Go的安装 在任意目录执行如下命令: go version 若有如下返回,则安装成功:如果报异常,则重新安装golang go version go1.19.1 darwin/arm64 2.安装Gorm 在任意目录执行如下

  • Java NIO框架Netty简单使用的示例

    之前写了一篇文章:Java 网络IO编程总结(BIO.NIO.AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架. Netty是业界最流行的NIO框架之一,具有良好的健壮性.功能.性能.可定制性和可扩展性.同时,它提供的十分简单的API,大大简化了我们的网络编程. 同Java IO介绍的文章一样,本文所展示的例子,实现了一个相同的功能. 1.服务端 Server: package com.anxpp.io.calculat

  • 简单了解Java日志脱敏框架sensitive

    这篇文章主要介绍了简单了解Java日志脱敏框架sensitive,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 为了保证用户的信息安全,敏感信息需要脱敏. 项目开发过程中,每次处理敏感信息的日志问题感觉很麻烦,大部分都是用工具类单独处理,不利于以后统一管理,很不优雅. 于是,就写了一个基于 java 注解的日志脱敏工具. github sensitive 项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.

  • MongoDB orm框架的注意事项及简单使用

    目录 Ⅰ. 简介 Ⅱ. 注意事项 Ⅲ. 使用方法 Ⅳ. 教程 首先spring自带了mongodb的orm,spring data mongodb,但是这个框架非常难用,最令人抓狂的是每个文档都要带一个 _class 字段,因为这个是string的,所以占用不少空间,而且去除也比较麻烦.故而使用 zfoo orm 框架 Ⅰ. 简介 基于MongoDB的orm框架,提供POJO对象和MongoDB数据库之间的映射 Ⅱ. 注意事项 POJO对象的属性必须提供get和set方法,否则无法映射 不支持泛

  • Python流行ORM框架sqlalchemy的简单使用

    安装 http://docs.sqlalchemy.org 1.安装 #进入虚拟环境 #执行 ./python3 -m pip install import sqlalchemy print(sqlalchemy.__version__) # 1.1.15 我这里使用的版本是1.1.15 创建连接对象 http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#connecting from sqlalchemy import create_en

  • Java Mybatis框架入门基础教程

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

随机推荐