上一篇將JDBC完成以後,若是要作一個完整的項目,須要在這個基礎上進行分包。sql
分包的意義在於將各我的的功能分開,程序運行更便利。數據庫
每層的項目分部dom
view菜單層工具
domian 實體類測試
controller 中轉層spa
service 獲取dao層數據設計
dao層,數據庫層3d
tools工具類層code
test測試類對象
主要實現功能
這是主要功能,代碼由於過於多久不復制粘貼,主要是總結一下知識難點和一問題,還有一些容易混淆的地方
知識難點:
一、若是連續更新數據,若是隻是單純的方法聯合並不須要,但結合現實咱們發現,若是在修改某個數據時,每每是聯合修改的。這就顛覆了最初的邏輯,後來解決這個的辦法是採用了全局變量定義,局部變量在方法中定義,從而做爲形參傳入後續的方法中。如費用更新時的身份證,輸入的費用:
變量賦值:以後得到了某我的的身份證和費用數,從而使後面的我的信息表中的我的總金額累加+費用標記結清
第二是中間表的做用,它就是兩表之間的關係,如一個員工對應兩個房間,你沒法在房間表或員工表進行一個多條從新信息錄入,這違反了我設計表時一我的對應一條信息的原則。
那它們之間如何練習起來,就用到中間表,將兩表的主鍵放入,將關係存儲在中間表,從而若是須要查詢兩表經過它聯合便可。
中間表:
房間表:
員工表:
語句如何查詢:
2、容易混淆的地方
dao層的幾種處理結果集。
我用到的處理結果集,如果查詢,須要便利遍歷數據庫中的全部內容來輸出。其中分爲,方法的修飾符區別,若是有返回值類型,須要對它進行賦值遍歷。
//年報表 方法重載 public List< cost> getBaobiao(int year ) throws SQLException{ //得到鏈接對象 Connection conn=JDBCUtils.getConn(); //數據庫語句 String sql="SELECT username,cost.`room_num`,cost.usercard,SUM(cost) " + "FROM cost JOIN userinfo ON cost.`usercard`=userinfo.`usercard` " + "WHERE TIME LIKE ? GROUP BY usercard"; PreparedStatement pst=conn.prepareStatement(sql); //運行結果集 pst.setString(1, "%"+year+"%"); ResultSet rs=pst.executeQuery(); //處理結果集 List<cost> list=new ArrayList<cost>(); while(rs.next()){ cost cost=new cost(); cost.setUsername(rs.getString("username"));//把數據庫的username的值給cost裏面的值 cost.setUsercard(rs.getString("usercard")); cost.setRoom_num(rs.getInt("room_num")); cost.setCost(rs.getDouble("sum(cost)")); list.add(cost);//最後是將封裝了四個字段的cost實體類添加到list集合中,泛型。 } //System.out.println(list); //釋放資源 JDBCUtils.close(rs, pst, conn); //返回一個list集合給前臺 return list ;
增長修改,刪除經過int值來斷定是否成功,1成功,0失敗。
//新增cost表中數據 public int addCost(UserInfo userinfo) throws SQLException{ Connection conn=JDBCUtils.getConn(); String sql="insert into cost(time,room_num,usercard,cost) values (?,?,?,?)"; PreparedStatement pst=conn.prepareStatement(sql); //佔位符賦值 pst.setString(1, userinfo.getStarttime()); pst.setInt(2, userinfo.getRoom_num()); pst.setString(3, userinfo.getUsercard()); pst.setDouble(4, userinfo.getCost()); //執行sql int row=pst.executeUpdate(); //釋放資源 JDBCUtils.close(pst, conn); return row; }
但有時有例外就是判斷查詢的內容有沒有。
如我想查詢全部未審批的有幾條信息,可是若是單純返回的我得到的是整個遍歷出來的東西,那就須要定義一個int來接收一下,while()中總共走了幾回知足數據庫代碼的次數,統計出來就是幾條未讀信息。
//統計未審批的數量 public int getBoss( ) throws SQLException{ Connection conn=JDBCUtils.getConn(); String sql="SELECT count(*) FROM jilu WHERE shenpi='0' and dengji='A'"; PreparedStatement pst=conn.prepareStatement(sql); //pst.setInt(1, shenpi); ResultSet rs=pst.executeQuery(); int count = 0; while (rs.next()) { count = rs.getInt(1); } JDBCUtils.close(rs, pst, conn); return count; }