日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

這么優雅的Java ORM沒見過吧!

瀏覽:32日期:2022-08-18 13:23:14

  Java的ORM框架有很多,但由于Java語言的限制大部分都不夠優雅也不夠簡單,所以作者只能另辟蹊徑造輪子了。照舊先看示例代碼了解個大概,然后再解釋實現原理。

一、ORM示例1. Insert

public CompletableFuture<Void> insert() { var obj = new sys.entities.Demo('MyName'); //構造參數為主鍵 obj.Age = 100; //設置實體屬性的值 return obj.saveAsync();}2. Update

更新單個實體(必須具備主鍵)

public CompletableFuture<Void> update(sys.entities.Demo obj) { obj.Age = 200; return obj.saveAsync();}

根據條件更新(必須指定條件以防誤操作)

public CompletableFuture<?> update() { var cmd = new SqlUpdateCommand<sys.entities.Demo>(); cmd.update(e -> e.City = 'Wuxi'); //更新字段 cmd.update(e -> e.Age = e.Age + 1); //更新累加字段 cmd.where(e -> e.Name == 'Johne'); //更新的條件 var outs = cmd.output(e -> e.Age); //更新的同時返回指定字段 return cmd.execAsync().thenApply(rows -> { System.out.println('更新記錄數: ' + rows); System.out.println('返回的值: ' + outs.get(0)); return 'Done.'; });}3. Delete

刪除單個實體(必須具備主鍵)

public CompletableFuture<Void> update(sys.entities.Demo obj) { obj.markDeleted(); //先標記為刪除狀態 return obj.saveAsync(); //再調用保存方法}

根據條件刪除(必須指定條件以防誤操作)

public CompletableFuture<?> delete() { var cmd = new SqlDeleteCommand<sys.entities.Demo>(); cmd.where(e -> e.Age < 0 || e.Age > 200); return cmd.execAsync();}4. Transaction

  由于作者討厭隱式事務,所以事務命令必須顯式指定。

public CompletableFuture<?> transaction() { var obj1 = new sys.entities.Demo('Demo1'); obj1.Age = 11; var obj2 = new sys.entities.Demo('Demo2'); obj2.Age = 22; return DataStore.DemoDB.beginTransaction().thenCompose(txn -> { //開始事務 return obj1.saveAsync(txn) //事務保存obj1 .thenCompose(r -> obj2.saveAsync(txn)) //事務保存obj2 .thenCompose(r -> txn.commitAsync()); //遞交事務 }).thenApply(r -> 'Done');}5. Sql查詢

Where條件

public CompletableFuture<?> query(String key) { var q = new SqlQuery<sys.entities.Demo>(); q.where(e -> e.Age > 10 && e.Age < 80); if (key != null) q.andWhere(e -> e.Name.contains(key)); //拼接條件 return q.toListAsync(); //返回List<sys.entities.Demo>}

分頁查詢

public CompletableFuture<?> query(int pageSize, int pageIndex) { var q = new SqlQuery<sys.entities.Demo>(); return q.skip(pageSize * pageIndex) .take(pageSize) .toListAsync();}

結果映射至匿名類

public CompletableFuture<?> query() { var q = new SqlQuery<sys.entities.Demo>(); return q.toListAsync(e -> new Object() { //返回List<匿名類> public final String Name = e.Name; //匿名類屬性 = 實體屬性表達式 public final int Age = e.Age + 10; public final String Father = e.Parent.Name; }).thenApply(appbox.data.JsonResult::new);}

結果映射至繼承的匿名類

public CompletableFuture<?> query() { var q = new SqlQuery<sys.entities.Demo>(); q.where(e -> e.Parent.Name == 'Rick'); return q.toListAsync(e -> new sys.entities.Demo() { //返回List<? extens Demo> public final String Father = e.Parent.Name; });}

結果映射至樹狀結構列表

public CompletableFuture<?> tree() { var q = new SqlQuery<sys.entities.Demo>(); q.where(t -> t.Name == 'Rick'); return q.toTreeAsync(t -> t.Childs); //參數指向EntitySet(一對多成員)}

EntityRef(一對一引用的實體成員)自動Join

public CompletableFuture<?> query() { var q = new SqlQuery<sys.entities.Customer>(); q.where(cus -> cus.City.Name == 'Wuxi'); return q.toListAsync();}生成的Sql:Select t.* From 'Customer' t Left Join 'City' j1 On j1.'Code'=t.'CityCode'

手工指定Join

public CompletableFuture<?> join() { var q = new SqlQuery<sys.entities.Customer>(); var j = new SqlQueryJoin<sys.entities.City>(); q.leftJoin(j, (cus, city) -> cus.CityCode == city.Code); q.where(j, (cus, city) -> city.Name == 'Wuxi'); return q.toListAsync();}

子查詢

public CompletableFuture<?> subQuery() { var sq = new SqlQuery<sys.entities.Demo>(); sq.where(s -> s.ParentName == 'Rick'); var q = new SqlQuery<sys.entities.Demo>(); q.where(t -> DbFunc.in(t.Name, sq.toSubQuery(s -> s.Name))); return q.toListAsync();}

GroupBy

public CompletableFuture<?> groupBy() { var q = new SqlQuery<sys.entities.Demo>(); q.groupBy(t -> t.ParentName) //多個可重復 .having(t -> DbFunc.sum(t.Age) > 10); return q.toListAsync(t -> new Object() { public final String group = t.ParentName == null ? '可憐的孩子' : t.ParentName; public final int totals = DbFunc.sum(t.Age); }).thenApply(appbox.data.JsonResult::new);}二、實現原理

  其實以上的示例代碼并非最終運行的代碼,作者利用Eclipse jdt將上述代碼在編譯發布服務模型時分析轉換為最終的運行代碼,具體過程如下:

1. jdt分析服務虛擬代碼生成AST抽象語法樹;2. 遍歷AST樹,將實體對象的讀寫屬性改寫為getXXX(), setXXX();

var name = obj.Name; //讀實體屬性obj.Name = 'Rick'; //寫實體屬性

改寫為:

var name = obj.getName();obj.setName('Rick');

3. 遍歷AST樹,將查詢相關方法的參數轉換為運行時表達式;

public CompletableFuture<?> query(String key) { var q = new SqlQuery<sys.entities.Employee>(); q.where(e -> e.Manager.Name + 'a' == key + 'b'); return q.toListAsync();}

轉換為:

public CompletableFuture<?> query(String key) { var q = new appbox.store.query.SqlQuery<>(-7018111290459553788L, SYS_Employee.class); q.where(e -> e.m('Manager').m('Name').plus('a').eq(key + 'b')); return q.toListAsync();}

4. 根據服務模型使用到的實體模型生成相應實體的運行時代碼;5. 最后編譯打包服務模型的字節碼。

以上請參考源碼的ServiceCodeGenerator及EntityCodeGenerator類。

三、性能與小結

  作者寫了個簡單查詢的服務,測試配置為MacBook主機(wrk壓測 + 數據庫)->4核I7虛擬機(服務端),測試結果如下所示qps可達1萬,已包括實體映射轉換及序列化傳輸等所有開銷。這里順便提一下,由于框架是全異步的,所以沒有使用傳統的JDBC驅動,而是使用了jasync-sql(底層為Netty)來驅動數據庫。

wrk -c200 -t2 -d20s -s post_bin.lua http://10.211.55.8:8000/apiRunning 20s test @ http://10.211.55.8:8000/api 2 threads and 200 connections Thread Stats Avg Stdev Max +/- Stdev Latency 18.97ms 5.84ms 89.15ms 81.55% Req/Sec 5.32k 581.92 6.48k 65.00% 211812 requests in 20.02s, 36.76MB readRequests/sec: 10578.90Transfer/sec: 1.84MB

以上就是這么優雅的Java ORM沒見過吧!的詳細內容,更多關于java orm的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美一区久久久| 蜜桃久久久久久| 91精品国产自产精品男人的天堂| 日韩精品一级中文字幕精品视频免费观看 | 亚洲天堂av资源在线观看| 午夜久久美女| 日韩视频久久| 美女久久一区| 亚洲精品美女91| 国产日韩高清一区二区三区在线 | 999久久久91| 欧美不卡高清| 老鸭窝毛片一区二区三区| 天堂网在线观看国产精品| 国产精品99免费看| 国产精品日本欧美一区二区三区| 欧美日韩国产高清| 午夜一级久久| 日韩欧美中文字幕一区二区三区 | 国产成人精品一区二区三区免费| 精品久久精品| 日韩久久一区二区三区| 日韩一区二区三区在线免费观看| 国产传媒av在线| 久久中文字幕二区| 视频一区欧美精品| 日本不卡不码高清免费观看 | 高潮久久久久久久久久久久久久| 黄色aa久久| 国产真实久久| 日韩在线一区二区| 亚洲精品大片| 欧美激情在线精品一区二区三区| 精品亚洲a∨一区二区三区18| 麻豆mv在线观看| 99精品美女| 亚洲开心激情| 久久精品国产久精国产| 亚洲国产专区| 视频一区日韩精品| 捆绑调教美女网站视频一区 | 久久高清国产| 国产精品调教| 韩国三级一区| 日韩在线观看一区二区| 国产欧美一级| 久久九九国产| 亚洲ww精品| 久久精品xxxxx| 天堂√8在线中文| 亚洲欧美日韩国产一区二区| 国产日韩欧美三级| 91精品综合| 日韩精品久久理论片| 国产精品成人一区二区不卡| 亚洲男女自偷自拍| 麻豆精品在线观看| 蜜臀国产一区| 色综合视频一区二区三区日韩| 精品视频99| 日韩中文字幕区一区有砖一区| 欧美激情福利| 欧美午夜不卡| 日韩国产在线一| 日韩欧美一区免费| 日韩精品欧美大片| 亚洲成人精品| 欧美一区=区三区| 99久久99久久精品国产片果冰| 日韩欧美精品一区二区综合视频| 日韩大片在线观看| 91精品一区| 中文日韩欧美| 久久亚洲人体| 热久久免费视频| 成人羞羞在线观看网站| 国产美女视频一区二区| 亚洲免费黄色| 91精品一区| 一区在线视频观看| 久久精品国产久精国产| 中文一区一区三区免费在线观| 亚洲精品日韩久久| 久久精品国产亚洲aⅴ | 91精品一区二区三区综合| 手机精品视频在线观看| 影音先锋久久精品| 日韩va亚洲va欧美va久久| 亚洲自拍另类| 日韩福利一区| 国产一区二区三区自拍| 日本在线精品| 国产精品视频一区二区三区四蜜臂 | 欧美激情另类| 一区在线免费| 日韩中文在线电影| 亚久久调教视频| 日韩视频一区| 亚洲一区国产一区| 国产伦理久久久久久妇女| 91国内精品| 久久超碰99| 丝袜亚洲另类欧美| 中文字幕一区久| 日韩黄色av| 中文字幕免费精品| 爽好多水快深点欧美视频| 天堂网在线观看国产精品| 日韩精品不卡一区二区| 精品视频一区二区三区四区五区 | 久久福利毛片| 欧美一区二区三区激情视频| 日韩成人精品一区二区| 久久中文欧美| 国产精品主播| 天堂久久av| 亚洲tv在线| 免费人成精品欧美精品| 美女精品在线| 蜜臀国产一区二区三区在线播放| 亚洲经典在线| 亚洲国产不卡| 香蕉久久精品| 欧美日韩国产高清电影| 国产综合精品| 欧美91福利在线观看| 久久久精品日韩| 国产精品黑丝在线播放| 国产一区二区三区不卡视频网站 | 日韩免费看片| 在线看片国产福利你懂的| 久久精品国产在热久久| 美女精品久久| 精品国产精品国产偷麻豆| 国产精品igao视频网网址不卡日韩| 国内一区二区三区| 精品国产欧美日韩一区二区三区| 精品中文字幕一区二区三区| 麻豆精品99| 中文无码日韩欧| 91精品精品| 伊人久久亚洲| 国产精品亚洲综合色区韩国| 欧美日韩国产亚洲一区| 青青草国产成人99久久| 国产精品久久久久久久久久久久久久久| 欧美久久精品一级c片| 亚洲精品黄色| 日韩精品欧美精品| 日韩精品五月天| 亚洲另类黄色| 黄色免费成人| 国产精品久久久久久久久免费高清| 精品国产网站| 免费在线观看一区| 久久av国产紧身裤| 青青伊人久久| 精品视频亚洲| 1024精品久久久久久久久| 伊人精品在线| 国产一二在线播放| 黄色成人在线网址| 日韩精品欧美大片| 日韩av一级片| 在线亚洲欧美| 亚洲欧美成人综合| 日韩中文字幕区一区有砖一区| 一区二区自拍| 日本 国产 欧美色综合| 日韩欧美中文| 国产一区导航| 精品91久久久久| 欧美日韩国产一区精品一区| 麻豆中文一区二区| 国产精品一站二站| 麻豆一区二区在线| 精品国产一区二区三区av片| 美女视频免费精品| 欧美国产偷国产精品三区| av亚洲在线观看| 午夜精品久久久久久久久久蜜桃| 久久激情网站| 麻豆视频一区| 中文在线免费视频| 国产精品久久亚洲不卡| 国产伦理一区| 欧美 日韩 国产一区二区在线视频| 亚洲精品一二三**| 欧美片第1页| 亚洲欧美视频| 久久av免费看| 亚洲一区中文| 美女免费视频一区| 国产精品人人爽人人做我的可爱| 久久精品国产免费| 国产精品日韩| 国产一区二区三区天码| 亚洲毛片在线免费| 电影亚洲精品噜噜在线观看| 日本在线一区二区三区|