作者:一一哥
jOOQ(Java Object Oriented Querying): 翻译成中文是 Java面向对象查询 的意思。
jOOQ是Data Geekery提供的基于Java的轻量级数据库访问库,通过特定的语法将类以及数据库模型翻译成对应的SQL语句实现实体与关系的映射,在数据库与类之间建立起一一对应关系,也可以让我们通过它的流式API构建出类型安全的SQL查询。
jOOQ是一个基于Java编写SQL的工具包,具有简单、轻量、函数式编程写SQL等独特优势,非常适合敏捷快速迭代开发。
jOOQ不管是商业版,还是开源版本都能跟Spring Boot一块使用。
继承了ORM框架的优点,简单操作,类型安全等。jOOQ将SQL建模为内部DSL,使用Java编译器编译SQL语法,元数据和数据类型。
jOOQ会根据数据库的元数据来生成对应的实体类,省略了原有开发中不断修改对应数据库的类名,属性名。
jOOQ允许运行时配置数据库模式,且支持行级别的安全。
支持联合查询,多表查询,存储过程等数据库高级操作。
我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

mysql
mysql-connector-java
com.alibaba
fastjson
1.2.46
com.alibaba
druid
1.1.10
org.springframework.boot
spring-boot-starter-jooq
org.jooq
jooq-meta
org.jooq
jooq-codegen
org.springframework.boot
spring-boot-starter-data-jpa
org.apache.maven.plugins
maven-compiler-plugin
org.jooq
jooq-codegen-maven
generate
mysql
mysql-connector-java
${mysql.version}
src/main/resources/JooqConfig.xml
在resource目录下,创建一个JooqConfig.xml配置文件,用来进行关联数据库,根据数据库进行逆向生成对应的Java代码。
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/db4?serverTimezone=GMT
root
syc
org.jooq.codegen.JavaGenerator
public\..*\.id
override_primmary_key
org.jooq.meta.mysql.MySQLDatabase
.*
db4
true
true
true
false
com.yyg.boot.generator
src/main/java
在lifecycle中执行compile命令,就可以自动执行逆向工程的命令了。
只要JooqConfig.xml配置文件没问题,并且依赖包都完整下载,就可以逆向工程执行成功。

逆向工程执行完毕后,我们就可以看到如下效果,发现自动生成了很多的Java代码,这些Java代码就是根据我们数据库中的表,生成的对应的Java代码。

对应的数据库表。
主要是配置关联我们的数据库。
spring:
datasource:
url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: syc
driver-class-name: com.mysql.jdbc.Driver #驱动
jpa:
hibernate:
ddl-auto: update #自动更新
show-sql: true #日志中显示sql语句
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第二种配置数据源的方式
*/
@Data
@ComponentScan
@Configuration
@ConfigurationProperties(prefix="spring.datasource")
public class DbConfig {
private String url;
private String username;
private String password;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
创建UserService接口
package com.yyg.boot.service;
import com.yyg.boot.generator.tables.pojos.User;
import java.util.Iterator;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/2
* @Description Description
*/
public interface UserService {
/**
* 删除
*/
void delete(int id);
/**
* 增加
*/
void insert(User user);
/**
* 更新
*/
int update(User user);
/**
* 查询单个
*/
User selectById(int id);
/**
* 查询全部列表
*/
List selectAll(int pageNum, int pageSize);
}
创建UserServiceImpl类
package com.yyg.boot.service.impl;
import com.yyg.boot.generator.tables.User;
import com.yyg.boot.generator.tables.records.UserRecord;
import com.yyg.boot.service.UserService;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.UpdateSetMoreStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Iterator;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/2
* @Description Description
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
DSLContext dsl;
/**
* 给User表 重命名 u 。(类似sql语句中的 user as u).
* 注意一点,这个User类是逆向生成的tables包下的,不是pojos包下的User实体类。
* (逆向工程它会生成两个User类。一个在pojos下,一个再tables下)
*/
com.yyg.boot.generator.tables.User u = User.USER.as("u");
/**
* 删除
*/
@Override
public void delete(int id) {
dsl.delete(u).where(u.ID.eq(id));
}
/**
* 增加
*/
@Override
public void insert(com.yyg.boot.generator.tables.pojos.User user) {
dsl.insertInto(u).
columns(u.ADDRESS, u.BIRTHDAY, u.SEX, u.USERNAME).
values(user.getAddress(), user.getBirthday(), user.getSex(), user.getUsername())
.execute();
}
/**
* 更新
*
* @param user
*/
@Override
public int update(com.yyg.boot.generator.tables.pojos.User user) {
dsl.update(u).set((Record) user);
return 0;
}
/**
* 查询单个
*/
@Override
public com.yyg.boot.generator.tables.pojos.User selectById(int id) {
List result = dsl.select(u.ADDRESS,u.BIRTHDAY,u.ID,u.SEX,u.USERNAME)
.from(u)
.where(u.ID.eq(id))
.fetch()
.into(com.yyg.boot.generator.tables.pojos.User.class);
return result.get(0);
}
/**
* 查询全部列表
*/
@Override
public List selectAll(int pageNum, int pageSize) {
return dsl.select()
.from(u)
//id倒序
.orderBy(u.ID.desc())
//分页
.limit(0)
//分页
.offset(10)
.fetch()
//数据类型格式转化
.into(com.yyg.boot.generator.tables.pojos.User.class);
}
}
package com.yyg.boot.web;
import com.yyg.boot.generator.tables.pojos.User;
import com.yyg.boot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/2
* @Description Description
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User findUserById(@PathVariable("id") Integer id) {
return userService.selectById(id);
}
}
package com.yyg.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author 一一哥Sun
* @Date Created in 2020/4/2
* @Description Description
*/
@SpringBootApplication
public class JooqApplication {
public static void main(String[] args){
SpringApplication.run(JooqApplication.class,args);
}
}