精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Scala的啟發:代碼本質與過度包裝的平衡

開發 后端
基于Java、Hibernate的商業應用開發確實陷入到了一個很痛苦的境界,而大家卻都覺得這就是正常的程序員生活。不過,一段Scala直譯JDBC的代碼,卻引發了另一番思考。

本文來自王在祥先生的博客(blogspot),原標題為《重溫 scala》。對于代碼簡潔化與可讀性矛盾的解決,Scala語言無疑是一種啟發。以下為原文:

51CTO編輯推薦:Scala編程語言專題

#t#最近,在閱讀項目組的代碼時,再次陷入了苦思:基于Java、Hibernate的商業應用開發確實陷入到了一個很痛苦的境界,這個問題實際上正在進行開發的大部分開發人員都不會感覺到,因為大家都覺得這就是正常的程序員生活。再說,幾乎所有的框架都在力捧Hibernate這樣的ORM工具能夠極大的簡化程序的開發,要不,你去使用使用 JDBC試試。

在Java中基于JDBC編程,確實有些匯編語言的感覺,摘抄一份實際項目的代碼:

  1. public void updateTerminalStatus(String timeout, String transtime) throws Exception {  
  2.         //更新超時終端的狀態值(9為超時)   
  3.         String updateTerminal = "update T_Terminal set Status=9 "   
  4.             + " where TerminalID in (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<=? and (status=0 or status=2) ) ";  
  5.           
  6.         //查詢超時的終端信息,且該終端號在故障表中沒有未處理的超時記錄,(包含該終端號在故障表中沒有超時記錄的情況)。  
  7.         String queryTimeOutTerm = "SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9 ";  
  8.         String queryTerm = "SELECT terminalid FROM T_TROUBLELOG tr " +  
  9.                 " WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' " +  
  10.                 " AND tr.SolveDate IS NULL GROUP BY  terminalid ";  
  11.           
  12.         //向故障表中添加一條新的故障記錄。  
  13.         String insertTrouble = "insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate) " 
  14.             + " values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss')) ";  
  15.           
  16.         //更新故障表中的終端超時記錄,該終端號的狀態已經不超時,則超時故障處理完畢。  
  17.         String updateTrouble = "UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') " +  
  18.                 " WHERE terminalid IN" +  
  19.                 " (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl " +  
  20.                 " WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )" +  
  21.                 " AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL ";  
  22.           
  23.         Connection conn = null;  
  24.         PreparedStatement pstmt = null;  
  25.         PreparedStatement pstmtInsert = null;  
  26.         ResultSet rs = null;  
  27.         List terlist = new ArrayList();  
  28.         List noterlist = new ArrayList();  
  29.         try {  
  30.               
  31.             conn = transDataSource.getConnection();  
  32.             conn.setAutoCommit(false);  
  33.  
  34.             pstmt = conn.prepareStatement(updateTerminal);  
  35.             pstmt.setString(1, timeout);  
  36.             pstmt.executeUpdate();  
  37.             pstmt.close();  
  38.               
  39.             pstmt = conn.prepareStatement(updateTrouble);  
  40.             pstmt.setString(1, transtime);  
  41.             pstmt.executeUpdate();  
  42.             pstmt.close();  
  43.             log.debug("更新完成");  
  44.  
  45.             //生成32位的隨機ID,使用Hibernate中的UUID算法。  
  46.             Properties props = new Properties();  
  47.             props.setProperty("separator""");  
  48.             IdentifierGenerator gen = new UUIDHexGenerator();  
  49.             ( (Configurable) gen ).configure(Hibernate.STRING, props, null);  
  50.               
  51.             pstmtInsert = conn.prepareStatement(insertTrouble);  
  52.  
  53.             pstmt = conn.prepareStatement(queryTerm);  
  54.             rs = pstmt.executeQuery();  
  55.             while(rs.next()){  
  56.                 String termid = rs.getString(1);  
  57.                 terlist.add(termid);  
  58.             }  
  59.             log.debug("查詢終端號在故障表中沒有未處理的超時記錄完成");  
  60.             rs.close();  
  61.             rs = null;  
  62.             pstmt.close();  
  63.             pstmt = null;  
  64.               
  65.               
  66.             pstmt = conn.prepareStatement(queryTimeOutTerm);  
  67.             rs = pstmt.executeQuery();  
  68.             while (rs.next()) {  
  69.                 String term = rs.getString(1);  
  70.                 noterlist.add(term);  
  71.             }  
  72.             log.debug("查詢超時的終端信息完成" + noterlist.size());  
  73.               
  74.             for(int j = 0; j < noterlist.size(); j++){  
  75.                 String terminalid = noterlist.get(j).toString();  
  76.                 if(terlist.contains(terminalid)){  
  77.                     continue;  
  78.                 }  
  79.                 pstmtInsert.setString(1, (String) gen.generate(nullnull));  
  80.                 pstmtInsert.setString(2, terminalid);  
  81.                 pstmtInsert.setString(3, transtime);  
  82.                 pstmtInsert.addBatch();  
  83.             }  
  84.             pstmtInsert.executeBatch();  
  85.  
  86.             conn.commit();  
  87.             log.debug("向故障表中添加新的故障記錄完成");  
  88.               
  89.         } catch (Exception ex) {  
  90.             try{  
  91.                 conn.rollback();  
  92.             }catch (Exception e) {  
  93.             }  
  94.             throw ex;  
  95.         } finally {  
  96.             if (rs != null) {  
  97.                 try {  
  98.                     rs.close();  
  99.                 } catch (Exception ex) {  
  100.                 }  
  101.             }  
  102.             if (pstmt != null) {  
  103.                 try {  
  104.                     pstmt.close();  
  105.                 } catch (Exception ex) {  
  106.                 }  
  107.             }  
  108.             if (pstmtInsert != null) {  
  109.                 try {  
  110.                     pstmtInsert.close();  
  111.                 } catch (Exception ex) {  
  112.                 }  
  113.             }  
  114.             if (conn != null) {  
  115.                 try {  
  116.                     conn.close();  
  117.                 } catch (Exception ex) {  
  118.                 }  
  119.             }  
  120.         }  
  121.     }  
  122.  

這份代碼長達120行,要去理解它還是得花一些時間的,如果使用 scala來寫的話,可以怎么寫呢?

  1. implicit val conn: Connection  = transDataSource.getConnection()  
  2. transaction {  
  3.  
  4.     update("""update T_Terminal set Status=9 where TerminalID in   
  5.         (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<= ? and (status=0 or status=2))  
  6.         """, timeout);  
  7.       
  8.     update("""UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') WHERE terminalid IN   
  9.         (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl  WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )   
  10.         AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL  
  11.         """, transtime);  
  12.  
  13.     val terlist: List[String] = List()  
  14.     query("""SELECT terminalid FROM T_TROUBLELOG tr   
  15.             WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' AND tr.SolveDate IS NULL   
  16.             GROUP BY  terminalid  
  17.         """).foreach { (row) =>  
  18.         terlist += row("terminalid")  
  19.     }  
  20.     log.debug("查詢終端號在故障表中沒有未處理的超時記錄完成");  
  21.  
  22.     val noterlist: List[String] = List()  
  23.     query("SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9").foreach { (row)=>  
  24.         noterlist += row("terminalid")  
  25.     }  
  26.     log.debug("查詢超時的終端信息完成" + noterlist.size());  
  27.  
  28.     val psInsert = conn prepareStatement """insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate)   
  29.         values (?, ?, 'COMMMODULE''CommTimeOut', TO_DATE(?,'yyyymmddHH24miss'))"""  
  30.  
  31.     for(val terminalId <- noterlist){  
  32.         psInsert << uuid() << terminalid << transtime <<!  
  33.     }  
  34.  
  35. }  
  36.  

這是一個直譯的版本,代碼函數為34行,瘦身到25%左右。不僅代碼行數更短,而且新的代碼的可讀性也更高得多。

最近一直在思考,我們對JDBC是否做了過度的包裝?包括事務處理,DAO等從EJB1.0時代產生的設計模式,到后續的O-R-M框架,看上去代碼是越發簡潔,實際上已經遠遠的遠離代碼的本質。這種基于Scala的JDBC簡單封裝,即便于我,也還遠不如原始的4GL的簡潔,但相比傳統的jdbc或者后續的orm、spring+dao等等,則要簡化得多。

scala到底能不能投入實際項目應用?開發人員的學習成本有多高?這個問題一直讓我痛苦,最近,看到 dcaoyuan 先生的netbeans scala ide,讓我重新點燃對scala的欲望,或許,在我們的平臺中,接下來就可以嘗試 scala了:至少在我看來,scala可以有效的消除我們目前代碼中不必要的 DAO 模式以及復雜的事務處理模型等。如果能夠在有限的范圍內進行嘗試,進而進行推廣。或許能夠在接下來能進一步的提高工作效率。

責任編輯:yangsai 來源: Wang Zai Xiang
相關推薦

2010-09-14 15:34:41

Scala

2023-05-09 09:04:29

代碼設計語言

2009-07-22 07:45:00

Scala代碼重復

2009-07-21 08:54:35

Scala富包裝器

2021-02-06 23:21:35

SaaS開發低代碼

2009-12-09 09:15:47

從Java走進ScalTwitter API

2009-09-09 14:09:35

Scala Trait

2010-01-22 00:06:26

戴爾綠色

2019-09-02 22:17:01

英特爾

2018-11-08 15:50:18

前端Javascript重用性

2022-04-19 20:51:20

軟件開發耦合代碼

2025-10-09 08:11:43

2022-02-24 18:51:04

跨端框架方案

2013-04-27 10:24:03

2020-10-31 17:33:18

Scala語言函數

2009-07-08 12:43:59

Scala ServlScala語言

2022-07-27 19:24:16

SQL

2016-05-30 09:43:58

HDS

2012-03-21 10:09:12

2025-07-01 03:15:00

點贊
收藏

51CTO技術棧公眾號

国产精品人人做人人爽| 精品无人区乱码1区2区3区在线| 永久域名在线精品| 国产成人精品无码高潮| 亚洲黄色天堂| 亚洲视频电影图片偷拍一区| 91女神在线观看| 麻豆蜜桃在线| 国产三级一区二区三区| 91精品中国老女人| 91午夜视频在线观看| 黑人操亚洲人| 欧美日韩高清影院| 阿v天堂2018| 在线观看av黄网站永久| 成人国产亚洲欧美成人综合网| 国产精品96久久久久久| 国产精品成人免费观看| 免费一区二区| 欧美精品一区二| 91极品视频在线观看| 国产蜜臀av在线播放| 中文字幕电影一区| 激情久久av| 99视频国产精品免费观看a| 亚洲欧美久久久| 久久电影一区二区| 中国美女乱淫免费看视频| 久久综合偷偷噜噜噜色| 91福利在线观看| 日本手机在线视频| 欧美黄色激情| 欧美激情一区不卡| 久久精品国产精品国产精品污| 国产人妖一区二区| 奇米影视一区二区三区| 欧美做爰性生交视频| 国产在线一二区| 一区二区三区网站| www.xxxx精品| 日韩毛片无码永久免费看| silk一区二区三区精品视频| 在线综合+亚洲+欧美中文字幕| 亚洲无吗一区二区三区| 高清不卡av| 欧美日韩免费区域视频在线观看| 成人午夜免费剧场| jizzjizz亚洲| 亚洲欧美一区二区久久| 亚洲图片欧洲图片日韩av| 国内av一区二区三区| 91美女在线观看| 欧美二级三级| 深夜影院在线观看| 99久久99久久精品免费观看| 国产欧美日韩综合精品二区| 亚洲国产剧情在线观看| 国产高清精品久久久久| 91精品婷婷国产综合久久蝌蚪| 国产精品久久久久久久成人午夜| 麻豆成人免费电影| 国产精品自拍视频| 一级黄色片免费| 久久99精品久久久久| 国产日韩综合一区二区性色av| 91麻豆成人精品国产| 激情久久五月天| 亚洲free嫩bbb| 精品久久久无码中文字幕| 国产一区二区剧情av在线| 亚洲资源在线看| 亚洲黄色一级大片| 成人福利视频网站| 欧美国产视频在线观看| eeuss影院www在线观看| 中文字幕一区二区5566日韩| 午夜啪啪福利视频| 国产精品—色呦呦| 精品久久在线播放| 亚洲乱码国产一区三区| 精品久久在线| 日韩精品综合一本久道在线视频| 怡红院一区二区| 亚洲电影一级片| 日韩在线观看视频免费| 国产高潮流白浆| 亚洲大黄网站| 国产精品久久久久77777| 亚洲一区二区三区高清视频| 黄色精品一二区| 国产伦精品一区二区三区免| 亚洲人妻一区二区三区| 国产精品美女一区二区| 色哟哟免费网站| 男人天堂视频在线观看| 欧美视频精品在线观看| 99中文字幕在线| 国产劲爆久久| 在线日韩第一页| 亚洲av无码一区二区三区在线| 亚洲无吗在线| 国产精品免费久久久久久| 国产www免费观看| 91美女在线视频| 日本不卡一区二区三区四区| 国模私拍一区二区国模曼安| 精品视频免费在线| 日韩黄色一区二区| 久久国产亚洲精品| 国a精品视频大全| 伊人网综合在线| 成人激情小说乱人伦| 亚洲国产精品123| 波多野结依一区| 欧美日韩一区小说| 亚洲av网址在线| 国产精品97| 茄子视频成人在线| 性欧美18一19性猛交| 国产色产综合色产在线视频| 91免费黄视频| 国产亚洲精aa在线看| 国产婷婷97碰碰久久人人蜜臀| www.毛片com| 日韩中文字幕区一区有砖一区 | 欧美日韩女优| 精品国产乱码久久久久久图片 | 婷婷视频在线观看| 亚洲欧美日本韩国| jizz欧美激情18| 日本一道高清一区二区三区| 九色精品免费永久在线| 中文字幕在线观看高清| 久久综合成人精品亚洲另类欧美 | 特级黄色录像片| 国产经典一区| 亚洲天堂精品在线| 成人毛片18女人毛片| 国产成人丝袜美腿| 免费观看黄色的网站| 日韩一区二区三区在线免费观看| 亚洲国产日韩欧美在线动漫| 久久久久无码精品国产| 国内精品国产三级国产a久久| 丝袜美腿玉足3d专区一区| 中文字幕在线直播| 精品盗摄一区二区三区| 欧美成人片在线观看| 国产一区二区视频在线播放| 亚洲综合欧美日韩| 国产情侣一区二区三区| 一个人www欧美| 中文字幕视频免费观看| 久久亚洲欧美国产精品乐播| 精品人妻人人做人人爽| 日本一区二区三区播放| 欧美xxxx18性欧美| h狠狠躁死你h高h| 亚洲靠逼com| 亚洲成人激情小说| 欧美色123| 国产精品日本一区二区| rebdb初裸写真在线观看| 欧美精品一区二区不卡| 中国一级特黄毛片| 久久色成人在线| 99热手机在线| 天天综合网91| 91九色对白| 国模私拍一区二区国模曼安| 亚洲女人天堂av| 中文人妻熟女乱又乱精品| 国产精品视频线看| 搡的我好爽在线观看免费视频| 天天射综合网视频| 国产激情一区二区三区在线观看 | а√天堂8资源在线官网| 91精品婷婷国产综合久久竹菊| 九九热最新地址| 不卡av在线免费观看| 日韩欧美视频网站| 国产一区二区电影在线观看| 国产拍精品一二三| 日日夜夜天天综合入口| 亚洲精品福利在线| 中文在线字幕av| 一区二区三区免费| 一卡二卡三卡四卡| 国产一区美女在线| 男人日女人下面视频| 日本电影一区二区| wwwxx欧美| 日本少妇一区| 欧美高清视频在线播放| 免费国产在线观看| 欧美一区二区三区在线电影| 国产情侣自拍av| 亚洲欧美日韩一区二区三区在线观看| 国产伦精品一区二区三区88av| 丝袜亚洲另类丝袜在线| 五月天激情图片| 色综合中文网| 草莓视频一区| 日韩毛片一区| 高清欧美电影在线| 天堂а√在线资源在线| 日韩成人在线视频观看| 国产精品无码久久久久成人app| 同产精品九九九| 日韩a级片在线观看| 国产喂奶挤奶一区二区三区| 91人人澡人人爽| 久久精品国产亚洲高清剧情介绍| 777精品久无码人妻蜜桃| 国产精品久久久乱弄 | 国产精品日韩精品| 国产精品九九视频| 欧美日韩一级在线观看| 成人av高清在线| 91丝袜超薄交口足| 日本不卡123| 尤物av无码色av无码| 伊人情人综合网| 水蜜桃一区二区三区| 欧美电影免费网站| av一区二区三区在线观看| 色成人综合网| 国产成+人+综合+亚洲欧洲| 丁香花视频在线观看| 久久久国产精品视频| 国产高清美女一级毛片久久| 日韩黄色高清视频| 亚洲精品无码久久久| 91麻豆精品国产91久久久资源速度 | 国产精品视频一区二区高潮| 天堂中文最新版在线中文| 欧美国产亚洲精品久久久8v| a级影片在线观看| 久久精品国产v日韩v亚洲| av在线中文| 一区二区中文字幕| 牛牛影视精品影视| 日韩成人av在线播放| 香蕉av在线播放| 亚洲黄色在线看| 天天操天天干天天爱| 欧美岛国在线观看| a天堂中文在线观看| 欧美一卡二卡在线观看| 国产精品久久久久久免费| 欧美美女一区二区三区| 中文字幕欧美色图| 欧美性色黄大片| 人妻中文字幕一区二区三区| 在线精品观看国产| 在线视频精品免费| 在线观看一区二区精品视频| 中文字幕人妻精品一区| 欧美午夜视频网站| 亚洲系列第一页| 69久久99精品久久久久婷婷| 国产麻豆91视频| 日韩精品资源二区在线| 亚洲精品久久久狠狠狠爱| 亚洲精品一区二区三区香蕉| 四虎免费在线观看| 亚洲精品一二区| 成人高清免费在线播放| 日韩中文字幕视频| av在线影院| 91精品成人久久| 香蕉久久免费电影| 国产精品视频区1| 蜜桃精品一区二区三区| 国产精品午夜av在线| 色婷婷av一区二区三区丝袜美腿| 欧美日韩国产精品一卡| 日韩欧美视频| 免费网站永久免费观看| 最新日韩欧美| 免费看污污网站| 国产一区二区h| aaaa黄色片| 国产人成一区二区三区影院| 中国1级黄色片| 亚洲综合久久久| 少妇高潮av久久久久久| 欧美老女人在线| 色窝窝无码一区二区三区成人网站| 亚洲天堂av高清| 欧美日韩经典丝袜| 国产福利视频一区二区| 国产精品日本一区二区不卡视频| 国产一级特黄a大片99| 精品国产一区一区二区三亚瑟 | 亚洲精品激情| 国产三级三级看三级| 福利一区福利二区| 美女爆乳18禁www久久久久久| 亚洲欧洲三级电影| 五月天婷婷综合网| 欧美精品日日鲁夜夜添| 性xxxxbbbb| 另类色图亚洲色图| 小视频免费在线观看| 亚洲jizzjizz日本少妇| 日韩手机在线| av在线观看地址| 麻豆精品一区二区综合av| 欧亚乱熟女一区二区在线| 中文字幕在线观看不卡视频| 亚洲久久在线观看| 欧美成人一区二区三区| 二区三区在线播放| 久久久之久亚州精品露出| 色综合久久久| 欧美日韩国产免费一区二区三区| 伊人成人网在线看| 樱花草www在线| 国产欧美久久久精品影院| 日韩少妇高潮抽搐| 欧美一区二区三区在线观看视频| 福利在线视频导航| 97香蕉超级碰碰久久免费软件| 国产精品免费精品自在线观看 | 欧美日韩xx| 日韩免费观看av| 日本韩国欧美超级黄在线观看| 国产91视频一区| 国内精品写真在线观看| 午夜影院黄色片| 色综合久久精品| 深夜福利在线看| 午夜精品久久久久久久99热浪潮| 国产精品一区二区精品| 一本久久a久久精品vr综合| 麻豆久久精品| 蜜桃av免费看| 欧美性猛交xxxx富婆| 天堂v在线观看| 午夜精品99久久免费| 精品女人视频| 国产欧美日韩网站| 成人做爰69片免费看网站| 欧美日韩在线国产| 欧美电影精品一区二区| 男女在线视频| 国产亚洲一区二区三区在线播放 | 北条麻妃av高潮尖叫在线观看| 91在线高清观看| 亚洲天堂视频网站| 亚洲精品一二区| 巨胸喷奶水www久久久| 色噜噜狠狠一区二区三区| 老牛嫩草一区二区三区日本 | 国产97色在线|日韩| 亚洲肉体裸体xxxx137| 可以在线看的黄色网址| 久久久噜噜噜久噜久久综合| 一级做a爰片久久毛片| 亚洲天堂男人天堂| 精品日韩视频| 国产系列第一页| 国产一区二区中文字幕| 九九热精品免费视频| 日韩经典中文字幕在线观看| 天堂电影一区| 亚洲精品乱码久久久久久蜜桃91 | 欧美三级乱码| 男女一区二区三区| 日韩欧美在线一区| 在线免费观看黄色av| 97久久精品午夜一区二区| 在线成人h网| 久久精品国产亚洲av久| 欧美人体做爰大胆视频| 伊人影院在线视频| 精品国产一区二区三区麻豆小说| 亚洲毛片在线| 少妇无套高潮一二三区| 欧美精品丝袜中出| heyzo一区| 五月天亚洲综合| 国产成人av福利| 天天干,天天干| 欧美精品做受xxx性少妇| 欧美男人操女人视频| 亚洲少妇第一页| 一区二区三区精品在线观看| 日本中文字幕一区二区有码在线| 日韩免费精品视频| 你懂的网址国产 欧美| av直播在线观看| 91精品国产综合久久精品麻豆 | 欧美午夜免费电影| 国产丝袜在线播放| 亚洲欧美日产图| 99久久久久久| 国产乱淫av片免费| 热久久免费国产视频|