摘要:在代理類完成以后,最后還需要編寫工廠類,以降低代碼間的耦合度。工廠類工廠類的功能就是直接返回接口的實例化對象這樣客戶端就可以直接通過工廠類取得接口的實例化對象。
數(shù)據(jù)
DAO的開發(fā)完全圍繞著數(shù)據(jù)進行,先在數(shù)據(jù)庫中準(zhǔn)備幾個要用到的表:
sqlcreate table emp ( empno int(4) PRIMARY KEY, ename varchar(10), job varchar(9), hiredate date, sal float(7,2) );VO類
根據(jù)表中的字段建立對應(yīng)的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類,用來完成數(shù)據(jù)庫的打開及關(guān)閉操作。
DatabaseConnection類考慮到實踐當(dāng)中,有可能使用不同的數(shù)據(jù)庫,所用,我們需要寫一個通用接口,以及相應(yīng)的數(shù)據(jù)庫的實現(xiàn)類。
DatabaseConnection通用接口javapackage temp.dbc; import java.sql.Connection; /** * Created by mcbird on 14/11/20. */ public interface DatebaseConnection { public Connection getConnection() throws Exception; // 取得數(shù)據(jù)庫連接 public void close() throws Exception; //關(guān)閉數(shù)據(jù)庫連接 }
通過這樣一個接口,能夠更好的松耦合、更抽象。
DatabaseConnection實現(xiàn)類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的一個實現(xiàn)類,還可以針對不同的數(shù)據(jù)庫編寫不同的實現(xiàn)類。
DAO類在DAO設(shè)計模式中,最重要的就是定義DAO接口,在定義DAO接口之前必須對業(yè)務(wù)進行詳細(xì)的分析,要清楚地知道一張表在整個系統(tǒng)中應(yīng)該具備何種功能。
DAO接口javapackage temp.dao; import temp.vo.Emp; import java.util.List; /** * Created by mcbird on 14/11/20. */ public interface IEmpDAO { /** * 數(shù)據(jù)的增加操作 * @param emp 要增加的數(shù)據(jù)對象 * @return 是否成功增加標(biāo)志 */ public boolean doCreate(Emp emp) throws Exception; /** * 查詢?nèi)繑?shù)據(jù) * @param keyWord * @return * @throws Exception */ public ListDAO實現(xiàn)類findAll(String keyWord) throws Exception; /** * 根據(jù)編號查詢雇員信息 * @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; //數(shù)據(jù)庫操作對象 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) { //更新記錄的行數(shù)大于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; } }
可以發(fā)現(xiàn),在這個實現(xiàn)類中,根本沒有數(shù)據(jù)庫的打開和鏈接操作,只是通過構(gòu)造方法取得了數(shù)據(jù)庫的鏈接,那么真正負(fù)責(zé)打開和關(guān)閉的操作是由誰來完成的呢?答案是,代理類。
代理類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; } }
可以發(fā)現(xiàn),在代理類的構(gòu)造方法中實例化了數(shù)據(jù)庫連接類的對象以及DAO的實現(xiàn)類,而在代理中的各個方法只是調(diào)用了真實DAO實現(xiàn)類的相應(yīng)方法。在代理類完成以后,最后還需要編寫工廠類,以降低代碼間的耦合度。
工廠類工廠類的功能就是直接返回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); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64274.html
摘要:官網(wǎng)訪問官網(wǎng)更快閱讀全部免費分享課程出品全網(wǎng)最新微信小程序基于最新版開發(fā)者工具之初中級培訓(xùn)教程分享。 iKcamp官網(wǎng):http://www.ikcamp.com 訪問官網(wǎng)更快閱讀全部免費分享課程:《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開發(fā)者工具之初中級培訓(xùn)教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...
摘要:官網(wǎng)訪問官網(wǎng)更快閱讀全部免費分享課程出品全網(wǎng)最新微信小程序基于最新版開發(fā)者工具之初中級培訓(xùn)教程分享。 iKcamp官網(wǎng):http://www.ikcamp.com 訪問官網(wǎng)更快閱讀全部免費分享課程:《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開發(fā)者工具之初中級培訓(xùn)教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...
摘要:官網(wǎng)訪問官網(wǎng)更快閱讀全部免費分享課程出品全網(wǎng)最新微信小程序基于最新版開發(fā)者工具之初中級培訓(xùn)教程分享。 iKcamp官網(wǎng):http://www.ikcamp.com 訪問官網(wǎng)更快閱讀全部免費分享課程:《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開發(fā)者工具之初中級培訓(xùn)教程分享》。包含:文章、視頻、源代碼 showImg(https://segmentfault.com/i...
摘要:序是里頭比較優(yōu)秀的一個爬蟲框架使用作為解析工具,并基于其開發(fā)了解析的工具。默認(rèn)使用了作為下載工具。這里展示一下入門級使用。 序 webmagic是java里頭比較優(yōu)秀的一個爬蟲框架: 使用Jsoup作為HTML解析工具,并基于其開發(fā)了解析XPath的工具Xsoup。 默認(rèn)使用了Apache HttpClient作為下載工具。 這里展示一下入門級使用。 maven ...
閱讀 3916·2021-11-24 11:14
閱讀 3367·2021-11-22 13:53
閱讀 3944·2021-11-11 16:54
閱讀 1660·2021-10-13 09:49
閱讀 1261·2021-10-08 10:05
閱讀 3433·2021-09-22 15:57
閱讀 1788·2021-08-16 11:01
閱讀 1003·2019-08-30 15:55