springboot整合前端,spring boot2 整合(三)JOOQ工具

 2023-10-30 阅读 31 评论 0

摘要:###先來介紹下jooq jOOQ是一個基于Java編寫SQL的工具包,具有:簡單、輕量、函數式編程寫SQL等獨特優勢,非常適合敏捷快速迭代開發。 SQL語句: SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*)FROM AUTHORJOIN BOOK ON AUTHOR.ID = BOOK

###先來介紹下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)
復制代碼

springboot整合前端。###那從這里開始正式開始整合

#####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執行逆向工程

Springboot,

先進行clean 再compile,然后我們就會發現,生成了很多個類

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

三層架構

service接口

springboot2?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");
復制代碼

springboot版本、這段代碼的意思是給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實體類。 但是查詢的功能是實現了,希望有能力大佬再研究和試試。

springboot項目搭建?我也試過用它逆向生成的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的朋友的提示。

spring boot jpa。自己也是耐心耗到極限,沒有仔細再研究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;}
復制代碼

springboot整合jsp、再說說我現在對jooq的理解。我個人覺得,如果再對jooq進行一些與ssm整合上的優化。我們可以在serviceImpl里寫sql偽代碼,達到快速開發。仔細想想,JPA和Mybatis對復雜sql的支持還是挺不方便的。如果能再serviceImpl層里直接寫sql語句豈不更好。個人認為jooq很接近。 哈哈,不得不說這種代碼格式看上去很舒服。但是有點打破經典三層架構的意思,當然自然的也失去了代碼耦合性(對于大型項目而言),希望大家能提出自己好的想法。

謝謝大家賞臉!

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/165156.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息