在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图
Modle层(模型层)、View层(显示层)、Controller层(控制层)。
Modle层:可以分两层,DAO层、service层,基文本功能 如下
service层:主要去负责一些业务处理,比如取得连接、关闭数据库连接、事务回滚,一些复杂的逻辑业务处理就放到service层
DAO层:负责访问数据库进行数据的操作,取得结果集,之后将结果集中的数据取出封装到VO类对象之后返回给service层
Cotroller层:叫做控制层,主要的功能是处理用户发送的请求。
View层:叫做显示层,主要是负责现实数据。
在实际开发中dao层要先定义出自己的操作标准即标准接口,就是为了解耦合。
Modle层(DAO层和service层)的设计如下。
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; }