之前应用的都是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
@Servicepublic 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 */@RestControllerpublic 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