DAO设计模式总结
1.DAO(Data Access Object,數(shù)據(jù)訪問對象),主要的功能是用于進行數(shù)據(jù)操作的,在程序的標準開發(fā)框架中屬于數(shù)據(jù)層的操作。
數(shù)據(jù)開發(fā)結(jié)構(gòu)流程:
資源層是數(shù)據(jù)庫的操作層,里面可以進行各種數(shù)據(jù)庫的存儲,但是這些數(shù)據(jù)存儲的時候肯定是依靠SQL語句,數(shù)據(jù)層通過一個專門的數(shù)據(jù)庫組件完成對數(shù)據(jù)庫的操作
業(yè)務(wù)層是整個項目的核心
2.DAO組成結(jié)構(gòu):
- DatabaseConnection:專門負責數(shù)據(jù)庫打開與關(guān)閉操作的類。
- VO:主要由屬性,setter, getter方法組成,VO類中的屬性與表中的字段相對應(yīng),每一個VO類的對象都表示表中的每一條記錄。
- DAO:主要定義操作的接口,定義一系列數(shù)據(jù)庫的原子性操作,例如增刪改查等。
- Impl: DAO接口的真實實現(xiàn)類,主要完成具體數(shù)據(jù)庫操作,但不負責數(shù)據(jù)庫的打開和關(guān)閉。
- Proxy:代理實現(xiàn)類,主要完成數(shù)據(jù)庫的打開和關(guān)閉并且調(diào)用真實實現(xiàn)類對象的操作。
- Factory: 工廠類,通過工廠類取得一個DAO的實例化對象。
3.對于包的命名:
- 數(shù)據(jù)庫連接: xxx.dbc.DatabaseConnection
- DAO接口: xxx.dao.IXxxDAO
- DAO接口真實實現(xiàn)類:xxx.dao.impl.XxxDAOImpl
- DAO接口代理實現(xiàn)類:xxx.dao.proxy.XxxDAOProxy
- VO類: xxx.vo.Xxx, VO命名要與表的命名一致
- 工廠類:xxx.factory.DAOFactory.
4.DAO開發(fā):
4.1數(shù)據(jù)庫腳本如下:
create database DAO create table Login(
UserID varchar(30) primary key,
name varchar(30),
password varchar(15)
); INSERT INTO login(UserID, name, password)VALUES('admin', 'admin', 'admin'); select * from login
4.2定義VO類,VO類有數(shù)據(jù)的屬性以及setter,getter方法,代碼如下:
package org.lxh.VO;
public class voDemo {
private String userid;
private String name;
private String password;
public void setUserid(String userid){
this.userid=userid;
}
public void setName(String name){
this.name=name;
}
public void setPassword(String password){
this.password=password;
}
public String getUserid(){
return this.userid;
}
public String getName(){
return this.name;
}
public String getPassword(){
return this.password;
}
}
4.3實現(xiàn)DateBaseConnection類,代碼如下:
package org.lxh.dbc; import java.sql.Connection;
import java.sql.DriverManager;
public class DateBaseConnection {
private static final String DBDRIVER=
"com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQLserver數(shù)據(jù)庫引擎
private static final String DBURL=
"jdbc:sqlserver://127.0.0.1:1433;DatabaseName=DAO";//數(shù)據(jù)源
private static final String DBUER="sa";//SQLserver數(shù)據(jù)庫用戶名
private static final String DBPASSWORD="123";//SQLserver登錄密碼
private Connection conn=null; //聲明數(shù)據(jù)庫連接對象
public DateBaseConnection() throws Exception{//在構(gòu)造方法中連接數(shù)據(jù)庫
Class.forName(DBDRIVER); //加載驅(qū)動程序
this.conn=DriverManager.getConnection(DBURL,DBUER,DBPASSWORD);//連接數(shù)據(jù)庫
}
public Connection getConnection(){//取得數(shù)據(jù)庫的連接
return this.conn;
}
public void close() throws Exception{//數(shù)據(jù)庫的關(guān)閉操作
if(this.conn!=null){
try{
this.conn.close();//數(shù)據(jù)庫關(guān)閉
System.out.println("數(shù)據(jù)庫連接成功");
}catch(Exception e){
throw e;
}
System.out.println("數(shù)據(jù)庫連接失敗");
}
}
}
4.4定義DAO操作接口,代碼如下:
package org.lxh.dao;
import org.lxh.VO.voDemo;
public interface IvoDemo {
//驗證登錄,有異常交給被調(diào)處處理
public boolean findLogin(voDemo vodemo) throws Exception;
}
4.5定義實現(xiàn)DAO接口類操作,代碼如下:
package org.lxh.dao.impl; import java.sql.*; import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
/**
*
* DAO實現(xiàn)類,實現(xiàn)方法,但不負責數(shù)據(jù)庫的具體連接 ,真實主題實現(xiàn)類
*
*/
public class voDemoDAOImpl implements IvoDemo{
private Connection conn = null; //定義數(shù)據(jù)庫的連接對象
private PreparedStatement pstmt = null; //定義數(shù)據(jù)庫操作對象
public voDemoDAOImpl(Connection conn){ // 構(gòu)造方法,設(shè)置數(shù)據(jù)庫連接
this.conn = conn;
}
/**
* 具體操作方法:查詢 ,覆寫DAO接口類
*/
public boolean findLogin(voDemo vodemo) throws Exception{
boolean flag = false; //定義標志位
try{
String sql = "SELECT name FROM Login WHERE UserID = ? AND password = ?";
this.pstmt = this.conn.prepareStatement(sql); // 實例化操作
this.pstmt.setString(1, vodemo.getUserid()); // 設(shè)置用戶id
this.pstmt.setString(2, vodemo.getPassword()); // 設(shè)置password
ResultSet rs = this.pstmt.executeQuery(); // 取得查詢結(jié)果
if(rs.next()){
vodemo.setName(rs.getString(1)); //取得姓名
flag = true;
}
}catch(Exception e){
throw e;
}
return flag;
}
}
4.6定義代理主題實現(xiàn)類,代碼如下;
package org.lxh.dao.Proxy; import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
import org.lxh.dao.impl.voDemoDAOImpl;
import org.lxh.dbc.DateBaseConnection; public class voDemoDAOProxy implements IvoDemo {
private DateBaseConnection dbc = null;
private IvoDemo dao = null;
public voDemoDAOProxy() { //構(gòu)造方法,實例化連接,同時實例化dao對象
try {
this.dbc = new DateBaseConnection(); // 連接數(shù)據(jù)庫
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.dao = new voDemoDAOImpl(this.dbc.getConnection()); //實例化真實主題類
}
public boolean findLogin(voDemo vodemo) throws Exception{ // 實現(xiàn)接口中的方法。
boolean flag = false; //定義標志位
try{
flag = this.dao.findLogin(vodemo); // 調(diào)用真實主題
}catch(Exception e){
throw e; //向上拋出異常
}finally{
this.dbc.close();
}
return flag; //返回標記
} }
4.7DAO工廠實現(xiàn)類操作,代碼如下:
package org.lxh.factory; import org.lxh.dao.IvoDemo;
import org.lxh.dao.Proxy.voDemoDAOProxy; public class DAOFactory {
public static IvoDemo getIvoDemoDAOInstance() throws Exception{
return new voDemoDAOProxy();
}
}
4.8定義servlet類操作,代碼如下:
package org.lxh.servlet; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.lxh.VO.voDemo;
import org.lxh.factory.DAOFactory; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String path = "login.jsp";
String userid = request.getParameter("userid"); //接收userid的內(nèi)容
String userpass = request.getParameter("userpass"); //接收userpass的內(nèi)容
List<String> info = new ArrayList<String>(); // 保存返回信息
//判斷輸入為空的情況
if(userid == null || "".equals(userid)){
info.add("用戶id不能為空");
}
if(userpass == null || "".equals(userpass)){
info.add("密碼不能為空");
}
//用戶名密碼驗證通過
if(info.size() == 0){
voDemo vodemo = new voDemo(); //實例化vo
vodemo.setUserid(userid); //設(shè)置userid
vodemo.setPassword(userpass); //設(shè)置userpass
try {
if(DAOFactory.getIvoDemoDAOInstance().findLogin(vodemo)){ //驗證通過
info.add("通過驗證" + vodemo.getName() + "已登錄");
}else{
info.add("登錄失敗");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
request.setAttribute("info", info);
request.getRequestDispatcher(path).forward(request, response); //跳轉(zhuǎn)
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response); // 調(diào)用doGet操作
} }
4.9定義JSP顯示頁面,代碼如下:
<%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%> <html>
<head> <title>www.thystar.com</title>
<script language = "JavaScript"> function validate(f){
if(!(/^\w{1,15}$/.test(f.userid.value))){
alert("用戶ID必須是1~15位");
f.userid.focus();
return false;
}
if(!(/^\w{1,15}$/.test(f.userpass.value))){
alert("密碼必須是1~15位");
f.userpass.focus();
return false;
}
return true;
}
</script> </head> <body>
<h2>用戶登錄</h2>
<%
request.setCharacterEncoding("GBK");
%>
<%
List<String> info=(List<String>)request.getAttribute("info");
if(info != null){
Iterator<String> iter = info.iterator();
while(iter.hasNext()){
%>
<h4><%= iter.next() %></h4>
<%
}
}
%>
<form action="LoginServlet" method="post" onSubmit = "validate(this)"> 用戶ID: <input type = "text" name = "userid"><br>
密 碼:<input type = "password" name="userpass"><br>
<input type = "submit" value = "登錄">
<input type = "reset" value = "重置">
</form>
</body>
</html>
實現(xiàn)代碼圖:
總結(jié)
- 上一篇: redis之Set(有序)类型常用方法总
- 下一篇: JavaFX 之窗口跳转(一)