JOOQ学习笔记:gradle版代码生成、生成指定的数据库

2024-08-27 15:58

本文主要是介绍JOOQ学习笔记:gradle版代码生成、生成指定的数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境

Java:1.8
jooq: 3.12.2
mysql: 8.0.15
电脑:MacBook Pro

前言

简单搭建一个jooq的项目。
根据官网文档来操作的,在按照jOOQ in 7 easy steps,
但是执行到代码生成时,遇到了麻烦。

步骤

创建项目

创建gradle项目,根据Intellij IDEA上面点击下一步就可以了。

因为公司是gradle项目,所以就创建这种类型的项目了。

创建数据库

在本机上创建数据库,官网有提供,代码如下:

CREATE DATABASE `library`;USE `library`;CREATE TABLE `author` (`id` int NOT NULL,`first_name` varchar(255) DEFAULT NULL,`last_name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
);

生成代码

我卡在这一步很久了,所以写这篇,记录下。

这个步骤的目的,就是为了让jooq,帮我们把数据模型和数据查询的基础代码都帮我生成好。

官网的第三步,方式很原始。用的是java命令来生成。我没试,因为实际项目不可能这样生成。

Code generation
这个链接,是官网专门讲解如何生成代码的。(方式有很多种)

因为我是gradle,所以我参考的是Running the code generator with Gradle
这里面讲了两种方式:
① 使用gradle官方的插件
② 使用xmlMarkupBuilder的方式

公司使用的是插件,我这里使用的是第二种。第二种的好处是不依赖第三方插件(但是现在的项目能不依赖第三方的很少)。

直接贴我自己的配置:

import groovy.xml.MarkupBuilder
import org.jooq.codegen.GenerationTool
apply plugin: 'java'
group 'com.misssad'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {mavenCentral()
}
dependencies {compile("org.jooq:jooq:3.12.2")compile("org.jooq:jooq-meta:3.12.2")compile("org.jooq:jooq-codegen:3.12.2")compile('mysql:mysql-connector-java:8.0.15')testCompile("junit:junit:4.12")
}
buildscript {repositories {mavenLocal()mavenCentral()}dependencies {classpath 'org.jooq:jooq-codegen:3.12.2'classpath('mysql:mysql-connector-java:8.0.15')}
}
task jooqCodeGenerate {def writer = new StringWriter()def xml = new MarkupBuilder(writer).configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.12.0.xsd'){jdbc() {
//            driver('com.mysql.jdbc.Driver')driver('com.mysql.cj.jdbc.Driver ')url('jdbc:mysql://localhost:3306/library?useSSL=false&useUnicode=true&characterEncoding=UTF-8')user('root')password('rootroot')}generator() {database() {}generate([:]) {pojos truedaos true}target() {packageName('org.jooq.example.gradle.db')directory('src/main/java')}}}GenerationTool.generate(writer.toString())
}

和官网不同的地方:

官网
数据库H2MySQL
执行方式idea 右键Run./gradlew jooqCodeGenerate 或右键Run

执行方式,我自己写成了task形式,这样就可以使用命令的方式来执行。


上面的配置,会把MySQL数据库的所有数据库都生成代码。
比如我的MySQL为:
在这里插入图片描述

上面的配置生成出来的代码为:
仔细看下图的左边包名
在这里插入图片描述

只想生成指定的数据库

如果我们只想生成指定的数据库,比如我们示例中的library数据库。
那么我们需要添加如下配置:

generator(){name('org.jooq.codegen.JavaGenerator')// database是关键database(){name('org.jooq.meta.mysql.MySQLDatabase')inputSchema('library')includes('.*')excludes()}generate([:]) {pojos true//是否生成数据表对应的javabean类daos true//是否生成数据表对应的dao层,这里生成的dao能执行基本的增删改查sql操作,复杂一点的操作需要自己写dao}//生成类输出目录target() {packageName('com.study.jooq.data')//输出具体目录,生成的jooq类会在这个目录底下directory('src/main/java')//输出根目录}
}

说明:

generator中的name指定代码生成器;

generator层中name支持的语言
org.jooq.codegen.JavaGeneratorJava
org.jooq.codegen.ScalaGeneratorScala

databasename用来指定数据库的方言;
其格式如下:

org.jooq.meta.[database].[全大写database]Database

比如:
MySQL

org.jooq.meta.mysql.MYSQLDatabase

jooq总共支持的方言有:

org.jooq.meta.auroramysql.AuroraMySQLDatabase
org.jooq.meta.aurorapostgres.AuroraPostgresDatabase
org.jooq.meta.cubrid.CUBRIDDatabase
org.jooq.meta.db2.DB2Database
org.jooq.meta.derby.DerbyDatabase
org.jooq.meta.firebird.FirebirdDatabase
org.jooq.meta.h2.H2Database
org.jooq.meta.hana.HANADatabase
org.jooq.meta.hsqldb.HSQLDBDatabase
org.jooq.meta.informix.InformixDatabase
org.jooq.meta.ingres.IngresDatabase
org.jooq.meta.mariadb.MariaDBDatabase
org.jooq.meta.mysql.MySQLDatabase
org.jooq.meta.oracle.OracleDatabase
org.jooq.meta.postgres.PostgresDatabase
org.jooq.meta.redshift.RedshiftDatabase
org.jooq.meta.sqldatawarehouse.SQLDataWarehouseDatabase
org.jooq.meta.sqlite.SQLiteDatabase
org.jooq.meta.sqlserver.SQLServerDatabase
org.jooq.meta.sybase.SybaseDatabase
org.jooq.meta.teradata.TeradataDatabase
org.jooq.meta.vertica.VerticaDatabase

database中的inputSchema,这个就是指定生成哪个数据库的关键。
xml中的写法:

<inputSchema>[your database schema / owner / name]</inputSchema>

gradle中写法:

inputSchema('[your database schema / owner / name]')
eg:
inputSchema('library')

database中的includes用来指定包含哪些表的。即:哪些表可以生成出来了。
表达式为正则表达式,可以使用管道| 分割多个表达式;
XML写法:

<includes>.*</includes>

gradle写法:

includes('.*')

默认时匹配所有的。

database中的excludes用来排除哪些表的。可以使用管道分割多个表达式。
其比includes优先级高。
xml写法:

<excludes>
UNUSED_TABLE # This table (unqualified name) should not be generated
| PREFIX_.* # Objects with a given prefix should not be generated
| SECRET_SCHEMA\.SECRET_TABLE # This table (qualified name) should not be generated
| SECRET_ROUTINE # This routine (unqualified name) ...
</excludes>

翻译:

# 不会生成指定名称的表
# 包含PREFIX_前缀的不生成
# 不会生成指定名称的表
# SECRET_ROUTINE 这个名称的不生成

gradle写法:

excludes('UNUSED_TABLE |PREFIX_.*')

遇到的问题

SSL问题

WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45 , 5.6.26 and 5.7.6 requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

因为我的MySQL版本为8,默认开启了SSL

解决办法:
添加useSSL=false

jdbc:mysql://localhost:3306/library?useSSL=false&useUnicode=true&characterEncoding=UTF-8

build.gradle

all buildscript {} blocks must appear before any plugins {} blocks in the script

按照上面的说法,所有的buildscript{}块,必须在plugins{}块之前。
然后我改成这样:

import groovy.xml.MarkupBuilder
import org.jooq.codegen.GenerationToolgroup 'com.misssad'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {mavenCentral()
}
dependencies {compile("org.jooq:jooq:3.12.2")compile("org.jooq:jooq-meta:3.12.2")compile("org.jooq:jooq-codegen:3.12.2")compile('mysql:mysql-connector-java:8.0.15')testCompile("junit:junit:4.12")
}
buildscript {repositories {mavenLocal()mavenCentral()}dependencies {classpath 'org.jooq:jooq-codegen:3.12.2'classpath('mysql:mysql-connector-java:8.0.15')}
}
plugins {id 'java'
}
......

然后呢,报了下面这个错:

only buildscript {} and other plugins {} script blocks are allowed before plugins {} blocks, no other statements are allowed

这句话的意思就是说:只有buildscript{}块和其他plugins{}块,可以放在plugins{}块之前,其他都不行。

OK,我再改改,如下(正确版):

import groovy.xml.MarkupBuilder
import org.jooq.codegen.GenerationTool
buildscript {repositories {mavenLocal()mavenCentral()}dependencies {classpath 'org.jooq:jooq-codegen:3.12.2'classpath('mysql:mysql-connector-java:8.0.15')}
}
plugins {id 'java'
}
group 'com.misssad'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {mavenCentral()
}
......

这东西顺序很严格,我做了测试,即使是把:

group 'com.misssad'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

放到plugins或者buildscript之前都不行,会报错。

驱动包

//            driver('com.mysql.jdbc.Driver')driver('com.mysql.cj.jdbc.Driver')

上面两个我都成功了,不过建议使用com.mysql.cj.jdbc.Driver

查看MySQL是否开启SSL

SHOW VARIABLES LIKE '%SSL%'

总结

目前只走了三个步骤。
生成代码这个步骤,有很多玩法,有待研究。

gradle方面知道这么一个结构:

plugins {// ...
}dependencies {// ...
}

或者:

buildScript {// ...
}plugins {// ...
}repositories {// ...
}

就是有buildScript的情况下,一定要放在最前面

官网插件地址:
gradle-jooq-plugin

参考地址:

only build script and other plugins script blocks are allowed before plugins

记更新MySQL 8.0后踩过的那些坑

Running the code generator with Gradle

jOOQ in 7 easy steps

这篇关于JOOQ学习笔记:gradle版代码生成、生成指定的数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112123

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n