在一次学习分布式跟踪系统zipkin中,发现了jooq这个组件,当时不知这个组件是干嘛的,后来抽空学习了一下,感觉这个组件还挺用的。它主要有以下作用:

  • 通过DSL(Domain Specific Language )风格,利用Java代码写sql。
  • 支持主流的RDMS和更多的特性,如self-joins,union,存储过程,复杂的子查询等。
  • 提供GenerationTool,能够通过表结构自动生成代码。

Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级。说直白一点,Flyway就是做数据库版本控制的,在数据库版本升级中很有作用。

本文通过一个整合实例,来简单说明Jooq的用法,该例子我也提交到GitHub上,链接为:https://github.com/lzj09/sw-jooq

下面开始讲解整合的过程。

1、pom.xml文件

其实整合的过程,大部分的工作都是在pom文件里面完成,只要看懂了pom文件,整合过程基本上就明白了。pom文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent> <modelVersion>4.0.0</modelVersion>
<groupId>com.swnote.jooq</groupId>
<artifactId>sw-jooq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sw-jooq</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- jooq相关包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
</dependency> <!-- flyway相关包 -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency> <!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin> <plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin> <!-- 用于加载application.yml信息,在pom文件可读取到application.yml中信息 -->
<plugin>
<groupId>it.ozimov</groupId>
<artifactId>yaml-properties-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>src/main/resources/application.yml</file>
</files>
</configuration>
</execution>
</executions>
</plugin> <!-- flyway的插件配置 -->
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>migrate</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 此处的信息是读取的application.yml中的信息 -->
<url>${spring.datasource.url}</url>
<user>${spring.datasource.username}</user>
<password>${spring.datasource.password}</password>
<locations>
<location>filesystem:src/main/resources/db/migration</location>
</locations>
</configuration>
</plugin> <!-- jooq插件配置 -->
<plugin>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen-maven</artifactId>
<executions>
<execution>
<id>jooq</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<jdbc>
<driver>${spring.datasource.driverClassName}</driver>
<url>${spring.datasource.url}</url>
<user>${spring.datasource.username}</user>
<password>${spring.datasource.password}</password>
</jdbc>
<!-- 自动生成代码的配置 -->
<generator>
<database>
<name>org.jooq.util.mysql.MySQLDatabase</name>
<includes>.*</includes>
<excludes></excludes>
<dateAsTimestamp>true</dateAsTimestamp>
<!-- 连接的是数据库中jooq模式 -->
<inputSchema>jooq</inputSchema>
</database>
<generate>
<deprecated>false</deprecated>
<instanceFields>true</instanceFields>
<pojos>true</pojos>
</generate>
<target>
<!-- 指定自动生成代码的位置 -->
<packageName>com.swnote.jooq.generator</packageName>
<directory>src/main/java</directory>
</target>
</generator>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
</plugin>
</plugins> <resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project>

其中需要说明的几个关键点:

  • yaml-properties-maven-plugin,该插件可以使在pom文件中读取到application.yml文件中的配置,这样可以避免同样的配置有多次配置的问题。
  • flyway-maven-plugin,该插件用于配置flyway,指定了创表的sql的位置为src/main/resources/db/migration
  • jooq-codegen-maven,配置了所连接的数据库信息,模式名,以及自动生成的代码的配置,比如要生成哪些代码、将生成的代码放在哪个目录中等。

2、基于Jooq的CURD

由于Jooq支持通过Java代码来写sql的逻辑,为此例子工程中没有Dao层,sql的逻辑全部在Service层,Service层的代码如下:

用户信息服务接口:IUserService

package com.swnote.jooq.service;

import java.util.List;
import java.util.Map; import com.swnote.jooq.generator.tables.pojos.User; /**
* 用户信息服务接口
*
* @author lzj
* @date [2019-03-10]
*/
public interface IUserService { /**
* 创建用户
*
* @param user
*/
void create(User user); /**
* 根据id删除用户
*
* @param user_id
*/
void delete(String user_id); /**
* 更新用户
*
* @param user
*/
void update(User user); /**
* 根据id获取用户
*
* @param user_id
* @return
*/
User retrieve(String user_id); /**
* 根据条件获取用户列表
*
* @param params
* @return
*/
List<User> queryForList(Map<String, Object> params);
}

用户信息服务类:UserService

package com.swnote.jooq.service.impl;

import static com.swnote.jooq.generator.tables.User.USER;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import org.jooq.DSLContext;
import org.jooq.UpdateQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import com.swnote.jooq.generator.tables.pojos.User;
import com.swnote.jooq.generator.tables.records.UserRecord;
import com.swnote.jooq.service.IUserService; /**
* 用户信息服务类
*
* @author lzj
* @date [2019-03-10]
*/
@Transactional
@Service
public class UserService implements IUserService { @Autowired
private DSLContext dsl; @Override
public void create(User user) {
// 构建insert语句
dsl.insertInto(USER, USER.USER_ID, USER.NAME, USER.INTRO)
.values(user.getUserId(), user.getName(), user.getIntro()).execute();
} @Override
public void delete(String user_id) {
// 构建delete语句
dsl.delete(USER).where(USER.USER_ID.eq(user_id)).execute();
} @Override
public void update(User user) {
// 构建update语句
UpdateQuery<UserRecord> update = dsl.updateQuery(USER);
update.addValue(USER.NAME, user.getName());
update.addValue(USER.INTRO, user.getIntro());
update.addConditions(USER.USER_ID.eq(user.getUserId()));
update.execute();
} @Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public User retrieve(String user_id) {
// 构建select语句
List<User> users = dsl.select(USER.USER_ID, USER.NAME, USER.INTRO).from(USER).where(USER.USER_ID.eq(user_id))
.fetch().into(User.class); if (users != null && !users.isEmpty()) {
return users.get(0);
}
return null;
} @Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public List<User> queryForList(Map<String, Object> params) {
// 构建select语句
StringBuilder builder = new StringBuilder();
if (params != null) {
for (Entry<String, Object> entry : params.entrySet()) {
if (builder.length() == 0) {
builder.append(entry.getKey()).append(" = ").append(entry.getValue());
} else {
builder.append(" and ").append(entry.getKey()).append(" = ").append(entry.getValue());
}
}
} List<User> users = dsl.select(USER.USER_ID, USER.NAME, USER.INTRO).from(USER).where(builder.toString()).fetch().into(User.class);
return users;
}
}

从上面的代码可以看到利用Jooq来写sql的逻辑,也很简单。

3、测试

Controller层代码在此就不写,感兴趣的可以我的GitHub中去看。在此通过PostMan测试Controller中暴露的REST接口。例如新增接口:



执行后,数据库也就有了记录,即:

关注我

以你最方便的方式关注我:

微信公众号:

微服务架构 - SpringBoot整合Jooq和Flyway的更多相关文章

  1. 微服务架构 - SpringCloud整合分布式服务跟踪zipkin

    1.zipkin zipkin是Twitter的一个开源项目,它基于Google Dapper实现.我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询 ...

  2. 微服务架构 SpringBoot(一)

    spring Boot:官网地址 https://spring.io/ 由来: 随着spring组件功能的强大,配置文件也越来越复杂繁琐,背离了spring公司的简洁快速开发原理,2015年就推出Sp ...

  3. 微服务架构 SpringBoot(二)

    第二天内容:想来想去玩个ssm小demo吧 1.创建表 2..引入相关mybatis 数据库jar: <!--mybatis --> <dependency> <grou ...

  4. SpringBoot微服务架构下的MVC模型总结

    SpringBoot微服务架构下的MVC模型产生的原因: 微服务概念改变着软件开发领域,传统的开源框架结构开发,由于其繁琐的配置流程 , 复杂的设置行为,为项目的开发增加了繁重的工作量,微服务致力于解 ...

  5. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  6. 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot)

    title: 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot) date: 2019-07-30 14:06:29 categories: 架构 author: mrzhou ...

  7. spring-boot+spring-cloud+maven-module 一个 maven多模块的微服务架构模版

    spring-boot-cloud-module spring-boot+spring-cloud+maven-module 一个 maven多模块的微服务架构模版. 新手上路的绝佳模版,只有必要的配 ...

  8. 微服务架构 | 11.1 整合 Seata AT 模式实现分布式事务

    目录 前言 1. Seata 基础知识 1.1 Seata 的 AT 模式 1.2 Seata AT 模式的工作流程 1.3 Seata 服务端的存储模式 1.4 Seata 与 Spring Clo ...

  9. SpringCloud SpringBoot 前后端分离企业级微服务架构源码赠送

    基于SpringBoot2.x.SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务敏捷开发系统架构.并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手 ...

随机推荐

  1. vscode 停用插件自动更新

  2. Java程序算法设计视频分享,需要的来

    每年都会有人说,IT行业饱和了,根本就找不到工作,其实,我想说的是,不是工作难找,而是你自己不够好! 前几天看到一CEO在微博上吐槽: 前几天招一算法工程师我们给了8万月薪*14+奖金,人家去阿里拿5 ...

  3. PAT1093: Count PAT's

    1093. Count PAT's (25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng The strin ...

  4. https://doc.opensuse.org/projects/kiwi/doc/

    KIWI 是用于创建操作系统映像的系统.映像是带有一个文件的目录,该文件包含操作系统.其应用程序与配置.操作系统的文件系统结构.可能的附加元数据,以及(取决于映像类型)磁盘几何属性和分区表数据.通过 ...

  5. SSM-SpringMVC-29:SpringMVC中InitBinder的初步

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 之前博客的配置日期类型转换器,他是全局的,如果只是一个处理器中使用怎么办? 引出@InitBinder注解 ...

  6. MVP架构在xamarin android中的简单使用

    好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...

  7. Linux下启动时间优化专题

    1. 过往优化总结 陆陆续续在Linux进行启动时间优化,之前有两份文档,分别从内核和用户空间两个方向进行了优化. <Android/Linux boot time分析优化>和<Bu ...

  8. Java开发岗面试知识点解析

    本文作者参加过多场面试,应聘岗位均为 Java 开发方向.在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Java 常见集合 高并发编 ...

  9. 关于二叉查找树的一些事儿(bst详解,平衡树入门)

    最近刚学了平衡树,然后突发奇想写几篇博客纪念一下,可能由于是刚学的缘故,还有点儿生疏,望大家海涵 说到平衡树,就不得不从基础说起,而基础,正是二叉查找树 什么是二叉查找树?? 大家观察一下下面的这棵二 ...

  10. too many open files linux服务器 golang java

    1. 现象 服务的cpu跑满(golang实现), 并大量报too many open files错误.服务使用systemd来运行,部署在阿里ecs上. 2.分析 从日志来看,cpu的上升主要为到达 ...