国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ORM “殺器”之 JOOQ

Andrman / 1426人閱讀

摘要:摘要介紹簡(jiǎn)單實(shí)用,以及相對(duì)于傳統(tǒng)框架的不同點(diǎn)。最令人滿意的就是在實(shí)際使用過(guò)程中解決問(wèn)題的靈活性。當(dāng)前在數(shù)據(jù)服務(wù)組擔(dān)任開(kāi)發(fā)工程師,主要負(fù)責(zé)服務(wù)器開(kāi)發(fā)。

摘要

介紹JOOQ簡(jiǎn)單實(shí)用,以及相對(duì)于傳統(tǒng)ORM框架的不同點(diǎn)。

(圖片來(lái)自http://www.jooq.org/)

正文 JOOQ是啥?

JOOQ 是基于Java訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的工具包,輕量,簡(jiǎn)單,并且足夠靈活,可以輕松的使用Java面向?qū)ο笳Z(yǔ)法來(lái)實(shí)現(xiàn)各種復(fù)雜的sql。對(duì)于寫(xiě)Java的碼農(nóng)來(lái)說(shuō)ORMS再也熟悉不過(guò)了,不管是Hibernate或者M(jìn)ybatis,都能簡(jiǎn)單的使用實(shí)體映射來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。但有時(shí)候這些 ‘智能’的對(duì)象關(guān)系映射又顯得笨拙,沒(méi)有直接使用原生sql來(lái)的靈活和簡(jiǎn)單,而且對(duì)于一些如:joins,union, nested selects等復(fù)雜的操作支持的不友好。JOOQ 既吸取了傳統(tǒng)ORM操作數(shù)據(jù)的簡(jiǎn)單性和安全性,又保留了原生sql的靈活性,它更像是介于 ORMS和JDBC的中間層。對(duì)于喜歡寫(xiě)sql的碼農(nóng)來(lái)說(shuō),JOOQ可以完全滿足你控制欲,可以是用Java代碼寫(xiě)出sql的感覺(jué)來(lái)。就像官網(wǎng)說(shuō)的那樣 :

get back in control of your sql

這貨有啥優(yōu)點(diǎn)

JOOQ 目前在國(guó)內(nèi)還是很小眾,第一次聽(tīng)說(shuō)這玩意還是通過(guò)stream 大神的推薦。對(duì)于從SSH成長(zhǎng)起來(lái)的猿類來(lái)說(shuō),心里也會(huì)質(zhì)疑 “這玩意用的人那么少,靠不靠譜” ,“會(huì)不會(huì)有很多坑要踩”。通過(guò)對(duì)著官方文檔寫(xiě)了幾個(gè)demo,頓時(shí)心生敬畏,一個(gè)念頭沖到腦袋 " 這東西一定會(huì)火",于是果斷在項(xiàng)目中使用。在使用過(guò)程中也會(huì)遇到各種小問(wèn)題,通過(guò)幫助手冊(cè)和DEMO都能最終解決。相對(duì)于Hibernate或者其他ORMS的,JOOQ的編程模式有很大不同,強(qiáng)大的Fluent API使用起來(lái)非常方便和流暢。現(xiàn)在我們的項(xiàng)目(MaxWon)使用JOOQ已經(jīng)在生產(chǎn)環(huán)境運(yùn)行了很長(zhǎng)的一段時(shí)間,從來(lái)沒(méi)花太多時(shí)間折騰在數(shù)據(jù)訪問(wèn)層上面。對(duì)于開(kāi)發(fā)來(lái)說(shuō)感受最深的就是這貨真的很簡(jiǎn)單很靈活,正如文章標(biāo)題那樣,這是一個(gè)‘殺器’。下面是我總結(jié)的幾點(diǎn),個(gè)人愚見(jiàn)。

DSL(Domain Specific Language )風(fēng)格,代碼夠簡(jiǎn)單和清晰。遇到不會(huì)寫(xiě)的sql可以充分利用IDEA代碼提示功能輕松完成。

保留了傳統(tǒng)ORM 的優(yōu)點(diǎn),簡(jiǎn)單操作性,安全性,類型安全等。不需要復(fù)雜的配置,并且可以利用Java 8 Stream API 做更加復(fù)雜的數(shù)據(jù)轉(zhuǎn)換。

支持主流的RDMS和更多的特性,如self-joins,union,存儲(chǔ)過(guò)程,復(fù)雜的子查詢等等。

豐富的Fluent API和完善文檔。

runtime schema mapping 可以支持多個(gè)數(shù)據(jù)庫(kù)schema訪問(wèn)。簡(jiǎn)單來(lái)說(shuō)使用一個(gè)連接池可以訪問(wèn)N個(gè)DB schema,使用比較多的就是SaaS應(yīng)用的多租戶場(chǎng)景。

如何使用

具體怎么使用官網(wǎng)文檔說(shuō)的其實(shí)已經(jīng)很詳細(xì)了,愛(ài)學(xué)習(xí)的同學(xué)可以參閱一下。下面我根據(jù)實(shí)際項(xiàng)目中使用的過(guò)程講述JOOQ的入門(mén)使用方法。

環(huán)境
描述 名稱
平臺(tái) JDK 1.8
maven 3.3.9
JOOQ 3.7.3
RDS Mysql 5.7
mysql-connector 5.1.39

maven依賴配置如下:

        
            mysql
            mysql-connector-java
            ${mysql.version}
        
        
            org.jooq
            jooq
            ${jooq.version}
        
        
            org.jooq
            jooq-meta
            ${jooq.version}
        
        
            org.jooq
            jooq-codegen
            ${jooq.version}
        
代碼生成

目前官方提供了通過(guò) java org.jooq.util.GenerationTool 來(lái)生成映射代碼,但過(guò)程還是有點(diǎn)繁瑣,這里就不演示了。還好萬(wàn)能的maven插件幫助我們解決了這個(gè)問(wèn)題。


   
      jooq
      
      
         
            jooq
         
      
      
         
            
               org.jooq
               jooq-codegen-maven
               ${jooq.version}
               
                  
                     
                        generate
                     
                  
               
               
                  
                     mysql
                     mysql-connector-java
                     ${mysql.version}
                  
               
               
                  
                     ${jdbc.driver}
                     ${jdbc.url}
                     ${jdbc.user}
                     ${jdbc.password}
                  
                  
                     
                        org.jooq.util.mysql.MySQLDatabase
                        .*
                        
                        ${jdbc.database.name}
                        
                           
                              BOOLEAN
                              (?i:TINYINT(s*(d+))?(s*UNSIGNED)?)
                           
                        
                     
                     
                        false
                     
                     
                        com.maxleap.jooq.data.jooq
                        src/main/java
                     
                     
                        false
                        false
                     
                  
               
            
         
      
   

配置目標(biāo)數(shù)據(jù)庫(kù)schema信息后運(yùn)行

$ mvn clean install -Djooq

如果一切順利的話,在項(xiàng)目目錄下會(huì)看到JOOQ自動(dòng)生成的代碼

使用數(shù)據(jù)庫(kù)的schema信息,JOOQ會(huì)自動(dòng)生成對(duì)應(yīng)的Java Record,這樣就可以使用Record來(lái)操作對(duì)應(yīng)的數(shù)據(jù)庫(kù)和表,不需任何其他的關(guān)系映射配置。

下面展示使用JOOQ 增刪改查的例子

public class JOOQTest {
  private DSLContext dslContext;
  
  @Before
  public void before() {
    this.dslContext = getDSLContext();
  }

  @Test
  public void insert() {
    MyStore store = new MyStore();
    store.setName("foo");
    store.setAddress("mars No. 1989");
    StoreRecord storeRecord = dslContext.newRecord(Tables.STORE, store);
    storeRecord.insert();

    dslContext.insertInto(Tables.STORE)
      .set(Store.STORE.NAME, "bar")
      .set(Store.STORE.ADDRESS, "eclipse No.1891")
      .execute();
  }

  @Test
  public void find() {
    dslContext.selectFrom(Tables.STORE)
      .where(Store.STORE.NAME.eq("foo"))
      .fetchInto(MyStore.class)
      .stream()
      .forEach(myStore -> System.out.println(myStore.getName()));
  }

  @Test
  public void update() {

    dslContext.update(Tables.STORE)
      .set(Store.STORE.ADDRESS, "sun No.1988")
      .where(Store.STORE.ID.eq(UInteger.valueOf(1)))
      .execute();
  }

  @After
  public void after() {
    dslContext.delete(Tables.STORE);
  }

  private DSLContext getDSLContext() {
    try {
      Connection connection = 
        DriverManager.getConnection("jdbc:mysql://2.mysql.myself:3306/app_maker", "mars","mars");
      return DSL.using(connection, SQLDialect.MYSQL)
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  public static class MyStore {
    private String name;
    private String address;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public String getAddress() {
      return address;
    }

    public void setAddress(String address) {
      this.address = address;
    }
  }
}

首先根據(jù)mysql connection 信息構(gòu)造DSLContext,然后使用它來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作。對(duì)于具體方法我就不解釋了,懂一點(diǎn)sql我相信都應(yīng)該能看懂。

上面例子可以窺探出JOOQ DSL 語(yǔ)法風(fēng)格以及JOOQ的基本使用方法,通過(guò)代碼可以so easy 的在腦子里映射出對(duì)應(yīng)的sql語(yǔ)句,感覺(jué)就像直接寫(xiě)sql一樣。但JOOQ和sql不同之處在于它保證了你寫(xiě)的sql語(yǔ)法正確性和類型安全,如果配上IDEA代碼提示功能,那就更加完美了,再難寫(xiě)的sql只要 . 一下就會(huì)有完整的代碼提示。

查看DSL類源碼看以看到里面大概有14000多行代碼,都是靜態(tài)方法,里面包含JOOQ支持的各種DB操作。對(duì)于常用的的場(chǎng)景使用DSLContext一般都能滿足需求,但是對(duì)于是一些復(fù)雜的需求,如創(chuàng)建一個(gè)臨時(shí)表,column別名,table別名,schema 動(dòng)態(tài)設(shè)置,就必須使用DSL來(lái)進(jìn)行操作。

JOOQ最令人滿意的就是在實(shí)際使用過(guò)程中解決問(wèn)題的靈活性。下面將展示獲取商品(prodcut)和商品評(píng)論(comment)總量邏輯。product 和comment 是通過(guò)product_id 關(guān)聯(lián)。

直接上碼

List products = dslContext.select()
      .from(Tables.PRODUCT)
      .leftJoin(DSL.table(
          DSL.select(Comment.COMMENT.PRODUCT_ID, DSL.count().as("comment_num"))
            .from(Tables.COMMENT) 
            .where(Comment.COMMENT.PRODUCT_ID.in(ids))
            .groupBy(Comment.COMMENT.PRODUCT_ID)
        ).as("c1")
      )
      .on(Product.PRODUCT.ID.eq(DSL.field(DSL.name("c1",  
          Comment.COMMENT.PRODUCT_ID.getName()),UInteger.class))) 
      .where(Product.PRODUCT.ID.in(ids))
      .fetch()
      .map(record -> {        
        MyProduct product = record.into(MyProduct.class); 
        return product;
      });

下面是原生sql的版本

select * from `product` as `prod` 
left outer join
  (select  `comment`.`product_id`,count(*) as `comment_num` from `comment` 
   where `commment`.`product_id`=?
   group by `comment`.`product_id`
  ) 
as `c1`
on `prod`.`id`=`c1`.`product_id`
where `prod`.`id`=?;

通過(guò)上面代碼的對(duì)比可以看出JOOQ既享受了Java封裝帶來(lái)的便捷又保留了原生sql的靈活。

集成數(shù)據(jù)源

目前流行的數(shù)據(jù)源DHCP和c3p0大家都很熟悉了,沒(méi)啥講的。我們的項(xiàng)目使用的是阿里的 Druid,它是一個(gè)用于實(shí)時(shí)查詢和分析的高容錯(cuò)、高性能開(kāi)源分布式系統(tǒng),旨在快速處理大規(guī)模的數(shù)據(jù),并能夠?qū)崿F(xiàn)快速查詢和分析。下面就以Druid為例演示把數(shù)據(jù)源綁定到JOOQ中

添加maven依賴

  
      com.alibaba
      druid
      1.0.20
  

還是上面的JOOQTest demo,只需要重寫(xiě)getDSLContext 方法

  private DSLContext getDSLContext() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/app_maker");
    dataSource.setUsername("mars");
    dataSource.setPassword("mars");
    dataSource.setMaxActive(20);
    dataSource.setMaxWait(20_000);
    dataSource.setMinIdle(0);
    dataSource.setTestOnBorrow(true);
    dataSource.setTestWhileIdle(true);
    dataSource.setInitialSize(1);
    dataSource.setMinEvictableIdleTimeMillis(1000*60*10);
    dataSource.setTimeBetweenEvictionRunsMillis(60*1000);
    dataSource.setPoolPreparedStatements(true);
    dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
    dataSource.setValidConnectionChecker(new MySqlValidConnectionChecker());
    ConnectionProvider connectionProvider =  new DataSourceConnectionProvider(dataSource)
    Configuration configuration = new DefaultConfiguration()
      .set(connectionProvider)
      .set(SQLDialect.MYSQL);
    return DSL.using(configuration);
  }

具體Druid配置可以參考官方文檔。

事務(wù)

JOOQ 官方提供了 TransactionProvider 對(duì)事務(wù)的支持,只需要在創(chuàng)建DSLContext的時(shí)候設(shè)置一下。代碼如下:

ConnectionProvider connectionProvider =  new DataSourceConnectionProvider(dataSource)
TransactionProvider transactionProvider = new DefaultTransactionProvider(connectionProvider, false);
Configuration configuration = new DefaultConfiguration()
      .set(connectionProvider)
      .set(transactionProvider)
      .set(SQLDialect.MYSQL);
return DSL.using(configuration);

下面展示事務(wù)的使用

  @Test
  public void transaction() {
    dslContext.transaction(configuration -> {
      DSL.using(configuration).update(Tables.STORE)
        .set(Store.STORE.ADDRESS, "transaction test1")
        .where(Store.STORE.ID.eq(UInteger.valueOf(1)))
        .execute();
      DSL.using(configuration).update(Tables.STORE)
        .set(Store.STORE.ADDRESS, "transaction test1")
        .where(Store.STORE.ID.eq(UInteger.valueOf(2)))
        .execute();
      int i = 1/0;
    });
  }

沒(méi)錯(cuò)就這么簡(jiǎn)單,只需要把需要用事務(wù)的代碼包在transaction里面,假如有異常發(fā)生,業(yè)務(wù)會(huì)自動(dòng)回滾。需要注意一點(diǎn)的是必須使用configuration 重新構(gòu)建context,要不然不會(huì)生效,這也是我為什么沒(méi)有使用官方提供的事務(wù)管理器。正常的項(xiàng)目中一個(gè)業(yè)務(wù)需要組合若干個(gè)service 方法來(lái)完成,而官方提供的默認(rèn)事務(wù)管理器就需要把所有業(yè)務(wù)寫(xiě)在一個(gè)方法中,這在實(shí)際應(yīng)用中顯然是不合理的。幸好JOOQ抽象了事務(wù)管理,這樣我們就可以集成第三方的事務(wù)管理器。

以大家都熟悉的Spring事務(wù)管理器為例。添加依賴

 
   org.springframework
   spring-context
   4.1.2.RELEASE
 
 
   org.springframework
   spring-jdbc
   4.1.2.RELEASE
 
 TransactionAwareDataSourceProxy proxy = new TransactionAwareDataSourceProxy(druidDataSource);
 DataSourceTransactionManager txMgr =  new DataSourceTransactionManager(druidDataSource);
 Configuration configuration = new DefaultConfiguration()
      .set(new DataSourceConnectionProvider(proxy))
      .set(new SpringTransactionProvider(txMgr))
      .set(SQLDialect.MYSQL);
 return DSL.using(configuration);
public class SpringTransactionProvider implements TransactionProvider {
    private static final JooqLogger log = JooqLogger.getLogger(SpringTransactionProvider.class);   
    DataSourceTransactionManager txMgr;
    public SpringTransactionProvider(DataSourceTransactionManager txMgr){
        this.txMgr = txMgr;
    }
    @Override
    public void begin(TransactionContext ctx) {
        log.debug("Begin transaction");
        TransactionStatus tx = txMgr.getTransaction(new DefaultTransactionDefinition());
        ctx.transaction(new SpringTransaction(tx));
    }
    @Override
    public void commit(TransactionContext ctx) {
        log.debug("commit transaction");
        txMgr.commit(((SpringTransaction) ctx.transaction()).tx);
    }
    @Override
    public void rollback(TransactionContext ctx) {
        log.debug("rollback transaction");
        txMgr.rollback(((SpringTransaction) ctx.transaction()).tx);
    }
}
public class SpringTransaction implements Transaction {
    final TransactionStatus tx;
    SpringTransaction(TransactionStatus tx) {
      this.tx = tx;
    }
  }

集成完后 transaction 測(cè)試方法就可以這樣寫(xiě)了

  @Test
  public void transaction(){
    dslContext.transaction(configuration -> {
     dslContext.update(Tables.STORE) //共用同一個(gè)context
        .set(Store.STORE.ADDRESS, "transaction test3")
        .where(Store.STORE.ID.eq(UInteger.valueOf(1)))
        .execute();
      dslContext.update(Tables.STORE)
        .set(Store.STORE.ADDRESS, "transaction test4")
        .where(Store.STORE.ID.eq(UInteger.valueOf(2)))
        .execute();
      int i = 1/0;
    });
  }
其他特性

JOOQ還有很多其他有意思的特性 如對(duì)其他語(yǔ)言的支持,數(shù)據(jù)導(dǎo)出,存儲(chǔ)過(guò)程,JPA支持等等,感興趣的可以參閱一下文檔。說(shuō)到文檔,不得不說(shuō)開(kāi)發(fā)者對(duì)JOOQ的用心,簡(jiǎn)單、詳細(xì)、美觀是最直接的感受,并且還有豐富的demo示例,對(duì)于編程新手來(lái)說(shuō)上手使用也是手到擒來(lái)。

下面我就抱磚引玉,通過(guò)demo簡(jiǎn)單介紹一下ExecuteListener 的使用。ExecuteListener 可以看作是一個(gè)JOOQ執(zhí)行的觀察者,它可以監(jiān)控SQL執(zhí)行的整個(gè)生命周期。并且可以通過(guò)執(zhí)行上下文,做一些個(gè)性化的操作。下面SlowQueryListener類的作用就是收集sql執(zhí)行過(guò)程的慢查詢?nèi)罩尽?/p>

class SlowQueryListener extends DefaultExecuteListener {
  private Logger logger = LoggerFactory.getLogger(SlowQueryListener.class);
  StopWatch watch;

  @Override
  public void executeStart(ExecuteContext ctx) {
    super.executeStart(ctx);
    watch = new StopWatch();
  }

  @Override
  public void executeEnd(ExecuteContext ctx) {
    try{
      super.executeEnd(ctx);
      if (watch.split() > 1_000_000_000L) {//記錄執(zhí)行時(shí)間超過(guò)1s的操作
        ExecuteType type = ctx.type();
        StringBuffer sqlBuffer = new StringBuffer();
        if(type == ExecuteType.BATCH) {
          for(Query query:ctx.batchQueries()) {
            sqlBuffer.append(query.toString()).append("
");
          }
        }else {
          sqlBuffer.append(ctx.query() == null ? "blank query ":ctx.query().toString());
        }
        watch.splitInfo(String.format("Slow SQL query meta executed : [ %s ]",
                                      sqlBuffer.toString() ));
      }
    }catch (Exception e) {
      logger.error(" SlowQueryListener has occur,fix bug  ",e);
    } 
  }
}

在初始化DSLContext 的時(shí)候把SlowQueryListener配置進(jìn)去 代碼如下:

Configuration configuration = new DefaultConfiguration()
      .set(new DataSourceConnectionProvider(proxy))
      .set(new SpringTransactionProvider(txMgr))
      .set(SQLDialect.MYSQL)  
      .set(DefaultExecuteListenerProvider.providers(new SlowQueryListener()));//配置執(zhí)行監(jiān)聽(tīng)器

執(zhí)行時(shí)間超過(guò)1s的sql,會(huì)打印如下日志

Slow SQL query meta executed : [ call ama_procedure.ama_app("57a013edaa150a000101ffca") ]: Total: 3.644s
寫(xiě)在最后

對(duì)于在國(guó)內(nèi)占了大半邊天的Hibernate/Mybatis,JOOQ還是一個(gè)小清新,很多人對(duì)它都還陌生。通過(guò)上面的簡(jiǎn)單介紹,也許對(duì)你有一點(diǎn)幫助。無(wú)論是強(qiáng)大的數(shù)據(jù)轉(zhuǎn)換能力還是處理業(yè)務(wù)的靈活性,簡(jiǎn)潔性,都會(huì)帶來(lái)一些不一樣的體驗(yàn)。如果你已經(jīng)厭倦了ORMS的開(kāi)發(fā)模式,正好又接手一個(gè)新的項(xiàng)目,JOOQ也許是一個(gè)不錯(cuò)的選擇。

作者信息
本文系力譜宿云 LeapCloud旗下MaxLeap團(tuán)隊(duì)_數(shù)據(jù)服務(wù)組 成員:馬傳林【原創(chuàng)】
力譜宿云首發(fā):https://blog.maxleap.cn/archi...
馬傳林,從事開(kāi)發(fā)工作已經(jīng)有多年。當(dāng)前在MaxLeap數(shù)據(jù)服務(wù)組擔(dān)任開(kāi)發(fā)工程師,主要負(fù)責(zé)MaxWon服務(wù)器開(kāi)發(fā)。

作者往期佳作
移動(dòng)云平臺(tái)的基礎(chǔ)架構(gòu)之旅(一):云應(yīng)用

歡迎關(guān)注微信公眾號(hào):MaxLeap_yidongyanfa


關(guān)于 MaxLeap
官網(wǎng):https://maxleap.cn/
簡(jiǎn)介:MaxLeap 移動(dòng)業(yè)務(wù)研發(fā)的云服務(wù)平臺(tái),為企業(yè)提供包括應(yīng)用開(kāi)發(fā)所需的后端云數(shù)據(jù)庫(kù)、云數(shù)據(jù)源、云代碼、云容器、 IM、移動(dòng)支付、應(yīng)用內(nèi)社交、第三方登錄、社交分享、數(shù)據(jù)分析、推送營(yíng)銷,用戶支持等服務(wù), MaxLeap 致力于讓移動(dòng)應(yīng)用開(kāi)發(fā)更快速簡(jiǎn)單。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/17552.html

相關(guān)文章

  • ORM殺器 JOOQ

    摘要:摘要介紹簡(jiǎn)單實(shí)用,以及相對(duì)于傳統(tǒng)框架的不同點(diǎn)。最令人滿意的就是在實(shí)際使用過(guò)程中解決問(wèn)題的靈活性。當(dāng)前在數(shù)據(jù)服務(wù)組擔(dān)任開(kāi)發(fā)工程師,主要負(fù)責(zé)服務(wù)器開(kāi)發(fā)。 摘要 介紹JOOQ簡(jiǎn)單實(shí)用,以及相對(duì)于傳統(tǒng)ORM框架的不同點(diǎn)。 showImg(https://segmentfault.com/img/remote/1460000006763840); (圖片來(lái)自http://www.jooq.org...

    elarity 評(píng)論0 收藏0
  • ORM殺器 JOOQ

    摘要:摘要介紹簡(jiǎn)單實(shí)用,以及相對(duì)于傳統(tǒng)框架的不同點(diǎn)。最令人滿意的就是在實(shí)際使用過(guò)程中解決問(wèn)題的靈活性。當(dāng)前在數(shù)據(jù)服務(wù)組擔(dān)任開(kāi)發(fā)工程師,主要負(fù)責(zé)服務(wù)器開(kāi)發(fā)。 摘要 介紹JOOQ簡(jiǎn)單實(shí)用,以及相對(duì)于傳統(tǒng)ORM框架的不同點(diǎn)。 showImg(/img/remote/1460000006763840); (圖片來(lái)自http://www.jooq.org/) 正文 JOOQ是啥? JOOQ 是基于Ja...

    yeooo 評(píng)論0 收藏0
  • 幾個(gè)數(shù)據(jù)持久化框架Hibernate、JPA、Mybatis、JOOQ和JDBC Template的

    摘要:不管是還是,表之間的連接查詢,被映射為實(shí)體類之間的關(guān)聯(lián)關(guān)系,這樣,如果兩個(gè)實(shí)體類之間沒(méi)有實(shí)現(xiàn)關(guān)聯(lián)關(guān)系,你就不能把兩個(gè)實(shí)體或者表起來(lái)查詢。 因?yàn)轫?xiàng)目需要選擇數(shù)據(jù)持久化框架,看了一下主要幾個(gè)流行的和不流行的框架,對(duì)于復(fù)雜業(yè)務(wù)系統(tǒng),最終的結(jié)論是,JOOQ是總體上最好的,可惜不是完全免費(fèi),最終選擇JDBC Template。 Hibernate和Mybatis是使用最多的兩個(gè)主流框架,而JOO...

    xietao3 評(píng)論0 收藏0
  • jOOQ中文】2. jOOQ與Spring和Druid整合

    摘要:在這個(gè)例子中,我們將整合但您也可以使用其他連接池,如,,等。作為構(gòu)建和執(zhí)行。 jOOQ和Spring很容易整合。 在這個(gè)例子中,我們將整合: Alibaba Druid(但您也可以使用其他連接池,如BoneCP,C3P0,DBCP等)。 Spring TX作為事物管理library。 jOOQ作為SQL構(gòu)建和執(zhí)行l(wèi)ibrary。 一、準(zhǔn)備數(shù)據(jù)庫(kù) DROP TABLE IF EXIS...

    pingink 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<