DAO(資料訪問物件)
程式的標準架構為:
客戶層(Client)-> 顯示層(jsp/servlet)-> 業務層(BO) -> 資料層(BAO) -> 資源層(DataBase)
專案Gitee地址:https://gitee.com/hcflyambation/daoproject
1,組成部分(Java命名規范)
- 1,DatabaseConnection: 專門負責資料庫打開和關閉操作的類;(xxx.dbc.DatabaseConnection)
- 2,VO:主要由屬性、setter、geter組成,VO類中的屬性與表中的欄位相對應,(xxx.vo.Xxx)
- 3,DAO: 主要定義操作的介面,定義一系列的資料庫的原子性操作,如,增刪改查,(xxx.dao.XxxDAO)
- 4,Impl:DAO介面的真實實作類,完成具體的資料庫操作,但是不負責資料庫的打開和關閉,(xxx.dao.impl.XxxDAOImpl)
- 5,Proxy:代理實作類,主要完成資料庫的打開和關閉,并且呼叫真實實作類物件的操作,(xxx.dao.proxy.XxxDAOProxy)
- 6,Factory:工廠類,通過工廠類獲得一個DAO的實體化物件,(xxx.factory.DAOFactory)
2,DAO的實體開發
專案結構:
特別要注意的是:當啟動web程式時,請將依賴的jar(postgresql-42.2.19.jar放入WEB-INF/lib/下,不然會檢測不到)
JAR必須直接放在web專案的/ WEB-INF / lib檔案夾中,而不用專案屬性中的Build Path.該檔案夾是webapp運行時類路徑的標準部分
2.1,資料庫腳本建立(使用PostgreSQL)
資料庫名為:jsp
create table emp (
empno int primary key,
ename varchar(10),
job varchar(9),
hiredate date,
sal decimal
);
2.2,撰寫與資料庫對應的OV類(Emp.java)
package com.hcfly.vo;
import java.math.BigDecimal;
import java.util.Date;
public class Emp {
private int empno;
private String ename;
private String job;
private Date hiredate;
private float sal;
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 String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
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;
}
}
2.3, 撰寫資料庫連接類(DatabaseConnection.java)
這個地方可以將DatabaseConnection抽象為一個介面,并且用不同的資料庫訪問類去實作它,來達到通用的水平,
package com.hcfly.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
public class DatabaseConnection {
// 資料庫連接類
private static final String DBDRIVER = "org.postgresql.Driver";
private static final String DBURL = "jdbc:postgresql://localhost/jsp";
private static final String DBUSER = "postgres";
private static final String DBPASSWORD = "miaomiao";
private Connection connection = null;
public DatabaseConnection() throws Exception{
try {
Class.forName(DBDRIVER);
this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
// System.out.println("連接成功");
} catch (Exception e) {
throw e;
// TODO: handle exception
}
}
public Connection getConnection() {
return this.connection;
}
public void close() throws Exception {
if(this.connection != null) {
try {
this.connection.close();
} catch (Exception e) {
throw e;
// TODO: handle exception
}
}
}
}
2.4,定義DAO操作標準(IEmpDAO.java)
package com.hcfly.dao;
import java.util.List;
import com.hcfly.vo.Emp;
public interface IEmpDAO { // 定義DAO操作
/**
* 定義DAO的標準操作
*
*/
public boolean doCreate(Emp emp) throws Exception;
/**
* @param emp要增加的資料物件
*/
public List<Emp> findAll(String keyWord) throws Exception;
/**
* 根據查詢關鍵字進行搜索
*/
public Emp findById(int empno) throws Exception;
}
2.5,真實主題實作類(EmpDAOImpl.java)
package com.hcfly.dao.impl;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.hcfly.dao.IEmpDAO;
import com.hcfly.vo.Emp;
public class EmpDAOImpl implements IEmpDAO{
/**
* 真實主題類
*/
private Connection connection = null;
private PreparedStatement pstmt = null;
public EmpDAOImpl(Connection connection) {
// 獲取資料庫連接
this.connection = connection;
}
@Override
public boolean doCreate(Emp emp) throws Exception {
boolean flag = false;
String sql = "INSERT INTO emp (empno, ename, job, hiredate, sal) VALUES (?,?,?,?,?)";
this.pstmt = this.connection.prepareStatement(sql);
this.pstmt.setInt(1, emp.getEmpno());
this.pstmt.setString(2, emp.getEname());
this.pstmt.setString(3, emp.getJob());
this.pstmt.setDate(4, new Date(emp.getHiredate().getTime()));
this.pstmt.setFloat(5, emp.getSal());
if(this.pstmt.executeUpdate() > 0) { // 更新記錄行數大于1
flag = true;
}
this.pstmt.close();
return flag;
}
@Override
public List<Emp> findAll(String keyWord) throws Exception {
List<Emp> all = new ArrayList<Emp>();
String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename LIKE ? OR job LIKE ?";
this.pstmt = this.connection.prepareStatement(sql);
this.pstmt.setString(1, "%"+keyWord +"%");
this.pstmt.setString(2, "%"+keyWord +"%");
ResultSet rSet = this.pstmt.executeQuery();
Emp emp = null;
while (rSet.next()) {
emp = new Emp();
emp.setEmpno(rSet.getInt("empno"));
emp.setEname(rSet.getString("ename"));
emp.setHiredate(rSet.getDate("hiredate"));
emp.setJob(rSet.getString("job"));
emp.setSal(rSet.getFloat("sal"));
all.add(emp);
}
this.pstmt.close();
// TODO Auto-generated method stub
return all;
}
@Override
public Emp findById(int empno) throws Exception {
String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno=?";
this.pstmt = this.connection.prepareStatement(sql);
this.pstmt.setInt(1, empno);
ResultSet rSet = this.pstmt.executeQuery();
Emp emp = null;
if(rSet.next()) {
emp = new Emp();
emp.setEmpno(rSet.getInt("empno"));
emp.setEname(rSet.getString("ename"));
emp.setHiredate(rSet.getDate("hiredate"));
emp.setJob(rSet.getString("job"));
emp.setSal(rSet.getFloat("sal"));
}
this.pstmt.close();
// TODO Auto-generated method stub
return emp;
}
}
2.5,代理主題實作類(IEmpDAOProxy.java)
package com.hcfly.dao.proxy;
import java.util.List;
import com.hcfly.dao.IEmpDAO;
import com.hcfly.dao.impl.EmpDAOImpl;
import com.hcfly.dbc.DatabaseConnection;
import com.hcfly.vo.Emp;
public class EmpDAOProxy implements IEmpDAO{
/**
* 代理主題實作類
*/
private DatabaseConnection dbc = null;
private IEmpDAO dao = null;
public EmpDAOProxy() throws Exception{
this.dbc = new DatabaseConnection(); // 連接到資料庫
this.dao = new EmpDAOImpl(this.dbc.getConnection());
}
@Override
public boolean doCreate(Emp emp) throws Exception {
boolean flag = false;
try {
if(this.dao.findById(emp.getEmpno()) == null) {
flag = this.dao.doCreate(emp);
}
} catch (Exception e) {
throw e;
}finally {
this.dbc.close(); // 無論是否成功,將連接關閉
}
// TODO Auto-generated method stub
return flag;
}
@Override
public List<Emp> findAll(String keyWord) throws Exception {
List<Emp> all = null;
try {
all = this.dao.findAll(keyWord);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return all;
}
@Override
public Emp findById(int empno) throws Exception {
Emp emp = null;
try {
emp = this.dao.findById(empno);
} catch (Exception e) {
throw e;
}finally {
this.dbc.close();
}
return emp;
}
}
2.6,DAO工廠類(DAOFactory.java)
package com.hcfly.factory;
import com.hcfly.dao.IEmpDAO;
import com.hcfly.dao.proxy.EmpDAOProxy;
public class DAOFactory {
/**
* 工廠類
* @return
* @throws Exception
*/
public static IEmpDAO getIEmpDAOInstance() throws Exception{
return new EmpDAOProxy();
}
}
2.7,測驗類(TestDAOInsert.java)
package com.hcfly.dao.test;
import java.util.Date;
import com.hcfly.factory.DAOFactory;
import com.hcfly.vo.Emp;
public class TestDAOInsert {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Emp emp = null;
for(int x = 0; x < 5; x++) {
emp = new Emp();
emp.setEmpno(1000+x);
emp.setEname("張憨憨" + x);
emp.setJob("程式員 - " + x);
emp.setHiredate(new Date());
emp.setSal(500 * x);
// DAOFactory.getIEmpDAOInstance().doCreate(emp);
}
System.out.println(DAOFactory.getIEmpDAOInstance().findById(1001));
}
}
2.8,總結
DAO 只是提供了一個資料的操作平臺,不管在Application還是Web程式中,此DAO程式都不用做修改,
3,DAO的web使用實體(開發工具為Ecplise,如果要運行,請先配置資料庫)
從注冊頁面提交資訊給資料庫,然后讀出來,展示到表格中,
3.1, 登錄注冊頁面(增加資料表單)(emp_insert.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注冊</title>
</head>
<body>
<form action="emp_insert_do.jsp" method="post" >
雇員編號:<input type="text" name="empno" id=""><br/>
雇員姓名:<input type="text" name="ename" id=""><br/>
雇員職位:<input type="text" name="job" id=""><br/>
雇員日期:<input type="text" name="hiredate" id=""><br/>
雇員工資:<input type="text" name="sal" id=""><br/>
<input type="submit" value="https://www.cnblogs.com/jlxa162hhf/p/注冊">
<input type="reset" value="https://www.cnblogs.com/jlxa162hhf/p/重置">
</form>
<a href="https://www.cnblogs.com/jlxa162hhf/p/emp_list.jsp">跳轉到串列頁面</a>
</body>
</html>
3.2, 處理資料頁面(emp_insert_do.jsp)
<%@page import="com.hcfly.factory.DAOFactory"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="com.hcfly.vo.Emp"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>處理表單</title>
<%request.setCharacterEncoding("utf-8");
response.setHeader("refresh", "3;URL=emp_list.jsp"); // 設定跳轉時間為3秒
%>
</head>
<body>
<%
Emp emp = new Emp();
emp.setEmpno(Integer.parseInt(request.getParameter("empno")));
emp.setEname(request.getParameter("ename"));
emp.setJob(request.getParameter("job"));
emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("hiredate")));
emp.setSal(Float.parseFloat(request.getParameter("sal")));
try{
if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){
out.print("<h3>雇員資訊添加成功!</h3>");
}else{
out.print("<h3>雇員資訊添加失敗!</h3>");
}
}catch(Exception e){
e.printStackTrace();
}
%>
<h3>3秒后跳轉到串列頁</h3>
</body>
</html>
3.3,串列頁面(emp_list.jsp)
<%@page import="com.hcfly.vo.Emp"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.jasper.tagplugins.jstl.core.Catch"%>
<%@page import="java.util.Iterator"%>
<%@page import="com.hcfly.factory.DAOFactory"%>
<%@page import="java.util.Dictionary"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>串列</title>
<% request.setCharacterEncoding("utf-8"); %>
</head>
<body>
<%
try{
String keyWord = request.getParameter("kw");
if(keyWord == null){
keyWord = "";
}
List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll(keyWord);
Iterator<Emp> iter = all.iterator();
%>
<center>
<form action="" method="post">
<input type="text" name="kw">
<input type="submit" value="https://www.cnblogs.com/jlxa162hhf/p/查詢">
</form>
<table border="1" width="80%">
<tr>
<td>雇員編號:</td>
<td>雇員姓名:</td>
<td>雇員作業:</td>
<td>雇員工資:</td>
<td>雇員日期:</td>
</tr>
<% while(iter.hasNext()){
Emp emp = iter.next();
%>
<tr>
<td><%= emp.getEmpno() %></td>
<td><%= emp.getEname() %></td>
<td><%= emp.getJob() %></td>
<td><%= emp.getSal() %></td>
<td><%= emp.getHiredate() %></td>
</tr>
<%
}
%>
</table>
<a href="https://www.cnblogs.com/jlxa162hhf/p/emp_insert.jsp">跳轉到插入頁面</a>
</center>
<%
}catch(Exception e){
e.printStackTrace();
}
%>
</body>
</html>
3.4,結果展示
3.4.1 資料庫

3.4.2,注冊界面

3.4.3,串列頁面

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/270948.html
標籤:設計模式

