一、信息系统的开发架构
客户层-------显示层-------业务层---------数据层---------数据库
1.客户层:客户层就是客户端,简单的来说就是浏览器。
2.显示层:JSP/Servlet,用于给浏览器显示。
3.业务层:对于数据层的原子操作进行整合。
4.数据层:对于数据库进行的原子操作,增加、删除等;
二、DAO(Data Access Object)介绍
DAO应用在数据层那块,用于访问数据库,对数据库进行操作的类。
三、DAO设计模式的结构
DAO设计模式一般分为几个类:
1.VO(Value Object):一个用于存放网页的一行数据即一条记录的类,比如网页要显示一个用户的信息,则这个类就是用户的类。
2.DatabaseConnection:用于打开和关闭数据库。
3.DAO接口:用于声明对于数据库的操作。
4.DAOImpl:必须实现DAO接口,真实实现DAO接口的函数,但是不包括数据库的打开和关闭。
5.DAOProxy:也是实现DAO接口,但是只需要借助DAOImpl即可,但是包括数据库的打开和关闭。
6.DAOFactory:工厂类,含有getInstance()创建一个Proxy类。
四、DAO的好处
DAO的好处就是提供给用户的接口只有DAO的接口,所以如果用户想添加数据,只需要调用create函数即可,不需要数据库的操作。
五、DAO包命名
对于DAO,包的命名和类的命名一定要有层次。
六、实例解析
1.Emp.java
1 package org.vo; 2 import java.util.*; 3 public class Emp{ 4 private int empno; 5 private String ename; 6 private String job; 7 private Date hireDate; 8 private float sal; 9 public Emp(){10 11 }12 public int getEmpno(){13 return empno;14 }15 public void setEmpno(int empno){16 this.empno = empno;17 }18 public String getEname(){19 return ename;20 }21 public void setEname(String ename){22 this.ename = ename;23 }24 public Date getHireDate(){25 return hireDate;26 }27 public void setHireDate(Date hireDate){28 this.hireDate = hireDate;29 }30 public float getSal(){31 return sal;32 }33 public void setSal(float sal){34 this.sal = sal;35 }36 public String getJob(){37 return job;38 }39 public void setJob(String job){40 this.job = job;41 }42 }
2.DatabaseConnection.java
1 package org.dbc; 2 import java.sql.*; 3 public class DatabaseConnection{ 4 private Connection con = null; 5 private static final String DRIVER = "com.mysql.jdbc.Driver"; 6 private static final String USER = "root"; 7 private static final String URL = "jdbc:mysql://localhost:3306/mldn"; 8 private static final String PASS = "12345"; 9 public DatabaseConnection()throws Exception{10 Class.forName(DRIVER);11 con = DriverManager.getConnection(URL,USER,PASS);12 }13 public Connection getConnection()throws Exception{14 return con;15 }16 public void close()throws Exception{17 if(con!=null){18 con.close();19 }20 }21 }
3.IEmpDAO.java
1 package org.dao;2 import java.util.List;3 import org.vo.*;4 public interface IEmpDAO{5 public boolean doCreate(Emp emp)throws Exception;6 public ListfindAll()throws Exception;7 public Emp findById(int empno)throws Exception;8 }
4.EmpDAOImpl.java
1 package org.dao.impl; 2 import org.dao.*; 3 import java.sql.*; 4 import org.vo.*; 5 import java.util.*; 6 public class EmpDAOImpl implements IEmpDAO{ 7 private Connection con; 8 private PreparedStatement stat = null; 9 public EmpDAOImpl(Connection con){10 this.con = con;11 }12 public boolean doCreate(Emp emp)throws Exception{13 String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(?,?,?,?,?)";14 stat = con.prepareStatement(sql);15 stat.setInt(1,emp.getEmpno());16 stat.setString(2,emp.getEname());17 stat.setString(3,emp.getJob());18 stat.setDate(4,new java.sql.Date(emp.getHireDate().getTime()));19 stat.setFloat(5,emp.getSal());20 int update = stat.executeUpdate();21 if(update>0){22 return true;23 }24 else{25 return false;26 }27 }28 public ListfindAll()throws Exception{29 String sql = "SELECT empno,ename,job,hiredate,sal FROM emp";30 stat = con.prepareStatement(sql);31 ResultSet rs = stat.executeQuery();32 Emp emp = null;33 List list = new ArrayList ();34 while(rs.next()){35 int empno = rs.getInt(1);36 String ename = rs.getString(2);37 String job = rs.getString(3);38 float sal = rs.getFloat(5);39 emp = new Emp();40 emp.setEmpno(empno);41 emp.setEname(ename);42 emp.setJob(job);43 emp.setHireDate(rs.getDate(4));44 emp.setSal(sal);45 list.add(emp);46 }47 return list;48 }49 public Emp findById(int empno)throws Exception{50 String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?";51 stat = con.prepareStatement(sql);52 stat.setInt(1,empno);53 ResultSet rs = stat.executeQuery();54 Emp emp = null;55 if(rs.next()){56 String ename = rs.getString(2);57 String job = rs.getString(3);58 float sal = rs.getFloat(5);59 emp = new Emp();60 emp.setEmpno(empno);61 emp.setEname(ename);62 emp.setJob(job);63 emp.setHireDate(rs.getDate(4));64 emp.setSal(sal);65 }66 return emp;67 }68 }
5.EmpDAOProxy.java
1 package org.dao.impl; 2 import org.dao.*; 3 import java.sql.*; 4 import org.vo.*; 5 import java.util.*; 6 import org.dbc.*; 7 public class EmpDAOProxy implements IEmpDAO{ 8 private DatabaseConnection dbc; 9 private IEmpDAO dao = null;10 public EmpDAOProxy()throws Exception{11 dbc = new DatabaseConnection();12 dao = new EmpDAOImpl(dbc.getConnection());13 }14 public boolean doCreate(Emp emp)throws Exception{15 boolean flag = false;16 if(dao.findById(emp.getEmpno())==null){17 flag = dao.doCreate(emp);18 }19 dbc.close();20 return flag;21 }22 public ListfindAll()throws Exception{23 List list = dao.findAll();24 dbc.close();25 return list;26 }27 public Emp findById(int empno)throws Exception{28 Emp emp = dao.findById(empno);29 dbc.close();30 return emp;31 }32 }
6.DAOFactory.java
1 package org.dao.factory; 2 import org.dao.*; 3 import java.sql.*; 4 import org.vo.*; 5 import java.util.*; 6 import org.dbc.*; 7 import org.dao.impl.*; 8 public class DAOFactory{ 9 public static IEmpDAO getInstance(){10 IEmpDAO dao = null;11 try{12 dao = new EmpDAOProxy(); 13 }14 catch(Exception e){15 e.printStackTrace();16 }17 return dao;18 }19 }
7.TestDAO.java
1 package org.dao.test; 2 import org.dao.factory.*; 3 import org.vo.*; 4 import org.dao.*; 5 public class TestDAO{ 6 public static void main(String args[])throws Exception{ 7 Emp emp = null; 8 for(int i=0;i<5;i++){ 9 emp = new Emp();10 emp.setEmpno(i);11 emp.setEname("xiazdong-"+i);12 emp.setJob("stu-"+i);13 emp.setHireDate(new java.util.Date());14 emp.setSal(500*i);15 DAOFactory.getInstance().doCreate(emp);16 }17 }18 }
通过DAO设计模式,可以在JSP中屏蔽了数据库连接的操作,达到JSP只负责显示的效果。