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

    }

}

 

转载于:https://www.cnblogs.com/qinchangchuan/p/10732164.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会根据您的要求回答您的问题。首先,我需要说明一下,我是一个语言模型,无法直接编写代码,但我可以为您提供思路和指导。 针对您的问题,首先需要在pom.xml文件中添加Spring JdbcTemplate的依赖,然后创建ICustomerDao接口和CustomerDaoImpl.java实现类,以及ICustomerService接口和CustomerServiceImpl.java实现类。在实现类中,需要使用JdbcTemplate来操作数据库。 接下来,需要使用Spring的注解方式,将实现类加入到Spring容器中,例如在实现类上添加@Service注解。 最后,可以使用JUnit4框架进行测试,创建一个测试类Application.java,通过ICustomerService接口类对象,进行所有功能调用测试测试用例如下: ```java @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:spring.xml" }) public class Application { @Autowired private ICustomerService customerService; @Test public void testRegister() { Customer customer = new Customer(); customer.setName("孙满江"); customer.setPassword("sun990"); customer.setPhone("67887565"); // 其他信息自定 customerService.register(customer); } @Test public void testGetCustomer() { String name = "孙满江"; Customer customer = customerService.getCustomer(name); System.out.println(customer); } @Test public void testUpdateCustomer() { String name = "孙满江"; Customer customer = customerService.getCustomer(name); customer.setPhone("68887566"); customer.setDepartment("财务部"); customerService.updateCustomer(customer); System.out.println(customer); } @Test public void testRegister2() { Customer customer = new Customer(); customer.setName("王小江"); customer.setPassword("wang990"); customer.setPhone("67887565"); // 其他信息自定 customerService.register(customer); } @Test public void testGetAllCustomers() { List<Customer> customers = customerService.getAllCustomers(); for (Customer customer : customers) { System.out.println(customer); } } @Test public void testLogin() { String name = "孙满江"; String password = "sun990"; boolean result = customerService.login(name, password); if (result) { System.out.println("欢迎," + name); } else { System.out.println("登录失败,用户名或密码错误"); } } @Test public void testDeleteCustomer() { String name = "孙满江"; customerService.deleteCustomer(name); Customer customer = customerService.getCustomer(name); System.out.println(customer == null ? "删除成功" : "删除失败"); } @Test public void testCountCustomers() { String prefix = "苏州"; int count = customerService.countCustomers(prefix); System.out.println("以“苏州”开头公司客户数:" + count); } } ``` 以上代码仅供参考,具体实现需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值