温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Scala过度包装的平衡怎么理解

发布时间:2021-12-09 09:17:13 来源:亿速云 阅读:142 作者:iii 栏目:编程语言

本篇内容介绍了“Scala过度包装的平衡怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

最近,在阅读项目组的代码时,再次陷入了苦思:基于Java、Hibernate的商业应用开发确实陷入到了一个很痛苦的境界,这个问题实际上正在进行开发的大部分开发人员都不会感觉到,因为大家都觉得这就是正常的程序员生活。再说,几乎所有的框架都在力捧Hibernate这样的ORM工具能够极大的简化程序的开发,要不,你去使用使用 JDBC试试。

在Java中基于JDBC编程,确实有些汇编语言的感觉,摘抄一份实际项目的代码:

public void updateTerminalStatus(String timeout, String transtime) throws Exception {          //更新超时终端的状态值(9为超时)           String updateTerminal = "update T_Terminal set Status=9 "               + " where TerminalID in (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<=? and (status=0 or status=2) ) ";                    //查询超时的终端信息,且该终端号在故障表中没有未处理的超时记录,(包含该终端号在故障表中没有超时记录的情况)。          String queryTimeOutTerm = "SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9 ";          String queryTerm = "SELECT terminalid FROM T_TROUBLELOG tr " +                  " WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' " +                  " AND tr.SolveDate IS NULL GROUP BY  terminalid ";                    //向故障表中添加一条新的故障记录。          String insertTrouble = "insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate) "             + " values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss')) ";                    //更新故障表中的终端超时记录,该终端号的状态已经不超时,则超时故障处理完毕。          String updateTrouble = "UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') " +                  " WHERE terminalid IN" +                  " (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl " +                  " WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )" +                  " AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL ";                    Connection conn = null;          PreparedStatement pstmt = null;          PreparedStatement pstmtInsert = null;          ResultSet rs = null;          List terlist = new ArrayList();          List noterlist = new ArrayList();          try {                            conn = transDataSource.getConnection();              conn.setAutoCommit(false);               pstmt = conn.prepareStatement(updateTerminal);              pstmt.setString(1, timeout);              pstmt.executeUpdate();              pstmt.close();                            pstmt = conn.prepareStatement(updateTrouble);              pstmt.setString(1, transtime);              pstmt.executeUpdate();              pstmt.close();              log.debug("更新完成");               //生成32位的随机ID,使用Hibernate中的UUID算法。              Properties props = new Properties();              props.setProperty("separator", "");              IdentifierGenerator gen = new UUIDHexGenerator();              ( (Configurable) gen ).configure(Hibernate.STRING, props, null);                            pstmtInsert = conn.prepareStatement(insertTrouble);               pstmt = conn.prepareStatement(queryTerm);              rs = pstmt.executeQuery();              while(rs.next()){                  String termid = rs.getString(1);                  terlist.add(termid);              }              log.debug("查询终端号在故障表中没有未处理的超时记录完成");              rs.close();              rs = null;              pstmt.close();              pstmt = null;                                          pstmt = conn.prepareStatement(queryTimeOutTerm);              rs = pstmt.executeQuery();              while (rs.next()) {                  String term = rs.getString(1);                  noterlist.add(term);              }              log.debug("查询超时的终端信息完成" + noterlist.size());                            for(int j = 0; j < noterlist.size(); j++){                  String terminalid = noterlist.get(j).toString();                  if(terlist.contains(terminalid)){                      continue;                  }                  pstmtInsert.setString(1, (String) gen.generate(null, null));                  pstmtInsert.setString(2, terminalid);                  pstmtInsert.setString(3, transtime);                  pstmtInsert.addBatch();              }              pstmtInsert.executeBatch();               conn.commit();              log.debug("向故障表中添加新的故障记录完成");                        } catch (Exception ex) {              try{                  conn.rollback();              }catch (Exception e) {              }              throw ex;          } finally {              if (rs != null) {                  try {                      rs.close();                  } catch (Exception ex) {                  }              }              if (pstmt != null) {                  try {                      pstmt.close();                  } catch (Exception ex) {                  }              }              if (pstmtInsert != null) {                  try {                      pstmtInsert.close();                  } catch (Exception ex) {                  }              }              if (conn != null) {                  try {                      conn.close();                  } catch (Exception ex) {                  }              }          }      }

这份代码长达120行,要去理解它还是得花一些时间的,如果使用 scala来写的话,可以怎么写呢?

implicit val conn: Connection  = transDataSource.getConnection()  transaction {       update("""update T_Terminal set Status=9 where TerminalID in           (select TerminalID from T_Terminal where TO_CHAR(latestDate, 'yyyymmddHH24miss')<= ? and (status=0 or status=2))          """, timeout);            update("""UPDATE T_TROUBLELOG tl SET tl.SolveDate=TO_DATE(?,'yyyymmddHH24miss') WHERE terminalid IN           (SELECT tm.terminalid FROM T_TERMINAL tm,T_TROUBLELOG tl  WHERE tm.Status != 9 AND tm.TerminalID=tl.TerminalID )           AND tl.DeviceID='COMMMODULE' AND tl.TroubleID='CommTimeOut' AND tl.SolveDate IS NULL          """, transtime);       val terlist: List[String] = List()      query("""SELECT terminalid FROM T_TROUBLELOG tr               WHERE tr.DeviceID='COMMMODULE' AND tr.TroubleID='CommTimeOut' AND tr.SolveDate IS NULL               GROUP BY  terminalid          """).foreach { (row) =>          terlist += row("terminalid")      }      log.debug("查询终端号在故障表中没有未处理的超时记录完成");       val noterlist: List[String] = List()      query("SELECT te.TerminalID FROM T_TERMINAL te WHERE te.status=9").foreach { (row)=>          noterlist += row("terminalid")      }      log.debug("查询超时的终端信息完成" + noterlist.size());       val psInsert = conn prepareStatement """insert into T_TroubleLog (LogID, TerminalID, DeviceID, TroubleID, HappenDate)           values (?, ?, 'COMMMODULE', 'CommTimeOut', TO_DATE(?,'yyyymmddHH24miss'))"""       for(val terminalId <- noterlist){          psInsert << uuid() << terminalid << transtime <<!      }   }

这是一个直译的版本,代码函数为34行,瘦身到25%左右。不仅代码行数更短,而且新的代码的可读性也更高得多。

最近一直在思考,我们对JDBC是否做了过度的包装?包括事务处理,DAO等从EJB1.0时代产生的设计模式,到后续的O-R-M框架,看上去代码是越发简洁,实际上已经远远的远离代码的本质。这种基于Scala的JDBC简单封装,即便于我,也还远不如原始的4GL的简洁,但相比传统的jdbc或者后续的orm、spring+dao等等,则要简化得多。

“Scala过度包装的平衡怎么理解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI