JavaBean中DAO设计方式介绍
JavaBean中DAO设计模式介绍原文地址一、信息系统的开发架构客户层-------显示层-------业务层---------数据
JavaBean中DAO设计模式介绍
原文地址
一、信息系统的开发架构
客户层-------显示层-------业务层---------数据层---------数据库
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
?
[java] view plaincopy
- package?org.vo;??import?java.util.*;??
- public?class?Emp{??????private?int?empno;??
- ????private?String?ename;??????private?String?job;??
- ????private?Date?hireDate;??????private?float?sal;??
- ????public?Emp(){????????????
- ????}??????public?int?getEmpno(){??
- ????????return?empno;??????}??
- ????public?void?setEmpno(int?empno){??????????this.empno?=?empno;??
- ????}??????public?String?getEname(){??
- ????????return?ename;??????}??
- ????public?void?setEname(String?ename){??????????this.ename?=?ename;??
- ????}??????public?Date?getHireDate(){??
- ????????return?hireDate;??????}??
- ????public?void?setHireDate(Date?hireDate){??????????this.hireDate?=?hireDate;??
- ????}??????public?float?getSal(){??
- ????????return?sal;??????}??
- ????public?void?setSal(float?sal){??????????this.sal?=?sal;??
- ????}??????public?String?getJob(){??
- ????????return?job;??????}??
- ????public?void?setJob(String?job){??????????this.job?=?job;??
- ????}??}??
2.DatabaseConnection.java
[java] view plaincopy
- package?org.dbc;??import?java.sql.*;??
- public?class?DatabaseConnection{??????private?Connection?con?=?null;??
- ????private?static?final?String?DRIVER?=?"com.mysql.jdbc.Driver";??????private?static?final?String?USER?=?"root";??
- ????private?static?final?String?URL?=?"jdbc:mysql://localhost:3306/mldn";??????private?static?final?String?PASS?=?"12345";??
- ????public?DatabaseConnection()throws?Exception{??????????Class.forName(DRIVER);??
- ????????con?=?DriverManager.getConnection(URL,USER,PASS);??????}??
- ????public?Connection?getConnection()throws?Exception{??????????return?con;??
- ????}??????public?void?close()throws?Exception{??
- ????????if(con!=null){??????????????con.close();??
- ????????}??????}??
- }??
3.IEmpDAO.java
[java] view plaincopy
- package?org.dao;??import?java.util.List;??
- import?org.vo.*;??public?interface?IEmpDAO{??
- ????public?boolean?doCreate(Emp?emp)throws?Exception;??????public?List<Emp>?findAll()throws?Exception;??
- ????public?Emp?findById(int?empno)throws?Exception;??}??
4.EmpDAOImpl.java
[java] view plaincopy
- package?org.dao.impl;??import?org.dao.*;??
- import?java.sql.*;??import?org.vo.*;??
- import?java.util.*;??public?class?EmpDAOImpl?implements?IEmpDAO{??
- ????private?Connection?con;??????private?PreparedStatement?stat?=?null;??
- ????public?EmpDAOImpl(Connection?con){??????????this.con?=?con;??
- ????}??????public?boolean?doCreate(Emp?emp)throws?Exception{??
- ????????String?sql?=?"INSERT?INTO?emp(empno,ename,job,hiredate,sal)?VALUES(?,?,?,?,?)";??????????stat?=?con.prepareStatement(sql);??
- ????????stat.setInt(1,emp.getEmpno());??????????stat.setString(2,emp.getEname());??
- ????????stat.setString(3,emp.getJob());??????????stat.setDate(4,new?java.sql.Date(emp.getHireDate().getTime()));??
- ????????stat.setFloat(5,emp.getSal());??????????int?update?=?stat.executeUpdate();??
- ????????if(update>0){??????????????return?true;??
- ????????}??????????else{??
- ????????????return?false;??????????}??
- ????}??????public?List<Emp>?findAll()throws?Exception{??
- ????????String?sql?=?"SELECT?empno,ename,job,hiredate,sal?FROM?emp";??????????stat?=?con.prepareStatement(sql);??
- ????????ResultSet?rs?=?stat.executeQuery();??????????Emp?emp?=?null;??
- ????????List<Emp>?list?=?new?ArrayList<Emp>();??????????while(rs.next()){??
- ????????????int?empno?=?rs.getInt(1);??????????????String?ename?=?rs.getString(2);??
- ????????????String?job?=?rs.getString(3);??????????????float?sal?=?rs.getFloat(5);??
- ????????????emp?=?new?Emp();??????????????emp.setEmpno(empno);??
- ????????????emp.setEname(ename);??????????????emp.setJob(job);??
- ????????????emp.setHireDate(rs.getDate(4));??????????????emp.setSal(sal);??
- ????????????list.add(emp);??????????}??
- ????????return?list;??????}??
- ????public?Emp?findById(int?empno)throws?Exception{??????????String?sql?=?"SELECT?empno,ename,job,hiredate,sal?FROM?emp?WHERE?empno=?";??
- ????????stat?=?con.prepareStatement(sql);??????????stat.setInt(1,empno);??
- ????????ResultSet?rs?=?stat.executeQuery();??????????Emp?emp?=?null;??
- ????????if(rs.next()){??????????????String?ename?=?rs.getString(2);??
- ????????????String?job?=?rs.getString(3);??????????????float?sal?=?rs.getFloat(5);??
- ????????????emp?=?new?Emp();??????????????emp.setEmpno(empno);??
- ????????????emp.setEname(ename);??????????????emp.setJob(job);??
- ????????????emp.setHireDate(rs.getDate(4));??????????????emp.setSal(sal);??
- ????????}??????????return?emp;??
- ????}??}??
5.EmpDAOProxy.java
[java] view plaincopy
- package?org.dao.impl;??import?org.dao.*;??
- import?java.sql.*;??import?org.vo.*;??
- import?java.util.*;??import?org.dbc.*;??
- public?class?EmpDAOProxy?implements?IEmpDAO{??????private?DatabaseConnection?dbc;??
- ????private?IEmpDAO?dao?=?null;??????public?EmpDAOProxy()throws?Exception{??
- ????????dbc?=?new?DatabaseConnection();??????????dao?=?new?EmpDAOImpl(dbc.getConnection());??
- ????}??????public?boolean?doCreate(Emp?emp)throws?Exception{??
- ????????boolean?flag?=?false;??????????if(dao.findById(emp.getEmpno())==null){??
- ????????????flag?=?dao.doCreate(emp);??????????}??
- ????????dbc.close();??????????return?flag;??
- ????}??????public?List<Emp>?findAll()throws?Exception{??
- ????????List<Emp>list?=?dao.findAll();??????????dbc.close();??
- ????????return?list;??????}??
- ????public?Emp?findById(int?empno)throws?Exception{??????????Emp?emp?=?dao.findById(empno);??
- ????????dbc.close();??????????return?emp;??
- ????}??}??
6.DAOFactory.java
[java] view plaincopy
- package?org.dao.factory;??import?org.dao.*;??
- import?java.sql.*;??import?org.vo.*;??
- import?java.util.*;??import?org.dbc.*;??
- import?org.dao.impl.*;??public?class?DAOFactory{??
- ????public?static?IEmpDAO?getInstance(){??????????IEmpDAO?dao?=?null;??
- ????????try{??????????????dao?=?new?EmpDAOProxy();??????
- ????????}??????????catch(Exception?e){??
- ????????????e.printStackTrace();??????????}??
- ????????return?dao;??????}??
- }??
7.TestDAO.java
[java] view plaincopy
- package?org.dao.test;??import?org.dao.factory.*;??
- import?org.vo.*;??import?org.dao.*;??
- public?class?TestDAO{??????public?static?void?main(String?args[])throws?Exception{??
- ????????Emp?emp?=?null;??????????for(int?i=0;i<5;i++){??
- ????????????emp?=?new?Emp();??????????????emp.setEmpno(i);??
- ????????????emp.setEname("xiazdong-"+i);??????????????emp.setJob("stu-"+i);??
- ????????????emp.setHireDate(new?java.util.Date());??????????????emp.setSal(500*i);??
- ????????????DAOFactory.getInstance().doCreate(emp);??????????}??
- ????}??}??
通过DAO设计模式,可以在JSP中屏蔽了数据库连接的操作,达到JSP只负责显示的效果。