簡單了解java ORM框架JOOQ
這篇文章主要介紹了簡單了解java ORM框架JOOQ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
前言
今天給大家介紹一個新的ORM框架->JOOQ,可能很多朋友還沒有聽說過這個框架,碼農哥之前也是一直在使用Mybatis框架作為Java工程中的持久層訪問框架,但是最近的一些項目采用JOOQ框架開發(fā)后,碼農哥表示再也不想用Mybatis了!
為什么這么說呢?因為JOOQ在代碼層面要比Mybatis簡潔得多,而且性能也非常優(yōu)異。相信大家都有過這樣的體會,我們在項目工程中使用Mybatis進行數(shù)據庫相關代碼的編寫時,為了提高工程效率,一般會在數(shù)據庫模型設計完成后,一次性使用Mybatis代碼插件(如:mybatis-generator),來生成Mybatis數(shù)據庫訪問的實體類代碼以及XML、Mapper等映射代碼,從而盡量以面向對象的方式來操作和訪問數(shù)據庫。而通過這樣的方式,雖然在工程效率上提高了很多,但是從代碼的簡潔和優(yōu)雅性上來說就會讓人感覺特別的啰嗦,因為自動生成的代碼并不完全都是你在項目中能夠用得到的。
所以,有些對代碼有追求的同學就會以比較簡潔的方式來手寫SQL代碼。如在@Mapper接口中編寫這樣的代碼:
@Select("select max(t.balance_id) from balance t where t.country=#{country}\n") String selectMaxId(Map<String, String> paramMap);
而雖然這種方式可以減少很多無用的代碼量,但是在業(yè)務邏輯比較復雜的場景下這種方式顯然又會大大降低開發(fā)的效率,因為通過這樣的方式不僅SQL編寫的通用層度需要我們花費額外的時間去考慮,而且由于Java面向對象的編程方式,我們還需要花費很多的時間來將數(shù)據庫查詢結果映射成為實體對象,所以使用Mybatis進行持久層開發(fā)時有時候真的是讓人又愛又恨!
那么有沒有一種新的ORM框架既能夠保持Mybatis的靈活性又不像Hibernate那樣重呢?畢竟大家也都是從Hibernate的魔爪中逃離出來后才選擇使用Mybatis直到今天的!在軟件工程領域就是這樣,有痛點的地方就一定會有人提供解決方案,JOOQ就是這樣一個產物!
JOOQ簡介
JOOQ是基于Java訪問關系型數(shù)據庫的工具包,它具有輕量、簡單、并且足夠靈活的特點,通過JOOQ我們可以輕松的使用Java面向對象的語法來實現(xiàn)各種復雜的SQL。相比于傳統(tǒng)ORM框架,如Hibernate、Mybatis來說,JOOQ汲取了即汲取了它們操作數(shù)據的簡單性和安全性、同時也保留了原生SQL的靈活性,從某種程度上說JOOQ更像是介于ORM和JDBC的中間層。
JOOQ目前在國內相對來說還比較小眾,對于大部分從SSH或者SSM成長起來的碼農朋友們來說,心里估計會質疑“這玩意用的這么少,到底靠不靠譜?”。在這里碼農哥可以很負責任的說JOOQ是靠譜的!因為碼農哥已經在好幾個生產項目上實踐過了,而且是在比較核心的支付系統(tǒng)上完全使用了JOOQ來替代Mybatis作為持久層框架,并且這個支付系統(tǒng)的并發(fā)量也是非常高的,所以JOOQ框架本身是能夠經受住真實業(yè)務場景的考驗的!
SpringBoot項目集成JOOQ
接下來我們就來一起看看,如何在SpringBoot的項目中集成和使用JOOQ吧!首先,我們在項目中引入JOOQ的stater依賴包,如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jooq</artifactId> </dependency>
因為JOOQ對Spring Boot有很好的支持,所以我們只需要引入相應的starter依賴即可,而具體的版本則是與Spring Boot的版本關聯(lián)的,這里并不需要我們去指定。
其次,我們需要在項目中配置JOOQ的代碼生成插件,這樣JOOQ就可以自動在項目編譯的時候為我們生成所需要的數(shù)據庫以來對象了,在項目的pom.xml中配置Maven插件,如下:
<plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <executions> <execution> <id>default</id> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> <configuration> <jdbc> <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://127.0.0.1:3306</url> <user>root</user> <password><![CDATA[123456]]></password> </jdbc> <generator> <name>org.jooq.util.DefaultGenerator</name> <generate> <instanceFields>true</instanceFields> <pojos>true</pojos> <daos>true</daos> </generate> <database> <inputSchema>jets</inputSchema> <name>org.jooq.util.mysql.MySQLDatabase</name> <includes>.*</includes> <excludes>schema_version</excludes> </database> <target> <packageName>${app.package}</packageName> <directory>target/generated-sources/jooq</directory> </target> </generator> </configuration> </execution> </executions> </plugin>
配置完成這個Maven插件后,基本上JOOQ就算差不多與SpringBoot集成完成了,如果此時編譯項目JOOQ代碼插件就會在target/generated-sources/jooq目錄下根據數(shù)據庫中的表結構生成相應的數(shù)據庫操作對象,而這個過程則完成對開發(fā)人員透明,我們并不需要做額外的事情。
而在具體的業(yè)務邏輯中,需要操作數(shù)據庫時我們就可以很方便的使用這些自動生成的代碼來進行操作,例如,我們需要在業(yè)務代碼中執(zhí)行insert操作,代碼如下:
@Slf4j @Service public class OpenServiceImpl implements OpenService { @Autowired protected DSLContext dslContext; @Override public BalanceChargeTradeResVo balanceChargeTrade(BalanceChargeTradeReqVo balanceChargeTradeReqVo) throws VerifyDataException, BalanceCreateOrderException { BalanceChargeTradeResVo balanceChargeTradeResVo; try { WalletUserBalanceOrderRecord walletUserBalanceOrderRecord = createBalanceChargeOrder( balanceChargeTradeReqVo); dslContext.executeInsert(walletUserBalanceOrderRecord); balanceChargeTradeResVo = BalanceChargeTradeResVo.builder().userId(balanceChargeTradeReqVo.getUserId()) .amount(balanceChargeTradeReqVo.getAmount()).currency(balanceChargeTradeReqVo.getCurrency()) .orderId(walletUserBalanceOrderRecord.getOrderId()).businessType(BusinessType.TOP_UP.getCode()) .build(); return balanceChargeTradeResVo; } catch (Exception e) { throw new BalanceCreateOrderException(ErrorCode.BALANCE_CHARGE_ORDER_ERROR.getCode(), ErrorCode.BALANCE_CHARGE_ORDER_ERROR.getDesc()); } }
在以上代碼中,我們只需要在service業(yè)務類中注入DSLContext對象,并在組裝完自動生成的數(shù)據庫類的對象后執(zhí)行executeInsert方法就可以完成insert操作了。而如果我們要完成查詢操作,也可以很簡單的實現(xiàn),代碼如下:
@Slf4j @Service public class OpenServiceImpl implements OpenService { @Autowired protected DSLContext dslContext; @Override public BalanceQueryResVo balanceQuery(long userId) throws AccountNoExistException { List<WalletUserBalanceRecord> walletUserBalanceRecordList = dslContext .selectFrom(WalletUserBalance.WALLET_USER_BALANCE) .where(WalletUserBalance.WALLET_USER_BALANCE.USER_ID .eq(String.valueOf(userId))).fetchInto(WalletUserBalanceRecord.class); if (walletUserBalanceRecordList == null || walletUserBalanceRecordList.size() <= 0) { throw new AccountNoExistException(ErrorCode.ACCOUNT_NO_EXIST_ERROR.getCode(), ErrorCode.ACCOUNT_NO_EXIST_ERROR.getDesc()); } Optional<WalletUserBalanceRecord> walletUserBalanceRecord = walletUserBalanceRecordList.stream() .filter(o -> o.getAccType().equals(String.valueOf(AccType.CASH_ACCOUNT.getCode()))).findFirst(); BalanceQueryResVo balanceQueryResVo = BalanceQueryResVo.builder().userId(userId) .balance(walletUserBalanceRecordList.stream().mapToInt(o -> o.getBalance().intValue()).sum()) .currency(walletUserBalanceRecord.get().getCurrency()).build(); return balanceQueryResVo; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot實現(xiàn)事件監(jiān)聽(異步執(zhí)行)的示例代碼
事件監(jiān)聽是一種機制,可以定義和觸發(fā)自定義的事件,以及在應用程序中注冊監(jiān)聽器來響應這些事件,本文主要介紹了SpringBoot實現(xiàn)事件監(jiān)聽(異步執(zhí)行)的示例代碼,感興趣的可以了解一下2024-08-08java將String字符串轉換為List<Long>類型實例方法
在本篇文章里小編給大家整理的是關于java將String字符串轉換為List<Long>類型實例方法,需要的朋友們可以參考下。2020-03-03基于Spring Security前后端分離的權限控制系統(tǒng)問題
本文給大家分享基于Spring Security前后端分離的權限控制系統(tǒng)問題,需要了解權限如何加載,權限匹配規(guī)則和登錄的實現(xiàn)代碼,對Spring Security權限控制系統(tǒng)相關知識感興趣的朋友一起看看吧2021-06-06Spring Boot 和 Spring 到底有啥區(qū)別你知道嗎
Spring Boot框架的核心就是自動配置,只要存在相應的jar包,Spring就幫我們自動配置。接下來通過本文給大家介紹Spring與Spring boot的區(qū)別介紹,非常不錯,需要的朋友參考下吧2021-08-08