一、信息系統(tǒng)的開發(fā)架構
客戶層-------顯示層-------業(yè)務層---------數據層---------數據庫
1.客戶層:客戶層就是客戶端,簡單的來說就是瀏覽器。
2.顯示層:JSP/Servlet,用于給瀏覽器顯示。
3.業(yè)務層:對于數據層的原子操作進行整合。
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()創(chuàng)建一個Proxy類。
四、DAO的好處
DAO的好處就是提供給用戶的接口只有DAO的接口,所以如果用戶想添加數據,只需要調用create函數即可,不需要數據庫的操作。
五、DAO包命名
對于DAO,包的命名和類的命名一定要有層次。
六、實例解析
1.Emp.java
- 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
- 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
- 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
- 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
- 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
- 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
- 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只負責顯示的效果。
|