一,DAO設計模式用於 j2ee 的數據層訪問,包括五部分,
數據庫連接類(包含數據庫的連接與關閉操作的一個類),
VO類(私有變量與數據庫表格對應,接收數據庫中表格各字段內容),
DAO接口類(包含數據庫的各項操作,增,刪,改,查函數的定義),
DAO實現類(具體實現DAO接口中定義的數據庫操作函數),
DAO工廠類(提供一個返回值為DAO接口類型的靜態方法,獲得DAO實現的實例)
以一個mysql數據庫中簡單的用戶表(userid 自增長,username,password)為例的DAO各個模塊:
1.數據庫連接類:

package com.javaweb.dao; import java.sql.*; public class DBConnection { private final String DBDRIVER = "com.mysql.jdbc.Driver"; private final String DBURL = "jdbc:mysql://localhost:3306/javaweb"; private final String USER = "root"; private final String PASSWORD = "root"; private Connection conn=null; public DBConnection() { try { Class.forName(DBDRIVER); this.conn = DriverManager.getConnection(DBURL,USER,PASSWORD); } catch (ClassNotFoundException | SQLException e) { // TODO Auto-generated catch block System.out.println("加載驅動失敗"); } } public Connection getConnection() { return this.conn; } public void close() { if(this.conn!=null) { try { this.conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block System.out.println("數據庫連接關閉失敗"); } } } }
2.VO類:

package com.javaweb.dao; public class User { private int userid; private String username; private String password; public User() { // TODO Auto-generated constructor stub } public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3.DAO接口:

package com.javaweb.dao; import java.util.List; public interface UserDAO { public void insert(User user) throws Exception; public void delete(int userid) throws Exception; public void update(User user) throws Exception; public User querryById(int userid) throws Exception; public List querryALL() throws Exception; }
4.DAO具體實現:

package com.javaweb.dao; import java.util.ArrayList; import java.util.List; import java.sql.*; public class UserDAOImpl implements UserDAO { @Override public void insert(User user) throws Exception { // TODO Auto-generated method stub DBConnection con = null; PreparedStatement pstm = null; String sql = "insert into user(username,password) values(?,?)"; try { con = new DBConnection(); pstm = con.getConnection().prepareStatement(sql); pstm.setString(1, user.getUsername()); pstm.setString(2, user.getPassword()); pstm.executeUpdate(); if (pstm != null) { pstm.close(); } } catch (Exception e) { // TODO Auto-generated catch block System.out.println("插入數據操作異常"); } finally { if (con != null) { con.close(); } } } @Override public void delete(int userid) throws Exception { // TODO Auto-generated method stub DBConnection con = null; PreparedStatement pstm = null; String sql = "delete from user where userid=?"; try { con = new DBConnection(); pstm = con.getConnection().prepareStatement(sql); pstm.setInt(1, userid); pstm.executeUpdate(); if (pstm != null) { pstm.close(); } } catch (Exception e) { // TODO Auto-generated catch block System.out.println("刪除數據操作異常"); } finally { if (con != null) { con.close(); } } } @Override public void update(User user) throws Exception { // TODO Auto-generated method stub // TODO Auto-generated method stub DBConnection con = null; PreparedStatement pstm = null; String sql = "update user set username=?,password=? where userid=?"; try { con = new DBConnection(); pstm = con.getConnection().prepareStatement(sql); pstm.setString(1, user.getUsername()); pstm.setString(2, user.getPassword()); pstm.setInt(3, user.getUserid()); pstm.executeUpdate(); if (pstm != null) { pstm.close(); } } catch (Exception e) { // TODO Auto-generated catch block System.out.println("更新數據操作異常,sql:"+sql); } finally { if (con != null) { con.close(); } } } @Override public User querryById(int userid) throws Exception { // TODO Auto-generated method stub DBConnection con = null; PreparedStatement pstm = null; ResultSet rs=null; User user=null; String sql = "select * from user where userid=?"; try { //獲取連接 con = new DBConnection(); //預處理語句 pstm = con.getConnection().prepareStatement(sql); //設置參數 pstm.setInt(1, userid); //執行查詢 rs = pstm.executeQuery(); //獲取結果 while(rs.next()) { user = new User(); user.setUserid(rs.getInt(1)); user.setUsername(rs.getString(2)); user.setPassword(rs.getString(3)); } if (pstm != null) { pstm.close(); } } catch (Exception e) { // TODO Auto-generated catch block System.out.println("查詢數據操作異常 sql:"+sql); } finally { if (con != null) { con.close(); } } return user; } @Override public List<User> querryALL() throws Exception { // TODO Auto-generated method stub DBConnection con = null; PreparedStatement pstm = null; ResultSet rs=null; List<User> lsu=new ArrayList<User>(); String sql = "select * from user"; try { //獲取連接 con = new DBConnection(); //預處理語句 pstm = con.getConnection().prepareStatement(sql); //執行查詢,返回結果rs rs = pstm.executeQuery(); //獲取結果 while(rs.next()) { User user = new User(); user.setUserid(rs.getInt(1)); user.setUsername(rs.getString(2)); user.setPassword(rs.getString(3)); lsu.add(user); } if (pstm != null) { pstm.close(); } } catch (Exception e) { // TODO Auto-generated catch block System.out.println("查詢數據操作異常"); } finally { if (con != null) { con.close(); } } return lsu; } }
5.DAO工廠(有效避免由於DAO實現改變導致的大量代碼修改)

package com.javaweb.dao; public class DAOFactory { public static UserDAO getUserDAOInstance() { return new UserDAOImpl(); } }
二,通過jsp調用相關函數即可進行數據庫操作,省去了大量重復代碼。
代碼示例:

<%@page import="com.javaweb.dao.*"%> <%@page import="org.eclipse.jdt.internal.compiler.apt.model.Factory"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <% UserDAO userDAO = DAOFactory.getUserDAOInstance(); User user=new User(); user.setUsername("lu"); user.setPassword("123"); userDAO.insert(user); %> </body> </html>