之前应用的都是 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 的代码
生成代码目录解析:
├─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. 运行代码,测试喽
能够发现曾经返回失常的数据,示意咱们框架搭建胜利了。
前面会再增加其余的办法,明天就先简略搭建一个框架喽,也能够本人看一下教程学习一下。
集体博客地址
http://www.zhouzhaodong.xyz/
Github 代码地址
https://github.com/zhouzhaodong/springboot/tree/master/jooq