之前使用的都是Spring Boot + Mybatis或者Hibernate进行数据库相关的开发,可是这些框架对于联表查询等又不是很友好,最近发现了一个Jooq框架,据说很好用。。。
搭建Spring Boot项目
这个搭建方式我也就不在赘述了,不可能不会的吧?
pom.xml文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--jooq 需要的meta和生成代码的codegen包
这里注意查看spring-boot-starter-jooq 中的jooq是什么版本-->
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
<version>3.13.4</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
<version>3.13.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 代码生成器插件 -->
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<version>3.13.4</version>
<configuration>
<!-- 配置jdbc驱动连接 -->
<jdbc>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>jdbc:mysql://IP地址:3306/jooq?serverTimezone=GMT%2B8</url>
<user>用户名</user>
<password>密码</password>
</jdbc>
<generator>
<database>
<!-- 生成包含,*表示包含所有内容 -->
<includes>.*</includes>
<!-- 数据库名 -->
<inputSchema>jooq</inputSchema>
</database>
<target>
<!-- 生成的代码所在的包结构 -->
<packageName>xyz.zhouzhaodong.jooq.dao</packageName>
<!-- 生成的代码存放路径,默认会以src同目录开始 -->
<directory>/src/main/java</directory>
</target>
</generator>
</configuration>
</plugin>
</plugins>
</build>
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的代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhyjAd94-1598232941716)(http://www.zhouzhaodong.xyz/upload/2020/08/image-5545705991f14295a41af519101d426c.png)]
生成代码目录解析:
├─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. 运行代码,测试喽
可以发现已经返回正常的数据,表示我们框架搭建成功了。
后面会再添加其他的方法,今天就先简单搭建一个框架喽,也可以自己看一下教程学习一下。