摘要:在代理類完成以后,最后還需要編寫工廠類,以降低代碼間的耦合度。工廠類工廠類的功能就是直接返回接口的實例化對象這樣客戶端就可以直接通過工廠類取得接口的實例化對象。
數據
DAO的開發完全圍繞著數據進行,先在數據庫中準備幾個要用到的表:
sqlcreate table emp ( empno int(4) PRIMARY KEY, ename varchar(10), job varchar(9), hiredate date, sal float(7,2) );VO類
根據表中的字段建立對應的VO類:
javapackage temp.vo; import java.util.Date; /** * Created by mcbird on 14/11/20. */ public class Emp { private int empno; private String ename; private String job; private Date hiredate; private float sal; 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; } public int getEmpno() { return empno; } public void setEmpno(int empno) { this.empno = empno; } }
可以看到,VO類中只包含getter和setter方法。定義完VO類之后,接下來定義一個DatebaseConnection類,用來完成數據庫的打開及關閉操作。
DatabaseConnection類考慮到實踐當中,有可能使用不同的數據庫,所用,我們需要寫一個通用接口,以及相應的數據庫的實現類。
DatabaseConnection通用接口javapackage temp.dbc; import java.sql.Connection; /** * Created by mcbird on 14/11/20. */ public interface DatebaseConnection { public Connection getConnection() throws Exception; // 取得數據庫連接 public void close() throws Exception; //關閉數據庫連接 }
通過這樣一個接口,能夠更好的松耦合、更抽象。
DatabaseConnection實現類javapackage temp.dbc.impl; import temp.dbc.DatebaseConnection; import java.sql.Connection; import java.sql.DriverManager; /** * Created by mcbird on 14/11/20. */ public class MySQLDatabaseConnection implements DatebaseConnection { private static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; private static final String DBURL = "jdbc://localhost:3306/temp"; private static final String DBUSER = "root"; private static final String DBPASSWORD = "cloudSoft@Skybility"; private Connection conn = null; @Override public Connection getConnection() throws Exception { try { Class.forName(DBDRIVER); this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); }catch (Exception e) { throw e; } return this.conn; } @Override public void close() throws Exception { if(this.conn != null) { try { this.conn.close(); } catch (Exception e) { throw e; } } } }
這是針對MySQL的一個實現類,還可以針對不同的數據庫編寫不同的實現類。
DAO類在DAO設計模式中,最重要的就是定義DAO接口,在定義DAO接口之前必須對業務進行詳細的分析,要清楚地知道一張表在整個系統中應該具備何種功能。
DAO接口javapackage temp.dao; import temp.vo.Emp; import java.util.List; /** * Created by mcbird on 14/11/20. */ public interface IEmpDAO { /** * 數據的增加操作 * @param emp 要增加的數據對象 * @return 是否成功增加標志 */ public boolean doCreate(Emp emp) throws Exception; /** * 查詢全部數據 * @param keyWord * @return * @throws Exception */ public ListDAO實現類findAll(String keyWord) throws Exception; /** * 根據編號查詢雇員信息 * @param empno * @return * @throws Exception */ public Emp findById(int empno) throws Exception; }
javapackage temp.dao.impl; import temp.dao.IEmpDAO; import temp.vo.Emp; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; /** * Created by mcbird on 14/11/20. */ public class EmpDAOImpl implements IEmpDAO { private Connection conn = null; private PreparedStatement pstmt = null; //數據庫操作對象 public EmpDAOImpl(Connection conn) { this.conn = conn; } @Override public boolean doCreate(Emp emp) throws Exception { boolean flag = false; String sql = "insert int emp (empno,ename,job,hiredate,sal) values (?,?,?,?,?)"; this.pstmt = this.conn.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) { //更新記錄的行數大于0 flag = true; } this.pstmt.close(); return flag; } @Override public ListfindAll(String keyWord) throws Exception { List all = new ArrayList (); String sql = "select empno,ename,job,hiredate,sal from emp where ename like ? or job like ?"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setString(1, "%" + keyWord + "%"); this.pstmt.setString(2, "%" + keyWord + "%"); ResultSet rs = this.pstmt.executeQuery(); Emp emp = null; while (rs.next()) { emp = new Emp(); emp.setEmpno(rs.getInt(1)); emp.setEname(rs.getString(2)); emp.setJob(rs.getString(3)); emp.setHiredate(rs.getDate(4)); emp.setSal(rs.getFloat(5)); all.add(emp); } this.pstmt.close(); return all; } @Override public Emp findById(int empno) throws Exception { Emp emp = null; String sql = "select empno,ename,job,hiredate,sal from emp where empno=?"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, empno); ResultSet rs = this.pstmt.executeQuery(); if(rs.next()) { emp = new Emp(); emp.setEmpno(rs.getInt(1)); emp.setEname(rs.getString(2)); emp.setJob(rs.getString(3)); emp.setHiredate(rs.getDate(4)); emp.setSal(rs.getFloat(5)); } this.pstmt.close(); return emp; } }
可以發現,在這個實現類中,根本沒有數據庫的打開和鏈接操作,只是通過構造方法取得了數據庫的鏈接,那么真正負責打開和關閉的操作是由誰來完成的呢?答案是,代理類。
代理類javapackage temp.dao.proxy; import temp.dao.IEmpDAO; import temp.dao.impl.EmpDAOImpl; import temp.dbc.DatebaseConnection; import temp.dbc.impl.MySQLDatabaseConnection; import temp.vo.Emp; import java.util.List; /** * Created by mcbird on 14/11/20. */ public class EmpDAOProxy implements IEmpDAO { private DatebaseConnection dbc = null; private IEmpDAO dao = null; public EmpDAOProxy() throws Exception { this.dbc = new MySQLDatabaseConnection(); 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(); } return flag; } @Override public ListfindAll(String keyWord) throws Exception { List all = null; try { all = this.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; } }
可以發現,在代理類的構造方法中實例化了數據庫連接類的對象以及DAO的實現類,而在代理中的各個方法只是調用了真實DAO實現類的相應方法。在代理類完成以后,最后還需要編寫工廠類,以降低代碼間的耦合度。
工廠類工廠類的功能就是直接返回DAO接口的實例化對象,這樣客戶端就可以直接通過工廠類取得DAO接口的實例化對象。
javapackage temp.dao.factory; import temp.dao.IEmpDAO; import temp.dao.proxy.EmpDAOProxy; /** * Created by mcbird on 14/11/20. */ public class DAOFactory { public static IEmpDAO getIEmpDAOInstance() throws Exception { return new EmpDAOProxy(); } }測試
javapackage temp.test; import temp.dao.factory.DAOFactory; import temp.vo.Emp; import java.util.Date; /** * Created by mcbird on 14/11/20. */ public class TestDAOInsert { public static void main(String[] args) throws Exception { Emp emp = null; for(int x = 0; x < 5; x++) { emp = new Emp(); emp.setEmpno(1000 + x); emp.setEname("McBird_" + x); emp.setJob("Singer_" + x); emp.setHiredate(new Date()); emp.setSal(100 * x); DAOFactory.getIEmpDAOInstance().doCreate(emp); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64274.html
摘要:官網訪問官網更快閱讀全部免費分享課程出品全網最新微信小程序基于最新版開發者工具之初中級培訓教程分享。 iKcamp官網:http://www.ikcamp.com 訪問官網更快閱讀全部免費分享課程:《iKcamp出品|全網最新|微信小程序|基于最新版1.0開發者工具之初中級培訓教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...
摘要:官網訪問官網更快閱讀全部免費分享課程出品全網最新微信小程序基于最新版開發者工具之初中級培訓教程分享。 iKcamp官網:http://www.ikcamp.com 訪問官網更快閱讀全部免費分享課程:《iKcamp出品|全網最新|微信小程序|基于最新版1.0開發者工具之初中級培訓教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...
摘要:官網訪問官網更快閱讀全部免費分享課程出品全網最新微信小程序基于最新版開發者工具之初中級培訓教程分享。 iKcamp官網:http://www.ikcamp.com 訪問官網更快閱讀全部免費分享課程:《iKcamp出品|全網最新|微信小程序|基于最新版1.0開發者工具之初中級培訓教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...
摘要:序是里頭比較優秀的一個爬蟲框架使用作為解析工具,并基于其開發了解析的工具。默認使用了作為下載工具。這里展示一下入門級使用。 序 webmagic是java里頭比較優秀的一個爬蟲框架: 使用Jsoup作為HTML解析工具,并基于其開發了解析XPath的工具Xsoup。 默認使用了Apache HttpClient作為下載工具。 這里展示一下入門級使用。 maven ...
閱讀 3881·2021-11-24 11:14
閱讀 3321·2021-11-22 13:53
閱讀 3883·2021-11-11 16:54
閱讀 1546·2021-10-13 09:49
閱讀 1211·2021-10-08 10:05
閱讀 3392·2021-09-22 15:57
閱讀 1754·2021-08-16 11:01
閱讀 965·2019-08-30 15:55