DAO层基础设计原理

    在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图

Modle层(模型层)、View层(显示层)、Controller层(控制层)。

DAO层基础设计原理

Modle层:可以分两层,DAO层、service层,基文本功能 如下

service层:主要去负责一些业务处理,比如取得连接、关闭数据库连接、事务回滚,一些复杂的逻辑业务处理就放到service层

DAO层:负责访问数据库进行数据的操作,取得结果集,之后将结果集中的数据取出封装到VO类对象之后返回给service层

Cotroller层:叫做控制层,主要的功能是处理用户发送的请求。

View层:叫做显示层,主要是负责现实数据。

在实际开发中dao层要先定义出自己的操作标准即标准接口,就是为了解耦合。

Modle层(DAO层和service层)的设计如下。

 

DAO层基础设计原理

 

public class EmpDAOImpl implements IEmpDao{
    private Connection conn;
    private PreparedStatement pst;
    private ResultSet rst;
    public EmpDAOImpl() {
        super();
    }
    
    public EmpDAOImpl(Connection conn) {//主要目的就是为了初始化连接
        super();
        this.conn = conn;
    }

    @Override
    public int insertEmp(Emp vo) throws Exception {
        //定义出sql语句
        String sql = "INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)"
                        + "VALUES(?,?,?,?,?,?,?,?)";
        //使用连接对象取得发送sql语句的对象(PreparedStatement接口对象)
        this.pst=this.conn.prepareStatement(sql);
        //为占位符设置具体内容
        this.pst.setInt(1, vo.getEmpno());
        this.pst.setString(2, vo.getEname());
        this.pst.setString(3, vo.getJob());
        this.pst.setInt(4, vo.getMgr());
        this.pst.setDate(5, new Date(vo.getHiredate().getTime()));
        this.pst.setDouble(6, vo.getSal());
        this.pst.setDouble(7, vo.getComm());
        this.pst.setInt(8, vo.getDeptno());
        return this.pst.executeUpdate();
    }

    @Override
    public int updateEmp(Emp vo) throws Exception {
        // 准备sql语句
        String sql="UPDATE emp set ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno=?";
        //取得预编译对象
        this.pst=this.conn.prepareStatement(sql);
        //为占位符设置具体内容
        this.pst.setString(1, vo.getEname());
        this.pst.setString(2, vo.getJob());
        this.pst.setInt(3, vo.getMgr());
        this.pst.setDate(4, new Date(vo.getHiredate().getTime()));
        this.pst.setDouble(5, vo.getSal());
        this.pst.setDouble(6, vo.getComm());
        this.pst.setInt(7, vo.getDeptno());
        this.pst.setInt(8, vo.getEmpno());
        return this.pst.executeUpdate();
    }

    @Override
    public int deleteEmpById(Integer empno) throws Exception {
        String sql="delete from emp where empno=?";
        //取得预编译对象
        this.pst=this.conn.prepareStatement(sql);
        //为占位符设置具体内容
        this.pst.setInt(1, empno);
        return this.pst.executeUpdate();
    }

    @Override
    public int deleteBatch(List<Integer> empnos) throws Exception {
        StringBuffer sb= new StringBuffer("delete from emp where empno in(");
        Iterator<Integer> iter= empnos.iterator();
        while(iter.hasNext()) {
            sb.append(iter.next()+",");
        }
        sb.delete(sb.length()-1, sb.length());
        sb.append(")");
        //取得对象
        this.pst=this.conn.prepareStatement(sb+"");//为什么加""
        return this.pst.executeUpdate();
    }
    
    @Override
    public Emp selectEmpById(Integer id) throws Exception {
        String sql= "select empno,ename,job,mgr,hiredate,sal,comm,deptno"
                + " from emp where empno=?";
        //取得预编译对象
        this.pst=this.conn.prepareStatement(sql);
        //为占位符设置具体内容
        this.pst.setInt(1, id);
        //执行sql语句,取得结果集
        this.rst=this.pst.executeQuery();
        if (this.rst.next()) {
            Emp emp=new Emp(rst.getInt(1), rst.getString(2), rst.getString(3), rst.getInt(4),
                    rst.getDate(5), rst.getDouble(6), rst.getDouble(7), rst.getInt(8));
            return emp;
        }
        return null;
    }

    @Override
    public List<Emp> selectSplitAll(String kw, Integer cp, Integer ls) throws Exception {
        //创建集合
        List<Emp> listEmp=new ArrayList<Emp>();
        String sql="select empno,ename,job,mgr,hiredate,sal,comm,deptno"
                + " from emp where like ? limit ?,?";
        //使用连接对象取得发送sql语句的对象(PreparedStatement接口对象)
        PreparedStatement pst = conn.prepareStatement(sql);
        //为占位符设置具体内容
        pst.setString(1, "%"+kw+"%");
        pst.setInt(2, (cp-1)*ls);
        pst.setInt(3, ls);
        //执行sql语句,取得结果集
        rst=pst.executeQuery();
        Emp emp=null;
        while (rst.next()) {
            emp=new Emp(rst.getInt(1), rst.getString(2), rst.getString(3), rst.getInt(4),
                    rst.getDate(5), rst.getDouble(6), rst.getDouble(7), rst.getInt(8));
            listEmp.add(emp);
        }
        return listEmp;
    }

    @Override
    public int selectCount(String kw) throws Exception {
        // 准备sql语句
        String sql="select count(*) from emp where ename like ?";
        this.pst=this.conn.prepareStatement(sql);
        this.pst.setString(1, "%"+kw+"%");
        this.rst=this.pst.executeQuery();
        if (this.rst.next()) {
            return this.rst.getInt(1);
        }
        return 0;
    }

 

上一篇:STL中的map/multimap小结


下一篇:parted分区和挂载及非交互式操作