简述

最近在公司项目中许多表结构一样,每个表中数据来源不一样。在提供给其他服端的接口中,需要根据来源查询不同表中的数据,表接口一样数据不一样在选用ORM框架的时候刚开始使用的是mango,一种使用注解实现的框架,无法灵活的切换表实现动态的构建sql语句,造成代码冗余严重。后来了解到JOOQ,一种基于api实现的sql创建可以灵活的动态构建sql语句,批量获取的时候发现效率不输其他ORM框架,在后边的使用中体验不错,特聊一下使用体验。

SpringBoot集成JOOQ

JOOQ Maven依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jooq</artifactId><exclusions><exclusion><groupId>org.jooq</groupId><artifactId>jooq</artifactId></exclusion></exclusions></dependency><!-- https://mvnrepository.com/artifact/org.jooq/jooq-meta --><dependency><groupId>org.jooq</groupId><artifactId>jooq-meta</artifactId><version>3.14.8</version></dependency><!-- https://mvnrepository.com/artifact/org.jooq/jooq-codegen --><dependency><groupId>org.jooq</groupId><artifactId>jooq-codegen</artifactId><version>3.14.8</version></dependency><dependency><groupId>org.jooq</groupId><artifactId>jooq</artifactId><version>3.14.8</version></dependency>

JOOQ代码生成插件
JOOQ可以完全使用api进行操作,在这里我使用的是生成代码插件生成代码(切记:生成代码的路径最好不要放到target中,切记)
在这里我还区分在dev环境中和test环境中生成代码,生产环境中自动化部署有可能因为权限无法访问数据库造成无法打包,本人在进行线上环境部署时遇到这样的问题

 <properties><app.package>com.sun.jooq.codegen</app.package></properties><profiles><profile><id>dev</id><build><plugins><plugin><groupId>org.jooq</groupId><artifactId>jooq-codegen-maven</artifactId><version>3.14.8</version><configuration><jdbc><driver>com.mysql.cj.jdbc.Driver</driver><url>jdbc:mysql://127.0.0.1:3306</url><user>sun</user><password>123456</password></jdbc><generator><name>org.jooq.codegen.JavaGenerator</name><generate><pojos>true</pojos><daos>true</daos><springAnnotations>true</springAnnotations><fluentSetters>true</fluentSetters><javaTimeTypes>true</javaTimeTypes></generate><database><name>org.jooq.meta.mysql.MySQLDatabase</name><!--include和exclude用于控制为数据库中哪些表生成代码--><includes>tableA|tableB</includes><!--数据库名称--><inputSchema>DBName</inputSchema><includeRoutines>false</includeRoutines></database><target><packageName>${app.package}</packageName><directory>src/main/java/</directory></target></generator></configuration><executions><execution><goals><goal>generate</goal></goals></execution></executions></plugin></plugins></build></profile><profile><id>test</id><build><plugins><plugin><groupId>org.jooq</groupId><artifactId>jooq-codegen-maven</artifactId><version>3.14.8</version><configuration><jdbc><driver>com.mysql.cj.jdbc.Driver</driver><url>jdbc:mysql://127.0.0.1:3306</url><user>sun</user><password>12345</password></jdbc><generator><name>org.jooq.codegen.JavaGenerator</name><generate><pojos>true</pojos><daos>true</daos><springAnnotations>true</springAnnotations><fluentSetters>true</fluentSetters><javaTimeTypes>true</javaTimeTypes></generate><database><name>org.jooq.meta.mysql.MySQLDatabase</name><!--include和exclude用于控制为数据库中哪些表生成代码--><includes>tableA|tableB</includes><!--数据库名称--><inputSchema>DBName</inputSchema><includeRoutines>false</includeRoutines></database><target><packageName>${app.package}</packageName><directory>src/main/java/</directory></target></generator></configuration><executions><execution><goals><goal>generate</goal></goals></execution></executions></plugin></plugins></build></profile><profile><id>prod</id><build><plugins></plugins></build></profile></profiles>

yml配置文件
在配置文件中需要配置数据源

 Spring: datasource:password: 123456url: jdbc:mysql://127.0.0.1:3306/testusername: sundriver-class-name: com.mysql.cj.jdbc.Driverjooq:sql-dialect: mysql

JOOQ Configuration类

package com.sun.config;/*** @className: JooqAutoConfiguration* @description: TODO 类描述* @author: Szg* @date: 2021/3/24**/import com.mysql.cj.jdbc.MysqlDataSource;
import com.zaxxer.hikari.HikariDataSource;
import org.jooq.*;
import org.jooq.conf.Settings;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.jooq.impl.DefaultExecuteListenerProvider;
import org.jooq.meta.jdbc.JDBCDatabase;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator;
import org.springframework.boot.autoconfigure.jooq.JooqProperties;
import org.springframework.boot.autoconfigure.jooq.SpringTransactionProvider;
import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;/*** {@link EnableAutoConfiguration Auto-configuration} for JOOQ.** @author Andreas Ahlenstorf* @author Michael Simons* @author Dmytro Nosan* @since 1.3.0*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DSLContext.class)
@ConditionalOnBean(DataSource.class)
@AutoConfigureAfter({DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class})
public class JooqAutoConfiguration {@Bean@ConditionalOnMissingBean(ConnectionProvider.class)public DataSourceConnectionProvider dataSourceConnectionProvider(DataSource dataSource) {return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource));}@Bean@ConditionalOnBean(PlatformTransactionManager.class)public SpringTransactionProvider transactionProvider(PlatformTransactionManager txManager) {return new SpringTransactionProvider(txManager);}@Bean@Order(0)public DefaultExecuteListenerProvider jooqExceptionTranslatorExecuteListenerProvider() {return new DefaultExecuteListenerProvider(new JooqExceptionTranslator());}@Configuration(proxyBeanMethods = false)@ConditionalOnMissingBean(DSLContext.class)@EnableConfigurationProperties(JooqProperties.class)public static class DslContextConfiguration {@Beanpublic DefaultDSLContext dslContext(org.jooq.Configuration configuration) {return new DefaultDSLContext(configuration);}@Bean@ConditionalOnMissingBean(org.jooq.Configuration.class)public DefaultConfiguration jooqConfiguration(JooqProperties properties, ConnectionProvider connectionProvider,DataSource dataSource, ObjectProvider<TransactionProvider> transactionProvider,ObjectProvider<RecordMapperProvider> recordMapperProvider,ObjectProvider<RecordUnmapperProvider> recordUnmapperProvider, ObjectProvider<Settings> settings,ObjectProvider<RecordListenerProvider> recordListenerProviders,ObjectProvider<ExecuteListenerProvider> executeListenerProviders,ObjectProvider<VisitListenerProvider> visitListenerProviders,ObjectProvider<TransactionListenerProvider> transactionListenerProviders,ObjectProvider<ExecutorProvider> executorProvider) {DefaultConfiguration configuration = new DefaultConfiguration();configuration.set(properties.determineSqlDialect(dataSource));configuration.set(connectionProvider);transactionProvider.ifAvailable(configuration::set);recordMapperProvider.ifAvailable(configuration::set);recordUnmapperProvider.ifAvailable(configuration::set);settings.ifAvailable(configuration::set);executorProvider.ifAvailable(configuration::set);configuration.set(recordListenerProviders.orderedStream().toArray(RecordListenerProvider[]::new));configuration.set(executeListenerProviders.orderedStream().toArray(ExecuteListenerProvider[]::new));configuration.set(visitListenerProviders.orderedStream().toArray(VisitListenerProvider[]::new));configuration.setTransactionListenerProvider(transactionListenerProviders.orderedStream().toArray(TransactionListenerProvider[]::new));return configuration;}}
}

生成代码

至此,基本的集成已经完成,接下来点击编译就可以生成响应的代码
生成代码示例

生成代码示例

结语

至此集成JOOQ完成,总体来说还是比较简单,尽管在期间遇到了一些问题,但是还是解决了。

JOOQ初体验-SpringBoot集成JOOQ相关推荐

  1. smart-doc初体验-springboot生成自动文档

    smart-doc初体验 一.为什么要引入smart-doc? 二.对比swagger 三.使用 四.讨论 1.设计先行模式 2.代码先行 五.体验 六.附录 1.完整的配置项: 2.官方地址: 一. ...

  2. springboot集成graphql(一)

    背景:基于上篇springboot集成jooq继续 GraphQL Playgroundhttps://github.com/prisma-labs/graphql-playground/releas ...

  3. centos安装rabbitmq_【SpringBoot MQ系列教程】RabbitMq 初体验

    SpringBoot 系列教程之 RabbitMq 初体验​mp.weixin.qq.com mq 在异步解耦削峰的优势非常突出,现在很多的项目都会用到,掌握 mq 的知识点,了解如何顺畅的使用 mq ...

  4. sentinel接入网关应用_微服务初体验(三):集成Gateway网关和Sentinel限流

    前言 最近笔者在对微服务架构进行学习,参考了各种项目的技术文章.框架文档以及视频网站,最终选择使用Nacos+Dubbo+Gateway+Sentinel来搭建一个项目练手.其中Nacos作为服务的注 ...

  5. Jooq新手在SpringBoot中接入Jooq

    参考:https://segmentfault.com/a/1190000006748584?utm_source=tuicool&utm_medium=referral JOOQ是啥   J ...

  6. 【ChatGPT初体验与Android的集成使用】

    ChatGPT初体验与Android的集成使用 前言 创建自己的API KEY Android端的集成 代码 总结 前言 ChatGPT凭借着强大的AI功能火的一塌糊涂,由于其官网在国内不能访问,很多 ...

  7. 【微服务】SpringBoot 搭建微服务初体验

    SpringBoot 搭建微服务初体验 前言 Server端程序开发 1.创建Server项目,并添加依赖 2.引入依赖,完善配置文件 3.开发SQL语句 4.开发JavaBean 5.开发DAO接口 ...

  8. springboot初体验以及解决遇到的问题

    2020版本以及后面的设置 #后面配置maven同上 File -> new project settings -> settings for new projects idea的版本不用 ...

  9. 融云im小程序集成初体验

    融云im小程序集成初体验 最近领导让做一个小程序端的聊天功能,基于多方考虑,最终选择了融云的im来实现,那就先写个demo体验下吧. 首先呢,当然是查看官方文档,文档地址如下: https://doc ...

最新文章

  1. 使用Docx4j操作PPT指南系列(附一)
  2. 智能车竞赛技术报告 | 智能车视觉 - 中国矿业大学 - 会飞的车
  3. 微服务架构 — 服务治理 — 服务注册与发现、服务订阅与通知
  4. Hadoop MapReduce手机上网流量统计代码示例及运行结果演示
  5. 七十七、React中的propTypes,defaultProps和生命周期函数
  6. python做数据可视化的代码_Python数据可视化正态分布简单分析及实现代码
  7. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
  8. 音效SystemSoundID
  9. 网络中延迟对主观感受的影响
  10. 30天C#基础巩固------了解委托,string练习
  11. 在windows下如何批量转换pvr,ccz为png或jpg
  12. 点云应用于电力行业助力输配电安全距离检测分析以及精细化巡检
  13. Unable to instantiate service com.baidu.android.pushservice.PushService: java.lang.ClassNotFoundExc
  14. 学生每日计划表_初三学生逆袭每日计划表
  15. python早读读后感_《学习Python》读后感摘抄
  16. 基于小程序开发的藏书馆
  17. html帮助文档怎么翻译,HTML文档,HTML document,音标,读音,翻译,英文例句,英语词典
  18. 计算机视觉中的数据流与模型训练代码总结!
  19. win10电脑计算机内存不足,win10系统电脑总是提示“计算机的内存不足”的恢复方案...
  20. CSS3实现渐变背景动画特效

热门文章

  1. 【matlab】spm数据处理
  2. 阿里内部隐藏「P」序列职级,「高P」光环或成过去式
  3. [《关于外婆家的一些记忆》闲笔记事集]2012年1月22日
  4. OkHttp3基本使用
  5. ES6学习笔记2:字符串的repeat()方法
  6. 西邮校园网路由器教程
  7. 键盘分类 红黑青茶轴
  8. 苹果取消iPhone 13显示屏的维修限制,Face ID不再受影响
  9. (原创文章)羊毛党何去何从
  10. 计算机网络:路由的概念及其分类