一、什么是JOOQ:

JOOQ 是基于Java访问关系型数据库的工具包。JOOQ 既吸取了传统ORM操作数据的简单性和安全性,又保留了原生sql的灵活性,它更像是介于 ORMS和JDBC的中间层。

DSL(Domain Specific Language )风格,代码够简单和清晰。遇到不会写的sql可以充分利用IDEA代码提示功能轻松完成。

保留了传统ORM 的优点,简单操作性,安全性,类型安全等。不需要复杂的配置,并且可以利用Java 8 Stream API 做更加复杂的数据转换。

支持主流的RDMS和更多的特性,如self-joins,union,存储过程,复杂的子查询等等。

丰富的Fluent API和完善文档。

runtime schema mapping 可以支持多个数据库schema访问。简单来说使用一个连接池可以访问N个DB schema,使用比较多的就是SaaS应用的多租户场景。

如何反向生成Jooq?

前言:本次项目的搭建使用SpringBoot + MySQL + Jooq整合

1.创建好SpringBoot项目后在pom.xml中导入jooq所需包:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.1.4.RELEASE

com.demo

springjooq-1

0.0.1-SNAPSHOT

springjooq-1

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

mysql

mysql-connector-java

5.1.21

org.springframework.boot

spring-boot-starter-jooq

org.projectlombok

lombok

1.16.18

com.alibaba

fastjson

1.2.15

com.alibaba

druid

1.1.3

org.jooq

jooq-meta

org.jooq

jooq-codegen

org.springframework.boot

spring-boot-maven-plugin

org.jooq

jooq-codegen-maven

${jooq.version}

generate

mysql

mysql-connector-java

5.1.21

src/main/resources/JooqConfig.xml

2.在application.properties中加入访问数据库路径

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=UTF-8

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3.在SpringBoot项目结构的src/main/resources下创建一个JooqConfig.xml

com.mysql.jdbc.Driver

jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=UTF-8

root

123456

org.jooq.meta.mysql.MySQLDatabase

.*

demo

true

true

true

false

com.demo.main.jooq

src/main/java

4.右击项目选择Run->Maven install运行即可,如图 (注:如使用IDEA在编辑器的右边点击Maven找到指定项目点击install即可 )

5.生成好后可以看到项目的结构

6.生成的每个类是做什么的!

1.先讲解下jooq包下面的每个类的作用:

DefaultCatalog.java:里面存放的是Demo.java也就是数据库名

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import javax.annotation.Generated;

import org.jooq.Schema;

import org.jooq.impl.CatalogImpl;

/**

* This class is generated by jOOQ.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class DefaultCatalog extends CatalogImpl {

private static final long serialVersionUID = 1891688733;

/**

* The reference instance of

*/

public static final DefaultCatalog DEFAULT_CATALOG = new DefaultCatalog();

/**

* The schema demo.

*/

public final Demo DEMO = com.demo.main.jooq.Demo.DEMO;

/**

* No further instances allowed

*/

private DefaultCatalog() {

super("");

}

@Override

public final List getSchemas() {

List result = new ArrayList();

result.addAll(getSchemas0());

return result;

}

private final List getSchemas0() {

return Arrays.asList(

Demo.DEMO);

}

}

Demo.java里面存放的是数据库的表

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq;

import com.demo.main.jooq.tables.SClass;

import com.demo.main.jooq.tables.Student;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import javax.annotation.Generated;

import org.jooq.Catalog;

import org.jooq.Table;

import org.jooq.impl.SchemaImpl;

/**

* This class is generated by jOOQ.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class Demo extends SchemaImpl {

private static final long serialVersionUID = 979506244;

/**

* The reference instance of demo

*/

public static final Demo DEMO = new Demo();

/**

* The table demo.student.

*/

public final Student STUDENT = com.demo.main.jooq.tables.Student.STUDENT;

/**

* The table demo.s_class.

*/

public final SClass S_CLASS = com.demo.main.jooq.tables.SClass.S_CLASS;

/**

* No further instances allowed

*/

private Demo() {

super("demo", null);

}

/**

* {@inheritDoc}

*/

@Override

public Catalog getCatalog() {

return DefaultCatalog.DEFAULT_CATALOG;

}

@Override

public final List

List result = new ArrayList();

result.addAll(getTables0());

return result;

}

private final List

return Arrays.

Student.STUDENT,

SClass.S_CLASS);

}

}

Indexes.java存放的是表的主键(索引)

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq;

import com.demo.main.jooq.tables.SClass;

import javax.annotation.Generated;

import org.jooq.Index;

import org.jooq.OrderField;

import org.jooq.impl.Internal;

/**

* A class modelling indexes of tables of the demo schema.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class Indexes {

// -------------------------------------------------------------------------

// INDEX definitions

// -------------------------------------------------------------------------

public static final Index S_CLASS_PRIMARY = Indexes0.S_CLASS_PRIMARY;

// -------------------------------------------------------------------------

// [#1459] distribute members to avoid static initialisers > 64kb

// -------------------------------------------------------------------------

private static class Indexes0 {//数据库中设置SClass.ID为主键

public static Index S_CLASS_PRIMARY = Internal.createIndex("PRIMARY", SClass.S_CLASS, new OrderField[] { SClass.S_CLASS.ID }, true);

}

}

Keys.java里面有两个类Identities0存放的自增字段,UniqueKeys0存放的是唯一字段

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq;

import com.demo.main.jooq.tables.SClass;

import com.demo.main.jooq.tables.records.SClassRecord;

import javax.annotation.Generated;

import org.jooq.Identity;

import org.jooq.UniqueKey;

import org.jooq.impl.Internal;

/**

* A class modelling foreign key relationships and constraints of tables of

* the demo schema.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class Keys {

// -------------------------------------------------------------------------

// IDENTITY definitions

// -------------------------------------------------------------------------

public static final Identity IDENTITY_S_CLASS = Identities0.IDENTITY_S_CLASS;

// -------------------------------------------------------------------------

// UNIQUE and PRIMARY KEY definitions

// -------------------------------------------------------------------------

public static final UniqueKey KEY_S_CLASS_PRIMARY = UniqueKeys0.KEY_S_CLASS_PRIMARY;

// -------------------------------------------------------------------------

// FOREIGN KEY definitions

// -------------------------------------------------------------------------

// -------------------------------------------------------------------------

// [#1459] distribute members to avoid static initialisers > 64kb

// -------------------------------------------------------------------------

private static class Identities0 {//自增

public static Identity IDENTITY_S_CLASS = Internal.createIdentity(SClass.S_CLASS, SClass.S_CLASS.ID);

}

private static class UniqueKeys0 {//主键

public static final UniqueKey KEY_S_CLASS_PRIMARY = Internal.createUniqueKey(SClass.S_CLASS, "KEY_s_class_PRIMARY", SClass.S_CLASS.ID);

}

}

Tables.java里面存放的是表名,一般都是通过这个类去访问表和字段的

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq;

import com.demo.main.jooq.tables.SClass;

import com.demo.main.jooq.tables.Student;

import javax.annotation.Generated;

/**

* Convenience access to all tables in demo

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class Tables {

/**

* The table demo.student.

*/

public static final Student STUDENT = com.demo.main.jooq.tables.Student.STUDENT;

/**

* The table demo.s_class.

*/

public static final SClass S_CLASS = com.demo.main.jooq.tables.SClass.S_CLASS;

}

2.然后讲下tables包下面的两个类对应着数据库的表, 类里面就是表的字段了(注:只展示一个类的代码,方便理解)

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq.tables;

import com.demo.main.jooq.Demo;

import com.demo.main.jooq.Indexes;

import com.demo.main.jooq.Keys;

import com.demo.main.jooq.tables.records.SClassRecord;

import java.util.Arrays;

import java.util.List;

import javax.annotation.Generated;

import org.jooq.Field;

import org.jooq.ForeignKey;

import org.jooq.Identity;

import org.jooq.Index;

import org.jooq.Name;

import org.jooq.Record;

import org.jooq.Schema;

import org.jooq.Table;

import org.jooq.TableField;

import org.jooq.UniqueKey;

import org.jooq.impl.DSL;

import org.jooq.impl.TableImpl;

/**

* This class is generated by jOOQ.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class SClass extends TableImpl {

private static final long serialVersionUID = -1991044853;

/**

* The reference instance of demo.s_class

*/

public static final SClass S_CLASS = new SClass();

/**

* The class holding records for this type

*/

@Override

public Class getRecordType() {

return SClassRecord.class;

}

/**

* The column demo.s_class.id.

*/

public final TableField ID = createField("id", org.jooq.impl.SQLDataType.INTEGER.nullable(false).identity(true), this, "");

/**

* The column demo.s_class.classname.

*/

public final TableField CLASSNAME = createField("classname", org.jooq.impl.SQLDataType.VARCHAR(255), this, "");

/**

* Create a demo.s_class table reference

*/

public SClass() {

this(DSL.name("s_class"), null);

}

/**

* Create an aliased demo.s_class table reference

*/

public SClass(String alias) {

this(DSL.name(alias), S_CLASS);

}

/**

* Create an aliased demo.s_class table reference

*/

public SClass(Name alias) {

this(alias, S_CLASS);

}

private SClass(Name alias, Table aliased) {

this(alias, aliased, null);

}

private SClass(Name alias, Table aliased, Field>[] parameters) {

super(alias, null, aliased, parameters, DSL.comment(""));

}

public SClass(Table child, ForeignKey key) {

super(child, key, S_CLASS);

}

/**

* {@inheritDoc}

*/

@Override

public Schema getSchema() {

return Demo.DEMO;

}

/**

* {@inheritDoc}

*/

@Override

public List getIndexes() {

return Arrays.asList(Indexes.S_CLASS_PRIMARY);

}

/**

* {@inheritDoc}

*/

@Override

public Identity getIdentity() {

return Keys.IDENTITY_S_CLASS;

}

/**

* {@inheritDoc}

*/

@Override

public UniqueKey getPrimaryKey() {

return Keys.KEY_S_CLASS_PRIMARY;

}

/**

* {@inheritDoc}

*/

@Override

public List> getKeys() {

return Arrays.>asList(Keys.KEY_S_CLASS_PRIMARY);

}

/**

* {@inheritDoc}

*/

@Override

public SClass as(String alias) {

return new SClass(DSL.name(alias), this);

}

/**

* {@inheritDoc}

*/

@Override

public SClass as(Name alias) {

return new SClass(alias, this);

}

/**

* Rename this table

*/

@Override

public SClass rename(String name) {

return new SClass(DSL.name(name), null);

}

/**

* Rename this table

*/

@Override

public SClass rename(Name name) {

return new SClass(name, null);

}

}

3.daos包下面的dao层会有自动生成的一些定义好的增删改方法,这里只生成了一个因为另一张表没有设置索引

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq.tables.daos;

import com.demo.main.jooq.tables.SClass;

import com.demo.main.jooq.tables.records.SClassRecord;

import java.util.List;

import javax.annotation.Generated;

import org.jooq.Configuration;

import org.jooq.impl.DAOImpl;

/**

* This class is generated by jOOQ.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class SClassDao extends DAOImpl {

/**

* Create a new SClassDao without any configuration

*/

public SClassDao() {

super(SClass.S_CLASS, com.demo.main.jooq.tables.pojos.SClass.class);

}

/**

* Create a new SClassDao with an attached configuration

*/

public SClassDao(Configuration configuration) {

super(SClass.S_CLASS, com.demo.main.jooq.tables.pojos.SClass.class, configuration);

}

/**

* {@inheritDoc}

*/

@Override

protected Integer getId(com.demo.main.jooq.tables.pojos.SClass object) {

return object.getId();

}

/**

* Fetch records that have id IN (values)

*/

public List fetchById(Integer... values) {

return fetch(SClass.S_CLASS.ID, values);

}

/**

* Fetch a unique record that has id = value

*/

public com.demo.main.jooq.tables.pojos.SClass fetchOneById(Integer value) {

return fetchOne(SClass.S_CLASS.ID, value);

}

/**

* Fetch records that have classname IN (values)

*/

public List fetchByClassname(String... values) {

return fetch(SClass.S_CLASS.CLASSNAME, values);

}

}

4. pojos包下面顾名思义就是实体类了(注:只展示一个类的代码,方便理解)

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq.tables.pojos;

import java.io.Serializable;

import javax.annotation.Generated;

/**

* This class is generated by jOOQ.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class SClass implements Serializable {

private static final long serialVersionUID = 1278405963;

private Integer id;

private String classname;

public SClass() {}

public SClass(SClass value) {

this.id = value.id;

this.classname = value.classname;

}

public SClass(

Integer id,

String classname

) {

this.id = id;

this.classname = classname;

}

public Integer getId() {

return this.id;

}

public void setId(Integer id) {

this.id = id;

}

public String getClassname() {

return this.classname;

}

public void setClassname(String classname) {

this.classname = classname;

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder("SClass (");

sb.append(id);

sb.append(", ").append(classname);

sb.append(")");

return sb.toString();

}

}

5.Record包下面记录一些表字段(注:只展示一个类的代码,方便理解)

/*

* This file is generated by jOOQ.

*/

package com.demo.main.jooq.tables.records;

import com.demo.main.jooq.tables.SClass;

import javax.annotation.Generated;

import org.jooq.Field;

import org.jooq.Record1;

import org.jooq.Record2;

import org.jooq.Row2;

import org.jooq.impl.UpdatableRecordImpl;

/**

* This class is generated by jOOQ.

*/

@Generated(

value = {

"http://www.jooq.org",

"jOOQ version:3.11.9"

},

comments = "This class is generated by jOOQ"

)

@SuppressWarnings({ "all", "unchecked", "rawtypes" })

public class SClassRecord extends UpdatableRecordImpl implements Record2 {

private static final long serialVersionUID = -7367157;

/**

* Setter for demo.s_class.id.

*/

public void setId(Integer value) {

set(0, value);

}

/**

* Getter for demo.s_class.id.

*/

public Integer getId() {

return (Integer) get(0);

}

/**

* Setter for demo.s_class.classname.

*/

public void setClassname(String value) {

set(1, value);

}

/**

* Getter for demo.s_class.classname.

*/

public String getClassname() {

return (String) get(1);

}

// -------------------------------------------------------------------------

// Primary key information

// -------------------------------------------------------------------------

/**

* {@inheritDoc}

*/

@Override

public Record1 key() {

return (Record1) super.key();

}

// -------------------------------------------------------------------------

// Record2 type implementation

// -------------------------------------------------------------------------

/**

* {@inheritDoc}

*/

@Override

public Row2 fieldsRow() {

return (Row2) super.fieldsRow();

}

/**

* {@inheritDoc}

*/

@Override

public Row2 valuesRow() {

return (Row2) super.valuesRow();

}

/**

* {@inheritDoc}

*/

@Override

public Field field1() {

return SClass.S_CLASS.ID;

}

/**

* {@inheritDoc}

*/

@Override

public Field field2() {

return SClass.S_CLASS.CLASSNAME;

}

/**

* {@inheritDoc}

*/

@Override

public Integer component1() {

return getId();

}

/**

* {@inheritDoc}

*/

@Override

public String component2() {

return getClassname();

}

/**

* {@inheritDoc}

*/

@Override

public Integer value1() {

return getId();

}

/**

* {@inheritDoc}

*/

@Override

public String value2() {

return getClassname();

}

/**

* {@inheritDoc}

*/

@Override

public SClassRecord value1(Integer value) {

setId(value);

return this;

}

/**

* {@inheritDoc}

*/

@Override

public SClassRecord value2(String value) {

setClassname(value);

return this;

}

/**

* {@inheritDoc}

*/

@Override

public SClassRecord values(Integer value1, String value2) {

value1(value1);

value2(value2);

return this;

}

// -------------------------------------------------------------------------

// Constructors

// -------------------------------------------------------------------------

/**

* Create a detached SClassRecord

*/

public SClassRecord() {

super(SClass.S_CLASS);

}

/**

* Create a detached, initialised SClassRecord

*/

public SClassRecord(Integer id, String classname) {

super(SClass.S_CLASS);

set(0, id);

set(1, classname);

}

}

jooq spring mysql_【中级篇】详细讲解使用SpringBoot + Jooq整合(一)相关推荐

  1. Spring 事务管理的详细讲解及使用

    文章目录 一. Spring 事务管理简介 二.Spring 事务管理器 1.Spring 事务管理接口 1.1. PlatformTransactionManager 接口 1.2. Transac ...

  2. Spring Boot Admin监控中心详细讲解

    你心心念念想得到的人,也许正是别人已经玩腻了的人!!!所以,我们现在正在想学习的东西,正是人家已经玩了很久已经很腻的人了~~~所以现在立刻马上开始 Spring Boot Admin  是个什么东东? ...

  3. 视频教程-C# For Unity系列之中级篇-Unity3D

    C# For Unity系列之中级篇 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理 ...

  4. PE格式详细讲解4 - 系统篇04|解密系列

    PE格式详细讲解4 - 系统篇04 让编程改变世界 Change the world by program   到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的 ...

  5. PE格式详细讲解1 - 系统篇01|解密系列

    PE格式详细讲解1 - 系统篇01 让编程改变世界 Change the world by program 由于时间关系,这里只整理出必要的课件内容,详细请下载具体课件和详细讲解视频. [codesy ...

  6. PE格式详细讲解11 - 系统篇11|解密系列

    PE格式详细讲解11 - 系统篇11 让编程改变世界 Change the world by program   今天我们来谈谈资源部分,资源部分可以说是 PE 文件所有结构中,最复杂的一部分,也最让 ...

  7. JavaScript中Object对象方法超详细讲解举例说明仅此一篇

    JavaScript中Object对象方法超详细讲解举例说明仅此一篇 Object.assign() Object.create() Object.values() Object.entries() ...

  8. Spring Cloud详细讲解

    Spring Cloud详细讲解 一.微服务架构4个核心问题 1.服务很多,客户端该怎么访问? 2.这么多服务服务之间如何通信? 3.这么多服务,如何治理? 4.服务挂了怎么办? 解决方案: Spri ...

  9. vue-trtc多人视频开发(从零开始)-有手就行篇-最详细讲解

    大家花个几分钟把帖子详细看完  新手也能做直播集成开发!一步到位  相信小编 最效率最省力最通透的文档! 甚至直接可以copy使用的哦!!但是记得给小编一个赞吧 孩子天天熬夜加班 还写博客确实不容易 ...

  10. PE格式详细讲解2 - 系统篇02

    原作者:小甲鱼 (注:最左边是文件头的偏移量.) IMAGE_DOS_HEADER STRUCT { +0h WORD e_magic // Magic DOS signature MZ(4Dh 5A ...

最新文章

  1. android api在线文档_通过 API 远程管理 Jenkins
  2. 第二届「星斗奖」获奖名单正式公布
  3. 输入法问题_「图」KB4515384再爆新问题:OOBE时中文输入法阻止创建本地账户
  4. php 缩略图 失真,WORDPRESS缩略图失真变形模糊的解决方法
  5. java中quickhit_关于java的QuickHit打字游戏小项目
  6. 拓端tecdat|R语言中Gibbs抽样的Bayesian贝叶斯简单线性回归
  7. java快速生成接口文档方法总结
  8. 2023南京师范大学计算机考研信息汇总
  9. 37个 safari 快捷键,让Mac网页浏览更方便
  10. Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase alpha-numeric characters and
  11. 领袖一般会采用什么方式?
  12. Matlab画天球坐标图,知道方位角和高度角
  13. (三)Linux vi 文本编辑器,用户管理,组管理,Sudo命令,时间管理
  14. 50本关于软件测试的书籍
  15. DNUICTF反思总结
  16. 接口传输带格式的文字和图片_除了看书爽,这款带手写笔的「电纸书」还是办公利器...
  17. 多网卡情况,使用静态路由,为访问目标网络指定路径
  18. java上机实验作业 编写汽车类car_请问如何用Java编写一个汽车类Car
  19. c语言的运算符号优先级
  20. 成为管理者---对组织的贡献

热门文章

  1. 各种Camera,总有一款适合你(一)
  2. 基于队列的锁:mcs lock简介
  3. 真希望能夠統一一下接口
  4. jms两种模式例子-超越昨天的自己系列(2)
  5. perl的USE和require
  6. 1、CSS height 属性,2、Flex 布局教程:实例篇,3、CSS 链接,4、CSS display 属性,5、表格,
  7. 12.看板方法---度量和管理报告
  8. 52. 配置 Etag (13)
  9. [2019杭电多校第六场][hdu6635]Nonsense Time
  10. 应用安全 - Web安全 - 文件包含攻防