DAO層設計Junit測試


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();
            }
        }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM