之前使用的都是Spring Boot + Mybatis或者Hibernate进行数据库相关的开发,可是这些框架对于联表查询等又不是很友好,最近发现了一个Jooq框架,据说很好用。。。
搭建Spring Boot项目
这个搭建方式我也就不在赘述了,不可能不会的吧?
pom.xml文件
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-jooq
mysql
mysql-connector-java
runtime
org.jooq
jooq-meta
3.13.4
org.jooq
jooq-codegen
3.13.4
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
org.jooq
jooq-codegen-maven
3.13.4
com.mysql.cj.jdbc.Driver
jdbc:mysql://IP地址:3306/jooq?serverTimezone=GMT%2B8
用户名
密码
.*
jooq
xyz.zhouzhaodong.jooq.dao
/src/main/java
1. 代码生成模块整合进pom.xml里面
里面包含了代码生成模块,可以在maven里面一键生成代码,这里需要注意的是,每次生成代码会覆盖之前的代码,也就是每次都是根据数据库生成最新的代码。
配置好更新maven之后就会发现里面有jooq的代码生成了。
2. 代码生成模块单独写工具类
如果不想在pom.xml里面加入代码生成模块的话,我们还是可以将其分离出来的:
/**
* 代码生成器
*
* @author zhouzhaodong
*/
public class JOOQGenerator extends JavaGenerator {
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mysql://IP地址:3306/jooq?useUnicode=true&characterEncoding=utf8";
private static final String JDBC_USERNAME = 用户名;
private static final String JDBC_PASSWORD = 密码;
private static final String JOOQ_DATABASE_NAME = "org.jooq.meta.jdbc.JDBCDatabase";
private static final String GENERATOR_PATH = "src/main/java";
public static void genTables(String schemaName, String packageName, String includes, String excludes) throws Exception {
Jdbc jdbc = createJdbc();
Generator generator = createGenerator(schemaName, packageName, includes, excludes);
Configuration configuration = new Configuration()
.withJdbc(jdbc)
.withGenerator(generator);
GenerationTool.generate(configuration);
}
private static Generator createGenerator(String schemaName, String packageName, String includes, String excludes) {
Database database = createDatabase(schemaName, includes, excludes);
Target target = createTarget(packageName);
Generate generate = createGenerate();
return new Generator()
.withDatabase(database)
.withTarget(target)
.withGenerate(generate);
}
private static Jdbc createJdbc() {
return new Jdbc()
.withDriver(JDBC_DRIVER)
.withUrl(JDBC_URL)
.withUser(JDBC_USERNAME)
.withPassword(JDBC_PASSWORD);
}
private static Target createTarget(String packageName) {
return new Target().withDirectory(GENERATOR_PATH).withPackageName(packageName);
}
private static Database createDatabase(String schemaName, String includes, String excludes) {
Database database = new Database().withName(JOOQ_DATABASE_NAME).withInputSchema(schemaName);
if (includes != null && !"".equals(includes)) {
database.withIncludes(includes);
}
if (excludes != null && !"".equals(excludes)) {
database.withExcludes(excludes);
}
return database;
}
private static Generate createGenerate() {
Generate generate = new Generate();
generate.withDaos(false)
.withPojos(true);
return generate;
}
private static void generate() throws Exception {
genTables("jooq", "xyz.zhouzhaodong.jooq.code", ".*", "");
}
public static void main(String[] args) throws Exception {
generate();
}
}
application.yml
server:
port: 9999 # 端口号
spring:
# 数据库连接信息
datasource:
url: jdbc:mysql://ip地址:3306/jooq?useUnicode=true&characterEncoding=utf8
username: 用户名
password: 密码
自动生成代码
我们这里使用第一种方式生成Jooq的代码
生成代码目录解析:
├─src/main/java/.../dao ---- // 生成路径
│ ├─tables --------------------- // 表定义目录
│ │ ├─Jooq --------------------- // jooq 表描述包含: 字段,主键,索引,所属Schema
│ │ └─records ------------------ // 表操作对象目录
│ │ └─JooqRecord ----------- // jooq 表操作对象,包含字段get,set方法
│ ├─DefaultCatalog ------------- // Catalog对象,包含Schema常量
│ ├─Keys ----------------------- // 当前数据库所有表主键,唯一索引等常量
│ ├─Jooq ----------------------- // 数据库`jooq`常量,包含该库所有表描述常量
│ └─Tables --------------------- // 所有数据库表常量
开发喽
1. 新建实体类
/**
* 实体类
*
* @author zhouzhaodong
*/
public class JooqPojo {
private String name;
private Integer age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2. 新建service
我们这里写一个简单的查询:
public interface JooqService {
/**
* 根据姓名查询
* @param name
* @return
*/
JooqPojo selectByName(String name);
}
3. 新建serviceImpl
@Service
public class JooqServiceImpl implements JooqService {
@Resource
DSLContext dslContext;
Jooq jooq = Jooq.JOOQ_.as("jooq");
@Override
public JooqPojo selectByName(String name) {
return dslContext.select()
.from(jooq)
.where(jooq.NAME.eq(name)).fetchAny(r -> r.into(JooqPojo.class));
}
}
4. 新建controller
/**
* 控制层
*
* @author zhouzhaodong
*/
@RestController
public class JooqController {
@Resource
JooqService jooqService;
@RequestMapping("/selectByName")
public JooqPojo selectByName(String name) {
return jooqService.selectByName(name);
}
}
5. 运行代码,测试喽
可以发现已经返回正常的数据,表示我们框架搭建成功了。
后面会再添加其他的方法,今天就先简单搭建一个框架喽,也可以自己看一下教程学习一下。