DAO層的設計:
在實際的開發中有一種項目的程序組織架構方案叫做MVC模式。
MVC模式就是按照程序的功能將它們分成三層,分別是Modle層
(模型層)、View(顯示層)、Controller(控制層)。
Modle層:Modle層又可以細分為兩層,分別是dao層、service層。
這兩層的主要功能如下:
service層:主要負責一些業務處理,比如取得連接、關閉數據庫連接、事
務回滾或者一些復雜的邏輯業務處理放到 service 。
代碼示例如下:
package com.gojong.scc.service; import com.gojong.scc.vo.Emp; public interface IEmpService { /** * 實現數據的增加 調用dao層的insert() 方法 * * @param vo 包含了要插入的數據的vo對象 * @return 成功返回 true 否則返回 false */ public boolean addEmp(Emp vo) throws Exception; /** * 根據編號刪除數據 調用dao層的 deleteById()方法 * * @param id 要刪除的數據的編號 * @return 成功返回 true 否則返回 false */ public boolean removeEmpById(Integer id) throws Exception; /** * 修改數 調用dao層的 update()方法 * * @param vo 保存了要修改的數據的vo對象 * @return 成功返回 true 否則返回 false */ public boolean editEmp(Emp vo) throws Exception; /** * 根據編號查詢的數據的編號 * * @param id 要查詢的數據的編號 * @return 有數據返回 Emp 對象 否則返回null */ public Emp findEmpById(Integer id) throws Exception; /** * 實現模糊分頁查詢,調用的dao層的方法 * <li>調用 selectSplitAll(),取得的 雇員信息的集合</li> * <li>調用 selectCount(),取得查詢到的數據量 * * @param kw 模糊查詢關鍵字 * @param cp 當前頁 * @param ls 每頁顯示的數據量 * @return 保存雇員集合與數據量的Map對象 */ public java.util.Map<String, Object> findAllSplit(String kw, Integer cp, Integer ls) throws Exception; }
dao層:負責訪問數據庫進行數據的操作,取得結果集,之后將結果集中的數據取出封裝到VO類對象之后返回給service 層。dao層需要自己的接口是為了了解耦合
示例代碼如下:
package com.gojong.scc.dao.impl; import java.sql.Connection; import java.util.List; import java.util.Set; import com.gojong.scc.dao.IEmpDao; import com.gojong.scc.util.DBUtil; import com.gojong.scc.vo.Emp; public class EmpDaoImpl implements IEmpDao { private Connection conn; public EmpDaoImpl() { } public EmpDaoImpl(Connection conn) { this.conn = conn; } @Override public int selectCount(String kw) throws Exception { String sql = "SELECT COUNT(*)" + "FROM emp" + " WHERE ename LIKE ?"; return DBUtil.selectCount(conn, sql, "%" + kw + "%"); } @Override public int deleteBatch(Set<Integer> ids) throws Exception { StringBuffer sql = new StringBuffer("DELETE FROM emp WHERE empno IN("); return DBUtil.remove(conn, sql, ids); } @Override public int insert(Emp vo) throws Exception { // 准備sql 語句 String sql = "INSERT INTO emp(ename,job,sal,comm,mgr,hiredate,deptno,empno) VALUES(?,?,?,?,?,?,?,?)"; return DBUtil.save(conn, sql, vo, false); } @Override public int deleteById(Integer empno) throws Exception { // 准備sql 語句 String sql = "DELETE FROM emp WHERE empno=?"; return DBUtil.edit(conn, sql, empno); } @Override public int update(Emp vo) throws Exception { // 准備sql 語句 String sql = " UPDATE emp SET ename=?,job=?,sal=?,comm=?,mgr=?,hiredate=?,deptno=? WHERE empno=?"; return DBUtil.edit(conn, sql, vo); } @Override public Emp selectById(Integer id) throws Exception { String sql = "SELECT empno,ename,job,sal,hiredate,mgr,comm,deptno" + " FROM emp" + "WHERE empno=?"; return DBUtil.selectOne(conn, sql, Emp.class, id); } @Override public List<Emp> selectSplitAll(String kw, Integer cp, Integer ls) throws Exception { String sql = " SELECT empno,ename,job,sal,hiredate,mgr,comm,deptno" + " FROM emp" + " WHERE ename LIKE ? LIMIT ?,?"; return DBUtil.selectList(conn, sql, Emp.class,"%"+kw+"%" , (cp-1)*ls, ls); } }
dao層需要自己的接口是為了了解耦合
Controller層:叫做控制層,主要的功能是處理用戶發送的請求。
示例代碼如下:
package com.gojong.scc.controller; import java.sql.Connection; import com.alibaba.druid.pool.DruidDataSource; public class Druidcontroller { //實例化一個數據源對象 private static DruidDataSource dataSource=new DruidDataSource(); static { //配置連接池 dataSource.setUrl("jdbc:mysql://localhost:3306/deom?useSSL=true&useUnicode=true&characterEncoding=UTF-8"); //用戶名 dataSource.setUsername("root"); //密碼 dataSource.setPassword("1234"); //驅動地址 dataSource.setDriverClassName("com.mysql.Driver"); //初始化連接池大小 dataSource.setInitialSize(15); //連接池最大使用連接數量 dataSource.setMaxActive(25); //獲取連接最大等待時間 dataSource.setMaxWait(3000); } /** * 此時的連接是從連接池中獲取 * @return */ public static Connection getConnection() { try { return dataSource.getConnection(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 關閉連接的方法 * @param conn 要關閉的連接 */ public static void close(Connection conn) { if (conn!= null) { try { //會將間接回收到連接池中 conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
View層:叫做顯示層,主要是負責事項數據。
示例代碼如下:
package com.gojong.scc.vo; import java.io.Serializable; import java.util.Date; public class Emp implements Serializable{ private Integer empno; private String ename; private String job; private Integer mgr; private Date hiredate; private Double sal; private Double comm; private Integer deptno; public Double getComm() { return comm; } public Integer getDeptno() { return deptno; } public Integer getEmpno() { return empno; } public String getEname() { return ename; } public Date getHiredate() { return hiredate; } public String getJob() { return job; } public Integer getMgr() { return mgr; } public Double getSal() { return sal; } public void setComm(Double comm) { this.comm = comm; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public void setEmpno(Integer empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public void setJob(String job) { this.job = job; } public void setMgr(Integer mgr) { this.mgr = mgr; } public void setSal(Double sal) { this.sal = sal; } public Emp() { super(); } public Emp(Integer empno, String ename, String job, Integer mgr, Date hiredate, Double sal, Double comm, Integer deptno) { super(); this.empno = empno; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; this.deptno = deptno; } @Override public String toString() { return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal=" + sal + ", comm=" + comm + ", deptno=" + deptno + "]"; } }
Junit測試:
Junit測試又叫做單元測試,Junit測試的好處是能進行批量測試,而且如果
方法出現了問題能立刻定位出出現問題的方法,還有一個好處就是感官效果
很好,如果所有方法都通過了則顯示綠條(Green bar),否則顯示紅條(Red bar)。
package com.gojong.scc.controller; import java.sql.Connection; import com.alibaba.druid.pool.DruidDataSource; public class Druidcontroller { // 實例化一個數據源對象 private static DruidDataSource dataSource = new DruidDataSource(); static { // 配置連接池 dataSource.setUrl("jdbc:mysql://localhost:3306/deom?useSSL=true&useUnicode=true&characterEncoding=UTF-8"); // 用戶名 dataSource.setUsername("root"); // 密碼 dataSource.setPassword("1234"); // 驅動地址 dataSource.setDriverClassName("com.mysql.Driver"); // 初始化連接池大小 dataSource.setInitialSize(15); // 連接池最大使用連接數量 dataSource.setMaxActive(25); // 獲取連接最大等待時間 dataSource.setMaxWait(3000); } /** * 此時的連接是從連接池中獲取 * * @return */ public static Connection getConnection() { try { return dataSource.getConnection(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 關閉連接的方法 * * @param conn 要關閉的連接 */ public static void close(Connection conn) { if (conn != null) { try { // 會將間接回收到連接池中 conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }