###先来介绍下jooq jOOQ是一个基于Java编写SQL的工具包,具有:简单、轻量、函数式编程写SQL等独特优势,非常适合敏捷快速迭代开发。

SQL语句:

SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)FROM AUTHORJOIN BOOK ON AUTHOR.ID = BOOK.AUTHOR_IDWHERE BOOK.LANGUAGE = 'DE'AND BOOK.PUBLISHED > DATE '2008-01-01'
GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAMEHAVING COUNT(*) > 5
ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRSTLIMIT 2OFFSET 1
复制代码

Java代码:

create.select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count()).from(AUTHOR).join(BOOK).on(AUTHOR.ID.equal(BOOK.AUTHOR_ID)).where(BOOK.LANGUAGE.eq("DE")).and(BOOK.PUBLISHED.gt(date("2008-01-01"))).groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME).having(count().gt(5)).orderBy(AUTHOR.LAST_NAME.asc().nullsFirst()).limit(2).offset(1)
复制代码

###那从这里开始正式开始整合

#####1. pom修改

<?xml version="1.0" encoding="UTF-8"?>
<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"><modelVersion>4.0.0</modelVersion><groupId>springboot-jooq</groupId><artifactId>springboot-jooq</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springboot-jooq</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jooq</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version></dependency><!-- 阿里巴巴fastjson,解析json视图 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.jooq</groupId><artifactId>jooq-meta</artifactId></dependency><dependency><groupId>org.jooq</groupId><artifactId>jooq-codegen</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin><plugin><groupId>org.jooq</groupId><artifactId>jooq-codegen-maven</artifactId><version>${jooq.version}</version><executions><execution><goals><goal>generate</goal></goals></execution></executions><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies><configuration><configurationFile>src/main/resources/JooqConfig.xml</configurationFile></configuration></plugin></plugins></build></project>复制代码
2. 逆向工程
2.1 逆向配置文件

JooqConfig.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration><jdbc><driver>com.mysql.jdbc.Driver</driver><url>jdbc:mysql://localhost:3306/user</url><user>root</user><password>root</password></jdbc><generator><!-- 代码生成器 --><name>org.jooq.util.JavaGenerator</name><database><!--下面这两行是为view也生成代码的关键--><!--force generating id'sfor everything in public schema, that has an 'id' field--><syntheticPrimaryKeys>public\..*\.id</syntheticPrimaryKeys><!--name for fake primary key--><overridePrimaryKeys>override_primmary_key</overridePrimaryKeys><name>org.jooq.util.mysql.MySQLDatabase</name><!--include和exclude用于控制为数据库中哪些表生成代码--><includes>.*</includes><!--<excludes></excludes>--><!--数据库名称--><inputSchema>user</inputSchema></database><generate><!--生成dao和pojo--><daos>true</daos><pojos>true</pojos><!--把数据库时间类型映射到java 8时间类型--><javaTimeTypes>true</javaTimeTypes><!--<interfaces>true</interfaces>--><!--不在生成的代码中添加spring注释,比如@Repository--><springAnnotations>false</springAnnotations></generate><target><!--生成代码文件的包名及放置目录--><packageName>com.generator</packageName><directory>src/main/java</directory></target></generator>
</configuration>
复制代码
2.2 mvn执行逆向工程

先进行clean 再compile,然后我们就会发现,生成了很多个类

如果你看到了这些,那么恭喜。你的jooq环境搭建成功了!

三层架构

service接口

UserService .java

package com.fantj.service;import com.fantj.pojos.User;import java.util.Iterator;/*** Created by Fant.J.*/
public interface UserService {/** 删除 */public void delete(int id);/** 增加*/public void insert(User user);/** 更新*/public int update(User user);/** 查询单个*/public User selectById(int id);/** 查询全部列表*/public Iterator<User> selectAll(int pageNum, int pageSize);
}复制代码
serviceImpl

UserServiceImpl .java

package com.fantj.service.impl;/*** Created by Fant.J.*/
@Service
public class UserServiceImpl implements UserService {@AutowiredDSLContext dsl;
/*@Autowiredprivate UserDao userDao;*/com.generator.tables.User u =  User.USER_.as("u");/*** 删除** @param id*/@Overridepublic void delete(int id) {dsl.delete(u).where(u.ID.eq(id));}/*** 增加** @param user*/@Overridepublic void insert(com.fantj.pojos.User user) {dsl.insertInto(u).columns(u.ADDRESS,u.BIRTHDAY,u.SEX,u.USERNAME).values(user.getAddress(),user.getBirthday(),user.getSex(),user.getUsername()).execute();}/*** 更新** @param user*/@Overridepublic int update(com.fantj.pojos.User user) {dsl.update(u).set((Record) user);return 0;}/*** 查询单个** @param id*/@Overridepublic com.fantj.pojos.User selectById(int id) {Result result =  dsl.select(u.ADDRESS,u.BIRTHDAY,u.ID,u.SEX,u.USERNAME).from(u).where(u.ID.eq(id)).fetch();System.out.println(result.get(0).toString());String className = result.get(0).getClass().getName();System.out.println(className);com.fantj.pojos.User user = new com.fantj.pojos.User();return null;/*com.fantj.pojos.User user1 = userDao.findById(id);return user1;*/}/*** 查询全部列表*  @param pageNum* @param pageSize*/@Overridepublic Iterator<com.fantj.pojos.User> selectAll(int pageNum, int pageSize) {Result result = dsl.select().from(u).fetch();return result.iterator();}
}复制代码

我对几段代码做点解释

  @AutowiredDSLContext dsl;
复制代码

这里是注入DSL上下文对象,DSLContextl里面有connect对象,大概猜测的话应该是与数据库连接交互的一个对象。

com.generator.tables.User u =  User.USER_.as("u");
复制代码

这段代码的意思是给User表 重命名 u 。(类似sql语句中的 user as u)。 但是注意一点,这个User类是逆向生成的tables包下的,不是pojos包下的User实体类。 (逆向工程它会生成两个User类。一个在pojos下,一个再tables下)。

还有,我在这里只测试了一个方法selectById(),别的我没有测试,大概应该差不多。 好了,让大家看看方法selectById()的运行结果。

控制台打印分别对应上面代码中的这两个语句

System.out.println(result.get(0).toString());  //获取result对象中的第一个对象并打印toString
String className = result.get(0).getClass().getName();  //获取Result第一个对象的类类型
System.out.println(className);
复制代码

我目前还没有把org.jooq.impl.RecordImpl这个对象转换成我们想要的pojos包下的User实体类。 但是查询的功能是实现了,希望有能力大佬再研究和试试。

我也试过用它逆向生成的UserDao(我再上面代码中注释掉的)。结果报错: org.jooq.exception.DetachedException: Cannot execute query. No Connection configured 意思是没有获取到连接配置信息。这块也没能搞懂。希望大佬也能在下面评论。

######controller UserController .java

package com.fantj.controller;/*** Created by Fant.J.*/
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping(method = RequestMethod.GET,value = "/delete/{id}")public void delete(@PathVariable("id")int id){userService.delete(id);}@RequestMapping(method = RequestMethod.POST,value = "/insert")public void insert(User user){userService.insert(user);}@RequestMapping(method = RequestMethod.POST,value = "/update/{id}")public void update(@RequestParam User user){userService.update(user);}@RequestMapping(method = RequestMethod.GET,value = "/{id}/select")public User select(@PathVariable("id")int id){return userService.selectById(id);}@RequestMapping(method = RequestMethod.GET,value = "/selectAll/{pageNum}/{pageSize}")public List<User> selectAll(@PathVariable("pageNum") int pageNum, @PathVariable("pageSize") int pageSize){Iterator<User> userIterator = userService.selectAll(pageNum, pageSize);List<User> list = new ArrayList<>();while(userIterator.hasNext()){list.add(userIterator.next());}return list;}}复制代码

好了,这是我8个小时琢磨的结果,因为ssm整合jooq资料真的很少。springboot更是少。但是可以说完成了一大半。再总结一下遗留的两个问题:

  1. UserDao.java 是干什么的
  2. Result 对象怎么 转换成 javabean 实体类

#####问题2已得道解决 谢谢QQ号为523309375的朋友的提示。

自己也是耐心耗到极限,没有仔细再研究Result这个接口,它里面有info方法。可以转换成很多格式,我在这里选择<E> List<E> into(Class<? extends E> var1) throws MappingException;方法来返回一个List<com.fantj.pojos.User>

修改之后的两个ServiceImpl里的方法。

    /*** 查询单个** @param id*/@Overridepublic com.fantj.pojos.User selectById(int id) {List<com.fantj.pojos.User> result =  dsl.select(u.ADDRESS,u.BIRTHDAY,u.ID,u.SEX,u.USERNAME).from(u).where(u.ID.eq(id)).fetch().into(com.fantj.pojos.User.class);return result.get(0);/*com.fantj.pojos.User user1 = userDao.findById(id);return user1;*/}/*** 查询全部列表* @param pageNum* @param pageSize*/@Overridepublic List<com.fantj.pojos.User> selectAll(int pageNum, int pageSize) {List<com.fantj.pojos.User> list = dsl.select().from(u).orderBy(u.ID.desc())   //id倒序.limit(0)   //分页.offset(10)   //分页.fetch().into(com.fantj.pojos.User.class);  //数据类型格式转化return list;}
复制代码

再说说我现在对jooq的理解。我个人觉得,如果再对jooq进行一些与ssm整合上的优化。我们可以在serviceImpl里写sql伪代码,达到快速开发。仔细想想,JPA和Mybatis对复杂sql的支持还是挺不方便的。如果能再serviceImpl层里直接写sql语句岂不更好。个人认为jooq很接近。 哈哈,不得不说这种代码格式看上去很舒服。但是有点打破经典三层架构的意思,当然自然的也失去了代码耦合性(对于大型项目而言),希望大家能提出自己好的想法。

谢谢大家赏脸!

源码地址:https://github.com/jiaofanting/springboot-integration/tree/master/springboot-jooq

spring boot2 整合(三)JOOQ工具相关推荐

  1. Spring Boot2整合Shiro(1):身份认证

    Spring Boot2整合Shiro(1):身份认证 前言 本文主要介绍了在Spring Boot2项目中整合Shiro实现登录认证.本文假设读者已经对Shiro和基于RBAC的权限控制系统有了基本 ...

  2. Spring Boot2 整合 Ehcache

    用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...

  3. Spring Boot2 整合 Shiro ,两种方式全总结!

    前言:在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 文章目录 一.Spring Securit ...

  4. spring boot2 整合(一)Mybatis (特别完整!)

    大概介绍下流程: 借助idea实现mybatis逆向工程 用xml配置实现整合 用cmd命令行实现mybatis逆向工程 用mapping.xml配置实现数据交互 用注解的方式实现数据交互 首先我的开 ...

  5. spring boot2 整合(二)JPA(特别完整!)

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA 的目标之一是制定一个可以由很多供应商 ...

  6. Spring Boot2 整合 MyBatis 多数据源

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. spring boot2.0整合富文本编辑器summernote

    summernote对上传图片,以及对图片大小细节,删除图片移除服务器资源等处理的比较完美. 整合过程,summernote的官网https://summernote.org/getting-star ...

  8. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  9. Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue

    Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...

最新文章

  1. codeforces 700B Connecting Universities
  2. 最新研究 | 人类大脑皮质对有声调和非有声调语言的音高编码
  3. linux shell 数组倒序
  4. Android平滑图片加载和缓存库Glide使用详解
  5. CentOS7.2.1511 安装Mysql-5.7.13
  6. hive增量表和全量表_hive 拉链表 实现全量数据 增量更新
  7. java验证码限流_Java实现系统限流
  8. 你值得掌握的 Git分支等 常用命令 (持续更新中)
  9. idea 提示 Cannot resolve symbol ‘log‘解决
  10. 进程,线程和协程 并行与并发
  11. React Fiber 了解一下
  12. 解决 react-router 中 history is 'undefined' 的问题
  13. java虚拟机安装_java虚拟机官方下载|Java Virtual Machine(java虚拟机)下载v5.0官方版 附安装教程 - 欧普软件下载...
  14. 无线接入中的移动技术
  15. c语言倒序输出单词_英语句子按单词倒序输出C语言版
  16. minimumsnap(1)微分平坦特性(Differential Flatness)
  17. 用html制作ps,ps制作图片的步骤
  18. c语言求阶乘的两种算法(递归和循环)
  19. 托宾Q数据-沪深A股上市公司(含行业名称、代码等指标)2003-2020
  20. 创造单词量测试项目(带有Ajax的爬虫)

热门文章

  1. Tablayout+ViewPager+Fragment 实现页面切换
  2. Proxmark3 easy gui 5.13 版本 编译日期2019-4-17 冰人4月份最新固件
  3. Linux文本文件与Windows下的格式转换
  4. 干货!谷歌首席科学家发文阐述“半监督学习革命”,想走出瓶颈先试试这个...
  5. 来自1976,Hinton写的第一篇论文火了:胶囊网络,是40年前的胶囊?
  6. 牙龈细菌会进入大脑,引发阿尔茨海默病 | 《科学》子刊最新研究
  7. 最高76%破解成功率!GAN已经能造出“万能指纹”,你的手机还安全吗?
  8. 开源软件史上最大收购案!IBM340亿美元收购Linux分销商Red Hat
  9. 理解 Redux 的最好方式,是自己写一个
  10. 区块链开发公司浅析区块链服务商提供哪些解决方案