最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單了解java ORM框架JOOQ

 更新時(shí)間:2019年12月05日 09:04:10   作者:wx5d9ed7c8443c3  
這篇文章主要介紹了簡(jiǎn)單了解java ORM框架JOOQ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了簡(jiǎn)單了解java ORM框架JOOQ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

今天給大家介紹一個(gè)新的ORM框架->JOOQ,可能很多朋友還沒(méi)有聽(tīng)說(shuō)過(guò)這個(gè)框架,碼農(nóng)哥之前也是一直在使用Mybatis框架作為Java工程中的持久層訪問(wèn)框架,但是最近的一些項(xiàng)目采用JOOQ框架開(kāi)發(fā)后,碼農(nóng)哥表示再也不想用Mybatis了!

為什么這么說(shuō)呢?因?yàn)镴OOQ在代碼層面要比Mybatis簡(jiǎn)潔得多,而且性能也非常優(yōu)異。相信大家都有過(guò)這樣的體會(huì),我們?cè)陧?xiàng)目工程中使用Mybatis進(jìn)行數(shù)據(jù)庫(kù)相關(guān)代碼的編寫(xiě)時(shí),為了提高工程效率,一般會(huì)在數(shù)據(jù)庫(kù)模型設(shè)計(jì)完成后,一次性使用Mybatis代碼插件(如:mybatis-generator),來(lái)生成Mybatis數(shù)據(jù)庫(kù)訪問(wèn)的實(shí)體類代碼以及XML、Mapper等映射代碼,從而盡量以面向?qū)ο蟮姆绞絹?lái)操作和訪問(wèn)數(shù)據(jù)庫(kù)。而通過(guò)這樣的方式,雖然在工程效率上提高了很多,但是從代碼的簡(jiǎn)潔和優(yōu)雅性上來(lái)說(shuō)就會(huì)讓人感覺(jué)特別的啰嗦,因?yàn)樽詣?dòng)生成的代碼并不完全都是你在項(xiàng)目中能夠用得到的。

所以,有些對(duì)代碼有追求的同學(xué)就會(huì)以比較簡(jiǎn)潔的方式來(lái)手寫(xiě)SQL代碼。如在@Mapper接口中編寫(xiě)這樣的代碼:

@Select("select max(t.balance_id) from balance t where t.country=#{country}\n")
String selectMaxId(Map<String, String> paramMap);

而雖然這種方式可以減少很多無(wú)用的代碼量,但是在業(yè)務(wù)邏輯比較復(fù)雜的場(chǎng)景下這種方式顯然又會(huì)大大降低開(kāi)發(fā)的效率,因?yàn)橥ㄟ^(guò)這樣的方式不僅SQL編寫(xiě)的通用層度需要我們花費(fèi)額外的時(shí)間去考慮,而且由于Java面向?qū)ο蟮木幊谭绞?,我們還需要花費(fèi)很多的時(shí)間來(lái)將數(shù)據(jù)庫(kù)查詢結(jié)果映射成為實(shí)體對(duì)象,所以使用Mybatis進(jìn)行持久層開(kāi)發(fā)時(shí)有時(shí)候真的是讓人又愛(ài)又恨!

那么有沒(méi)有一種新的ORM框架既能夠保持Mybatis的靈活性又不像Hibernate那樣重呢?畢竟大家也都是從Hibernate的魔爪中逃離出來(lái)后才選擇使用Mybatis直到今天的!在軟件工程領(lǐng)域就是這樣,有痛點(diǎn)的地方就一定會(huì)有人提供解決方案,JOOQ就是這樣一個(gè)產(chǎn)物!

JOOQ簡(jiǎn)介

JOOQ是基于Java訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的工具包,它具有輕量、簡(jiǎn)單、并且足夠靈活的特點(diǎn),通過(guò)JOOQ我們可以輕松的使用Java面向?qū)ο蟮恼Z(yǔ)法來(lái)實(shí)現(xiàn)各種復(fù)雜的SQL。相比于傳統(tǒng)ORM框架,如Hibernate、Mybatis來(lái)說(shuō),JOOQ汲取了即汲取了它們操作數(shù)據(jù)的簡(jiǎn)單性和安全性、同時(shí)也保留了原生SQL的靈活性,從某種程度上說(shuō)JOOQ更像是介于ORM和JDBC的中間層。

JOOQ目前在國(guó)內(nèi)相對(duì)來(lái)說(shuō)還比較小眾,對(duì)于大部分從SSH或者SSM成長(zhǎng)起來(lái)的碼農(nóng)朋友們來(lái)說(shuō),心里估計(jì)會(huì)質(zhì)疑“這玩意用的這么少,到底靠不靠譜?”。在這里碼農(nóng)哥可以很負(fù)責(zé)任的說(shuō)JOOQ是靠譜的!因?yàn)榇a農(nóng)哥已經(jīng)在好幾個(gè)生產(chǎn)項(xiàng)目上實(shí)踐過(guò)了,而且是在比較核心的支付系統(tǒng)上完全使用了JOOQ來(lái)替代Mybatis作為持久層框架,并且這個(gè)支付系統(tǒng)的并發(fā)量也是非常高的,所以JOOQ框架本身是能夠經(jīng)受住真實(shí)業(yè)務(wù)場(chǎng)景的考驗(yàn)的!

SpringBoot項(xiàng)目集成JOOQ

接下來(lái)我們就來(lái)一起看看,如何在SpringBoot的項(xiàng)目中集成和使用JOOQ吧!首先,我們?cè)陧?xiàng)目中引入JOOQ的stater依賴包,如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jooq</artifactId>
</dependency>

因?yàn)镴OOQ對(duì)Spring Boot有很好的支持,所以我們只需要引入相應(yīng)的starter依賴即可,而具體的版本則是與Spring Boot的版本關(guān)聯(lián)的,這里并不需要我們?nèi)ブ付ā?/p>

其次,我們需要在項(xiàng)目中配置JOOQ的代碼生成插件,這樣JOOQ就可以自動(dòng)在項(xiàng)目編譯的時(shí)候?yàn)槲覀兩伤枰臄?shù)據(jù)庫(kù)以來(lái)對(duì)象了,在項(xiàng)目的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>

配置完成這個(gè)Maven插件后,基本上JOOQ就算差不多與SpringBoot集成完成了,如果此時(shí)編譯項(xiàng)目JOOQ代碼插件就會(huì)在target/generated-sources/jooq目錄下根據(jù)數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)生成相應(yīng)的數(shù)據(jù)庫(kù)操作對(duì)象,而這個(gè)過(guò)程則完成對(duì)開(kāi)發(fā)人員透明,我們并不需要做額外的事情。

而在具體的業(yè)務(wù)邏輯中,需要操作數(shù)據(jù)庫(kù)時(shí)我們就可以很方便的使用這些自動(dòng)生成的代碼來(lái)進(jìn)行操作,例如,我們需要在業(yè)務(wù)代碼中執(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è)務(wù)類中注入DSLContext對(duì)象,并在組裝完自動(dòng)生成的數(shù)據(jù)庫(kù)類的對(duì)象后執(zhí)行executeInsert方法就可以完成insert操作了。而如果我們要完成查詢操作,也可以很簡(jiǎn)單的實(shí)現(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;
  }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java常用數(shù)字工具類 數(shù)字轉(zhuǎn)漢字(1)

    Java常用數(shù)字工具類 數(shù)字轉(zhuǎn)漢字(1)

    這篇文章主要為大家詳細(xì)介紹了Java常用數(shù)字工具類,數(shù)字轉(zhuǎn)漢字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • SpringBoot項(xiàng)目部署在weblogic中間件的注意事項(xiàng)說(shuō)明

    SpringBoot項(xiàng)目部署在weblogic中間件的注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了SpringBoot項(xiàng)目部署在weblogic中間件的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java數(shù)字轉(zhuǎn)中文大寫(xiě)工具類詳細(xì)代碼(拿去即用)

    Java數(shù)字轉(zhuǎn)中文大寫(xiě)工具類詳細(xì)代碼(拿去即用)

    最近項(xiàng)目中用到金額轉(zhuǎn)大寫(xiě)的地方,索性給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Java數(shù)字轉(zhuǎn)中文大寫(xiě)工具類的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-05-05
  • Mybatis-Plus開(kāi)發(fā)提速器mybatis-plus-generator-ui詳解

    Mybatis-Plus開(kāi)發(fā)提速器mybatis-plus-generator-ui詳解

    這篇文章主要介紹了Mybatis-Plus開(kāi)發(fā)提速器mybatis-plus-generator-ui,本文簡(jiǎn)要介紹一款基于Mybatis-Plus的代碼自助生成器,文章通過(guò)實(shí)例集成的方式來(lái)詳細(xì)講解mybatis-plus-generator-ui,從相關(guān)概念到實(shí)際集成案例,以及具體的擴(kuò)展開(kāi)發(fā)介紹,需要的朋友可以參考下
    2022-11-11
  • java實(shí)現(xiàn)拼圖游戲

    java實(shí)現(xiàn)拼圖游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 史上最佳springboot Locale 國(guó)際化方案

    史上最佳springboot Locale 國(guó)際化方案

    今天給大家分享史上最佳springboot Locale 國(guó)際化方案,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08
  • JavaGUI事件監(jiān)聽(tīng)機(jī)制超詳細(xì)講解

    JavaGUI事件監(jiān)聽(tīng)機(jī)制超詳細(xì)講解

    Java事件監(jiān)聽(tīng)器是由事件類和監(jiān)聽(tīng)接口組成,自定義一個(gè)事件前,必須提供一個(gè)事件的監(jiān)聽(tīng)接口以及一個(gè)事件類。JAVA中監(jiān)聽(tīng)接口是繼承java.util.EventListener的類,事件類繼承java.util.EventObject的類
    2023-03-03
  • Java中的五種引用類型詳解

    Java中的五種引用類型詳解

    Java中的五種引用類型:強(qiáng)引用、軟引用、弱引用、虛引用和Final引用,分別用于管理對(duì)象的生命周期,幫助垃圾回收器更高效地回收不再使用的對(duì)象
    2024-12-12
  • java interface的兩個(gè)經(jīng)典用法

    java interface的兩個(gè)經(jīng)典用法

    這篇文章主要為大家詳細(xì)介紹了java interface的兩個(gè)經(jīng)典用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • springboot啟動(dòng)腳本start.sh和停止腳本 stop.sh的詳細(xì)教程

    springboot啟動(dòng)腳本start.sh和停止腳本 stop.sh的詳細(xì)教程

    這篇文章主要介紹了springboot啟動(dòng)腳本start.sh和停止腳本 stop.sh的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

柳林县| 犍为县| 凤阳县| 上饶县| 噶尔县| 商河县| 玛沁县| 灵寿县| 南投县| 白朗县| 焦作市| 浑源县| 三江| 白沙| 东阿县| 盖州市| 永宁县| 通渭县| 陆川县| 同心县| 昂仁县| 行唐县| 拉孜县| 龙岩市| 鲜城| 安新县| 金塔县| 漳平市| 乾安县| 科尔| 宜宾县| 南宫市| 石景山区| 酉阳| 连城县| 九台市| 全南县| 鄂托克旗| 汤阴县| 连平县| 周至县|