摘要:介紹功能是數(shù)據(jù)操作客戶發(fā)送數(shù)據(jù)到顯示層顯示層發(fā)送數(shù)據(jù)到業(yè)務層業(yè)務發(fā)送數(shù)據(jù)到數(shù)據(jù)層數(shù)據(jù)層進行持久化即保存進入一些簡稱業(yè)務對象的簡稱一個數(shù)據(jù)訪問對象增刪查改數(shù)據(jù)庫一條記錄映射成對象擁有方法為什么使用把的操作進行分離即數(shù)據(jù)庫的操作和業(yè)務進行分離是
介紹
DAO功能是數(shù)據(jù)操作.
客戶發(fā)送數(shù)據(jù)到顯示層,顯示層發(fā)送數(shù)據(jù)到業(yè)務層,業(yè)務發(fā)送數(shù)據(jù)到數(shù)據(jù)層,數(shù)據(jù)層進行持久化.即.保存進入databases
一些簡稱 BO 業(yè)務對象的簡稱 DAO 一個數(shù)據(jù)訪問對象,增刪查改 PO數(shù)據(jù)庫一條記錄,映射成javaBean對象,擁有g(shù)etter/setter方法為什么使用
把jdbc的操作進行分離,即數(shù)據(jù)庫的操作和業(yè)務進行分離,javabean是把視圖和業(yè)務進行分離,dao是把數(shù)據(jù)庫的操作和業(yè)務邏輯進行分離.
DAO組成 VO屬性,get set 方法組成.VO是數(shù)據(jù)庫中記錄的映射.
DAO定義操作的接口
用于定義數(shù)據(jù)庫的原子化操作,增刪查改
對接口的實現(xiàn)
Proxy代理實現(xiàn)類,通過代理類,用來調(diào)用真實的對象的操作
Factory工廠類,通過工廠,產(chǎn)生DAO實例化對象
DAO栗子一個雇員表如下
NO | 列名稱 | 描述 |
---|---|---|
1 | empno | 雇員編號 數(shù)字表示 長度4位 |
2 | ename | 雇員姓名 字符串表示 長度10位字符串 |
3 | job | 雇員工作 |
4 | hiredate | 雇傭日期 |
5 | sal | 基本工資 小數(shù)表示 小數(shù)2位 整數(shù) 5位 |
數(shù)據(jù)庫關(guān)系映射如下
package com.ming.vo; import java.util.Date; // 對數(shù)據(jù)庫記錄的映射 public class Emp { // 雇員編號 private int empno; // 姓名 private String ename; // 職位 private String job; // 日期 private Date hiredate; // 基本工資 private float sal; public int getEmpno() { return empno; } public String getEname() { return ename; } public String getJob() { return job; } public Date getHiredate() { return hiredate; } public float getSal() { return sal; } public void setEmpno(int empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public void setSal(float sal) { this.sal = sal; } }數(shù)據(jù)庫連接
定義接口
package com.ming.dbc; import java.sql.Connection; // 數(shù)據(jù)庫連接 public interface DataBaseConnection { public Connection getConnection(); public void close() throws Exception; }
實現(xiàn)該接口
package com.ming.dbc; import java.sql.*; // mysql數(shù)據(jù)庫連接實栗 public class MysqlDatabaseConnection implements DataBaseConnection{ private static final String DBDRIVER = "com.mysql.cj.jdbc.Driver"; private static final String DBURL = "jdbc:mysql://47.94.95.84:32786/test"; private static final String DBUSER = "test"; private static final String DBPASSWORD = "ABCcba20170607"; private Connection connection = null; public MysqlDatabaseConnection() throws Exception { try{ Class.forName(DBDRIVER); this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); }catch (Exception e){ throw e; } } // 獲得連接 @Override public Connection getConnection(){ return this.connection; } // 關(guān)閉連接 @Override public void close() throws Exception{ if(this.connection != null){ try{ this.connection.close(); }catch (Exception e){ throw e; } } } }
設置工廠
package com.ming.dbc; // 數(shù)據(jù)庫連接工廠 public class DatabaseConnectionFactory { // 獲得實栗 public static DataBaseConnection getDataBaseConnection() throws Exception{ return new MysqlDatabaseConnection(); } }dao 定義dao接口
package com.ming.dao; import com.ming.vo.Emp; import java.util.List; // 定義dao接口 public interface IEmpDAO { /** * 數(shù)據(jù)庫增加操作 以doXXX方式命名 * @param emp 增加數(shù)據(jù)的對象 * @return 成功標記 * @throws Exception 異常繼續(xù)向上拋出 **/ public boolean doCreate(Emp emp) throws Exception; /** * * 查詢?nèi)繑?shù)據(jù) 一般以findXXXX命名 * @param keyWord 查詢關(guān)鍵字 * @return 返回查詢結(jié)果 一個Emp對象表示一行記錄 * @throws Exception 異常繼續(xù)拋出 */ public List實現(xiàn)接口findAll(String keyWorld) throws Exception; /** * 根據(jù)雇員編號查詢雇員信息 * @param empno 雇員編號 * @return 雇員vo對象 * @throws Exception 異常向上拋出 */ public Emp findByid(int empno) throws Exception; }
package com.ming.dao; import com.ming.vo.Emp; import com.mysql.cj.protocol.Resultset; import javax.xml.transform.Result; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; // DAO實栗 public class EmpDAOImpl implements IEmpDAO { // 數(shù)據(jù)庫連接對象 private Connection connection = null; // 數(shù)據(jù)庫操作方法 private PreparedStatement preparedStatement = null; // 構(gòu)造方法注入數(shù)據(jù)庫連接 public EmpDAOImpl(Connection _connection){ this.connection = _connection; } /** * 數(shù)據(jù)庫增加操作 以doXXX方式命名 * 實現(xiàn)數(shù)據(jù)庫增加操作 * @param emp 增加數(shù)據(jù)的對象 * @return 成功標記 * @throws Exception 異常繼續(xù)向上拋出 **/ @Override public boolean doCreate(Emp emp) throws Exception { // 定義標志位 boolean flag = false; // sql String sql = "INSERT INTO emp(empno, ename, job, hiredate, sal) VALUES (?, ?, ?, ?, ?);"; // 實例化操作對象 this.preparedStatement = this.connection.prepareStatement(sql); // 賦值操作 this.preparedStatement.setInt(1, emp.getEmpno()); this.preparedStatement.setString(2, emp.getEname()); this.preparedStatement.setString(3, emp.getJob()); this.preparedStatement.setDate(4, new Date(emp.getHiredate().getTime())); this.preparedStatement.setFloat(5, emp.getSal()); // 更新行數(shù)大于0 if(this.preparedStatement.executeUpdate() > 0){ flag = true; } this.preparedStatement.close(); return flag; } /** * 查詢?nèi)繑?shù)據(jù) 一般以findXXXX命名 * * @param keyWorld@return 返回查詢結(jié)果 一個Emp對象表示一行記錄 * @throws Exception 異常繼續(xù)拋出 */ @Override public List定義代理類findAll(String keyWorld) throws Exception { List all = new ArrayList (); String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename like ? OR job like ?"; this.preparedStatement = this.connection.prepareStatement(sql); this.preparedStatement.setString(1, "%" + keyWorld + "%"); this.preparedStatement.setString(2, "%" + keyWorld + "%"); ResultSet resultSet = this.preparedStatement.executeQuery(); Emp emp = null; while(resultSet.next()){ emp = new Emp(); emp.setEmpno(resultSet.getInt(1)); emp.setEname(resultSet.getString(2)); emp.setJob(resultSet.getString(3)); emp.setHiredate(resultSet.getDate(4)); emp.setSal(resultSet.getFloat(5)); all.add(emp); } this.preparedStatement.close(); return all; } /** * 根據(jù)雇員編號查詢雇員信息 * * @param empno 雇員編號 * @return 雇員vo對象 * @throws Exception 異常向上拋出 */ @Override public Emp findByid(int empno) throws Exception { // 聲明Emp對象 Emp emp = null; String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno = ?"; this.preparedStatement = this.connection.prepareStatement(sql); this.preparedStatement.setInt(1, empno); ResultSet resultset = this.preparedStatement.executeQuery(); if(resultset.next()){ emp = new Emp(); emp.setEmpno(resultset.getInt(1)); emp.setEname(resultset.getString(2)); emp.setJob(resultset.getString(3)); emp.setHiredate(resultset.getDate(4)); emp.setSal(resultset.getFloat(5)); } this.preparedStatement.close(); return emp; } }
package com.ming.dao; import com.ming.dbc.DataBaseConnection; import com.ming.dbc.DatabaseConnectionFactory; import com.ming.vo.Emp; import java.util.List; // 數(shù)據(jù)庫連接代理類 public class EmpDAOProxy implements IEmpDAO{ private DataBaseConnection dataBaseConnection = null; private IEmpDAO dao = null; // 實例化連接 public EmpDAOProxy() throws Exception{ // 獲得連接對象 dataBaseConnection = DatabaseConnectionFactory.getDataBaseConnection(); // 實例化主題類 this.dao = new EmpDAOImpl(dataBaseConnection.getConnection()); } /** * 數(shù)據(jù)庫增加操作 以doXXX方式命名 * * @param emp 增加數(shù)據(jù)的對象 * @return 成功標記 * @throws Exception 異常繼續(xù)向上拋出 **/ @Override public boolean doCreate(Emp emp) throws Exception { boolean flag = false; try{ // 插入雇員編號不存在 if(this.dao.findByid(emp.getEmpno()) == null){ // 調(diào)用主題直接創(chuàng)建 flag = this.dao.doCreate(emp); } }catch (Exception e){ throw e; }finally { this.dataBaseConnection.close(); } return flag; } /** * 查詢?nèi)繑?shù)據(jù) 一般以findXXXX命名 * * @param keyWorld@return 返回查詢結(jié)果 一個Emp對象表示一行記錄 * @throws Exception 異常繼續(xù)拋出 */ @Override public List編寫測試類findAll(String keyWorld) throws Exception { List all = null; try{ all = this.dao.findAll(keyWorld); }catch (Exception e){ throw e; }finally { this.dataBaseConnection.close(); } return all; } /** * 根據(jù)雇員編號查詢雇員信息 * * @param empno 雇員編號 * @return 雇員vo對象 * @throws Exception 異常向上拋出 */ @Override public Emp findByid(int empno) throws Exception { Emp emp = null; try{ emp = this.dao.findByid(empno); }catch (Exception e){ throw e; }finally { this.dataBaseConnection.close(); } return emp; } }
package com.ming.dao; import com.ming.vo.Emp; import org.junit.After; import org.junit.Before; import org.junit.Test; import javax.swing.text.html.HTMLDocument; import javax.xml.crypto.Data; import java.util.Date; import java.util.Iterator; import java.util.List; import static org.junit.Assert.*; public class EmpDAOProxyTest { EmpDAOProxy empDAOProxy = null; Emp emp = null; String keyWords = null; @Before public void setUp() throws Exception { empDAOProxy = new EmpDAOProxy(); emp = new Emp(); emp.setEname("ae3365eaa"); emp.setEmpno(2223453); emp.setSal(23.2325624f); emp.setHiredate(new Date()); emp.setJob("ming4654"); keyWords = new String("ming4654"); } @After public void tearDown() throws Exception { } @Test public void doCreate() throws Exception { if(empDAOProxy.doCreate(emp)){ System.out.println("增加一條記錄成功"); }else{ System.out.println("增加一條記錄失敗"); } } @Test public void findAll() throws Exception { List設置工廠result = empDAOProxy.findAll(this.keyWords); // 迭代器遍歷對象 Iterator iterator = result.iterator(); // 循環(huán)迭代 while(iterator.hasNext()){ Emp tmp = (Emp)iterator.next(); System.out.println(emp.getEname() + emp.getJob() + emp.getEmpno() + emp.getHiredate() + emp.getSal()); } } @Test public void findByid() throws Exception{ int emp = 2223453; Emp tmp = empDAOProxy.findByid(emp); System.out.println(tmp.getEname()); } }
package com.ming.dao; public class DAOFactory { public static IEmpDAO getIEmpDAOInstance() throws Exception{ return new EmpDAOProxy(); } }設置插入界面jsp
<%-- Created by IntelliJ IDEA. User: ming Date: 19-3-16 Time: 上午3:10 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %>設置插入成功jsp增加雇員
<%@ page import="com.ming.vo.Emp" %> <%@ page import="com.ming.dao.DAOFactory" %> <%@ page import="java.util.Date" %> <%-- Created by IntelliJ IDEA. User: ming Date: 19-3-16 Time: 上午3:12 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %>Title <% Emp emp = new Emp(); emp.setJob(request.getParameter("job")); emp.setEmpno(Integer.parseInt(request.getParameter("empno"))); emp.setHiredate(new Date()); emp.setEname("eee"); emp.setSal(34.45f); try{ if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){ %>添加成功
<% %> <% } }catch (Exception e){ e.printStackTrace(); } %>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73751.html
摘要:此的功能是從應用程序中隱藏在底層存儲機制中執(zhí)行操作所涉及的所有復雜性。這正是模式試圖解決的問題。將模式與一起使用開發(fā)人員普遍認為的發(fā)布將模式的功能降級為零,因為該模式只是實體經(jīng)理提供的另一層抽象和復雜性。在這種情況下,模式有其自己的位置。 案例概述 數(shù)據(jù)訪問對象(DAO)模式是一種結(jié)構(gòu)模式,它允許我們使用抽象API將應用程序/業(yè)務層與持久層(通常是關(guān)系數(shù)據(jù)庫,但它可以是任何其他持久性機...
摘要:實現(xiàn)數(shù)據(jù)庫操作關(guān)于人員的數(shù)據(jù)庫操作定義一個代理類代理,如果使用靜態(tài)代理,那么這個類必須實現(xiàn)接口,這里采用動態(tài)代理類,免去實現(xiàn)代理類定義的所有接口。 描述:代理對象和被代理對象具有相同的行為,客戶端通過代理對象實現(xiàn)對被代理對象調(diào)用,代理對象除了可以代理被代理對象的所有行為外,還可以在被代理對象的所有行為上添加一些額外的內(nèi)容,如開閉事務,權(quán)限攔截等;動態(tài)代理可以生成一個不用實現(xiàn)被代理類的所...
摘要:依賴倒置在面向?qū)ο笤O計中有一個重要的原則是依賴倒置,主要作用是解耦,讓對象與對象之間松耦合?,F(xiàn)在根據(jù)依賴倒置原則對例子進行修改。 依賴倒置 在面向?qū)ο笤O計中有一個重要的原則是依賴倒置(Dependence Inversion Principle),主要作用是解耦,讓對象與對象之間松耦合。定義如下:高層模塊不應該依賴底層模塊,他們都應該依賴抽象。抽象不應該依賴于細節(jié),細節(jié)應該依賴于抽象。...
前言 在講解Web開發(fā)模式的時候,曾經(jīng)寫過XML版的用戶登陸注冊案例!現(xiàn)在在原有的項目上,使用數(shù)據(jù)庫版來完成用戶的登陸注冊!如果不了解的朋友,可以看看我Web開發(fā)模式的博文! 本來使用的是XML文件作為小型數(shù)據(jù)庫,現(xiàn)在使用Mysql數(shù)據(jù)庫,代碼究竟要改多少呢?我們拭目以待! 使用C3P0數(shù)據(jù)庫連接池 導入C3P0的開發(fā)包和導入配置文件 開發(fā)包導入的是這個:c3p0-0.9.2-pre1和mcha...
摘要:在代理類完成以后,最后還需要編寫工廠類,以降低代碼間的耦合度。工廠類工廠類的功能就是直接返回接口的實例化對象這樣客戶端就可以直接通過工廠類取得接口的實例化對象。 數(shù)據(jù) DAO的開發(fā)完全圍繞著數(shù)據(jù)進行,先在數(shù)據(jù)庫中準備幾個要用到的表: sqlcreate table emp ( empno int(4) PRIMARY KEY, ename varchar(10...
閱讀 3650·2021-09-22 15:15
閱讀 3555·2021-08-12 13:24
閱讀 1309·2019-08-30 15:53
閱讀 1816·2019-08-30 15:43
閱讀 1179·2019-08-29 17:04
閱讀 2792·2019-08-29 15:08
閱讀 1573·2019-08-29 13:13
閱讀 3084·2019-08-29 11:06