摘要:介紹功能是數據操作客戶發送數據到顯示層顯示層發送數據到業務層業務發送數據到數據層數據層進行持久化即保存進入一些簡稱業務對象的簡稱一個數據訪問對象增刪查改數據庫一條記錄映射成對象擁有方法為什么使用把的操作進行分離即數據庫的操作和業務進行分離是
介紹
DAO功能是數據操作.
客戶發送數據到顯示層,顯示層發送數據到業務層,業務發送數據到數據層,數據層進行持久化.即.保存進入databases
一些簡稱 BO 業務對象的簡稱 DAO 一個數據訪問對象,增刪查改 PO數據庫一條記錄,映射成javaBean對象,擁有getter/setter方法為什么使用
把jdbc的操作進行分離,即數據庫的操作和業務進行分離,javabean是把視圖和業務進行分離,dao是把數據庫的操作和業務邏輯進行分離.
DAO組成 VO屬性,get set 方法組成.VO是數據庫中記錄的映射.
DAO定義操作的接口
用于定義數據庫的原子化操作,增刪查改
對接口的實現
Proxy代理實現類,通過代理類,用來調用真實的對象的操作
Factory工廠類,通過工廠,產生DAO實例化對象
DAO栗子一個雇員表如下
NO | 列名稱 | 描述 |
---|---|---|
1 | empno | 雇員編號 數字表示 長度4位 |
2 | ename | 雇員姓名 字符串表示 長度10位字符串 |
3 | job | 雇員工作 |
4 | hiredate | 雇傭日期 |
5 | sal | 基本工資 小數表示 小數2位 整數 5位 |
數據庫關系映射如下
package com.ming.vo; 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 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; } }數據庫連接
定義接口
package com.ming.dbc; import java.sql.Connection; // 數據庫連接 public interface DataBaseConnection { public Connection getConnection(); public void close() throws Exception; }
實現該接口
package com.ming.dbc; import java.sql.*; // mysql數據庫連接實栗 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; } // 關閉連接 @Override public void close() throws Exception{ if(this.connection != null){ try{ this.connection.close(); }catch (Exception e){ throw e; } } } }
設置工廠
package com.ming.dbc; // 數據庫連接工廠 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 { /** * 數據庫增加操作 以doXXX方式命名 * @param emp 增加數據的對象 * @return 成功標記 * @throws Exception 異常繼續向上拋出 **/ public boolean doCreate(Emp emp) throws Exception; /** * * 查詢全部數據 一般以findXXXX命名 * @param keyWord 查詢關鍵字 * @return 返回查詢結果 一個Emp對象表示一行記錄 * @throws Exception 異常繼續拋出 */ public List實現接口findAll(String keyWorld) throws Exception; /** * 根據雇員編號查詢雇員信息 * @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 { // 數據庫連接對象 private Connection connection = null; // 數據庫操作方法 private PreparedStatement preparedStatement = null; // 構造方法注入數據庫連接 public EmpDAOImpl(Connection _connection){ this.connection = _connection; } /** * 數據庫增加操作 以doXXX方式命名 * 實現數據庫增加操作 * @param emp 增加數據的對象 * @return 成功標記 * @throws Exception 異常繼續向上拋出 **/ @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()); // 更新行數大于0 if(this.preparedStatement.executeUpdate() > 0){ flag = true; } this.preparedStatement.close(); return flag; } /** * 查詢全部數據 一般以findXXXX命名 * * @param keyWorld@return 返回查詢結果 一個Emp對象表示一行記錄 * @throws Exception 異常繼續拋出 */ @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; } /** * 根據雇員編號查詢雇員信息 * * @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; // 數據庫連接代理類 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()); } /** * 數據庫增加操作 以doXXX方式命名 * * @param emp 增加數據的對象 * @return 成功標記 * @throws Exception 異常繼續向上拋出 **/ @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.dataBaseConnection.close(); } return flag; } /** * 查詢全部數據 一般以findXXXX命名 * * @param keyWorld@return 返回查詢結果 一個Emp對象表示一行記錄 * @throws Exception 異常繼續拋出 */ @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; } /** * 根據雇員編號查詢雇員信息 * * @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(); // 循環迭代 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(); } %>
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73751.html
摘要:此的功能是從應用程序中隱藏在底層存儲機制中執行操作所涉及的所有復雜性。這正是模式試圖解決的問題。將模式與一起使用開發人員普遍認為的發布將模式的功能降級為零,因為該模式只是實體經理提供的另一層抽象和復雜性。在這種情況下,模式有其自己的位置。 案例概述 數據訪問對象(DAO)模式是一種結構模式,它允許我們使用抽象API將應用程序/業務層與持久層(通常是關系數據庫,但它可以是任何其他持久性機...
摘要:依賴倒置在面向對象設計中有一個重要的原則是依賴倒置,主要作用是解耦,讓對象與對象之間松耦合。現在根據依賴倒置原則對例子進行修改。 依賴倒置 在面向對象設計中有一個重要的原則是依賴倒置(Dependence Inversion Principle),主要作用是解耦,讓對象與對象之間松耦合。定義如下:高層模塊不應該依賴底層模塊,他們都應該依賴抽象。抽象不應該依賴于細節,細節應該依賴于抽象。...
前言 在講解Web開發模式的時候,曾經寫過XML版的用戶登陸注冊案例!現在在原有的項目上,使用數據庫版來完成用戶的登陸注冊!如果不了解的朋友,可以看看我Web開發模式的博文! 本來使用的是XML文件作為小型數據庫,現在使用Mysql數據庫,代碼究竟要改多少呢?我們拭目以待! 使用C3P0數據庫連接池 導入C3P0的開發包和導入配置文件 開發包導入的是這個:c3p0-0.9.2-pre1和mcha...
閱讀 3659·2021-09-22 15:15
閱讀 3564·2021-08-12 13:24
閱讀 1312·2019-08-30 15:53
閱讀 1824·2019-08-30 15:43
閱讀 1184·2019-08-29 17:04
閱讀 2795·2019-08-29 15:08
閱讀 1583·2019-08-29 13:13
閱讀 3088·2019-08-29 11:06