DAO(Data Access Object ,数据访问对象)设计模式
2014-09-04 14:46
866 查看
DAO开发
DAO开发完全围绕着数据操作进行。
(1)下面按照DAO的方式完成后端代码的开发,首行定义VO类,VO类的名称与表的名称一致,但是要注意类的命名的规范---单词首字母大写。
package com.test.vo; import java.util.Date; /** * VO类,VO类的名称与数据库中表的名称一致, * 且类中各属性与表中各字段一一对应 * */ public class GPSLOG { //属性 private String licenseplateno ; private Date in_date; private Date gps_time; private String longitude; private String latitude ; private String height ; private String speed ; private String direction; private String eff ; private String car_stat1; private String car_stat2; //getters and setters public String getLicenseplateno() { return licenseplateno; } public void setLicenseplateno(String licenseplateno) { this.licenseplateno = licenseplateno; } public Date getIn_date() { return in_date; } public void setIn_date(Date in_date) { this.in_date = in_date; } public Date getGps_time() { return gps_time; } public void setGps_time(Date gps_time) { this.gps_time = gps_time; } public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } public String getLatitude() { return latitude; } public void setLatitude(String latitude) { this.latitude = latitude; } public String getHeight() { return height; } public void setHeight(String height) { this.height = height; } public String getSpeed() { return speed; } public void setSpeed(String speed) { this.speed = speed; } public String getDirection() { return direction; } public void setDirection(String direction) { this.direction = direction; } public String getEff() { return eff; } public void setEff(String eff) { this.eff = eff; } public String getCar_stat1() { return car_stat1; } public void setCar_stat1(String car_stat1) { this.car_stat1 = car_stat1; } public String getCar_stat2() { return car_stat2; } public void setCar_stat2(String car_stat2) { this.car_stat2 = car_stat2; } }本程序只是一个简单的VO类,包含了属性、getter、setter方法。特别要注意的是,其中表示日期时使用的是java.util.Date类。
(2)定义完VO类后,下面定义一个数据库连接类,此类完成数据库的打开及关闭操作。
1》在DAO操作中,由于要适应不同的数据库,所以会将所有可能变化的地方都通过接口进行实现。例如,一个DAO操作类既可以在Oracle下使用,也可以在MySQL下使用,往往会将其定义成一个接口:
package com.test.jdbc; import java.sql.Connection; /** * 定义数据库连接接口,以适用不同的数据库连接,如Oracle,或者MySQL数据库 * */ public interface IDBConnection {//定义DatabaseConnection接口 //取得数据库连接 public Connection getConnection(); //关闭数据库连接 public void close(); }
2》然后根据不同的数据库定义不同的子类,例如以下是Oracle数据库连接的代码实现:
package com.test.jdbc; import java.sql.Connection; import java.sql.DriverManager; import com.test.jdbc.IDBConnection; /** * 取得Oracle数据库连接 * */ public class OracleDBConnection implements IDBConnection { //DB Driver private static final String DBDRIVER="oracle.jdbc.driver.OracleDriver"; //DB URL private static final String DBURL="jdbc:oracle:thin:@192.168.95.86:1521:orcl"; //DB User private static final String DBUSER="xxtmanage"; //DB Password private static final String DBPASSWORLD="xxtinterface"; //DB Connection private Connection conn=null; //structor public OracleDBConnection() {//在构造方法中进行数据库连接 System.out.println("OracleDBConnection.OracleDBConnection()"); try { // 加载驱动程序 Class.forName(DBDRIVER); //连接数据库 this.conn=DriverManager.getConnection(DBURL, DBUSER, DBPASSWORLD); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public Connection getConnection(){ System.out.println("OracleDBConnection.getConnection()"); return this.conn; } @Override public void close(){ System.out.println("OracleDBConnection.close()"); if(this.conn!=null){ try { this.conn.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
3》以下是MySQL的数据库连接代码(具体代码未实现):
package com.test.jdbc; import java.sql.Connection; import com.test.jdbc.IDBConnection; /** * 取得MySQL数据库连接 * */ public class MySQLDBConnection implements IDBConnection { @Override public Connection getConnection() { // TODO Auto-generated method stub return null; } @Override public void close() { // TODO Auto-generated method stub } }4》此时,如果要想取得一个IDBConnection接口的连接对象,还需要一个工厂类完成。
package com.test.jdbc; /** * 数据库连接工厂类, * 根据现有数据库,取得相应数据库连接。 * */ public class DBConnectionFactory { public static IDBConnection getDBConnection(){ //根据所使用的数据库,返回相应的数据库连接。 //返回Oracle数据库连接 System.out.println("DBConnectionFactory.getDBConnection()"); return new OracleDBConnection(); /** * 返回MySQL数据库连接 * return new MySQLDBConnection(); * */ } }
通过以上代码可以减少类之间的耦合度。
(3)在DAO设计模式中,最重要的就是定义DAO接口,在定义DAO接口之前必须对业务时行详细的分析,要清楚地知道一张表在整个系统中应该具备何种功能。
本程序只完成数据库的增加功能 ,其他功能可以按照建好的架构进行增加。
1》定义DAO操作标准---IGpsDao.java
package com.test.dao; import com.test.vo.GPSLOG; /** * 定义DAO操作标准 * */ public interface IGpsDao { /** * 数据的增加操作 * @param gpslog 要增加的数据对象--GPS日志信息 * @return 是否增加成功的标记 * @throws 有异常交给调用者处理 * */ public boolean insertLog(GPSLOG gpslog)throws Exception; /** * 建表 * */ public void createTab() throws Exception ; }
在DAO的操作标准中定义了 insertLog(GPSLOG gpslog),和createTab()2个功能 。
2》DAO接口定义完成后需要做具体的实现类,但是这里DAO的实现类有两种,一种是真实主题类,另外一种是代理操作类。
真实主题类主要负责具体的数据库操作,在操作时为了性能及安全将使用PreparedStatement接口完成。
package com.test.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import com.test.dao.IGpsDao; import com.test.vo.GPSLOG; /** * 真实主题实现类 * */ public class GpsLogDAOImpl implements IGpsDao { //数据库连接对象 private Connection conn=null; //数据库操作对象 private PreparedStatement pstmt=null; public GpsLogDAOImpl(Connection conn){//通过构造方法取得数据库连接 System.out.println("GpsLogDAOImpl.GpsLogDAOImpl()"); this.conn=conn; } @Override public boolean insertLog(GPSLOG gpslog) throws Exception { // TODO Auto-generated method stub System.out.println("GpsLogDAOImpl.doCreate()"); boolean flag=false; String sql="INSERT INTO GPS_LOG_cxc " + "(licenseplateno ,in_date,gps_time,longitude,latitude,height,speed, direction , eff, car_stat1, car_stat2)" +"VALUES(?,?,?,?,?,?,?,?,?,?,?)"; //实例化PreparedStatement对象 this.pstmt=this.conn.prepareStatement(sql); this.pstmt.setString(1, gpslog.getLicenseplateno()); this.pstmt.setDate(2, new java.sql.Date(gpslog.getIn_date().getTime())); this.pstmt.setDate(3, new java.sql.Date(gpslog.getGps_time().getTime())); this.pstmt.setString(4, gpslog.getLongitude()); this.pstmt.setString(5, gpslog.getLatitude()); this.pstmt.setString(6, gpslog.getHeight()); this.pstmt.setString(7, gpslog.getSpeed()); this.pstmt.setString(8, gpslog.getDirection()); this.pstmt.setString(9, gpslog.getEff()); this.pstmt.setString(10,gpslog.getCar_stat1() ); this.pstmt.setString(11, gpslog.getCar_stat2()); System.out.println("GpsLogDAOImpl.doCreate()=="+sql); if(this.pstmt.executeUpdate()>0){ flag=true; } this.pstmt.close();//关闭PreparedStatement对象 return flag; } @Override public void createTab() throws Exception { // TODO Auto-generated method stub System.out.println("GpsLogDAOImpl.createTab()"); String sql="create table GPS_LOG_cxc" + "( licenseplateno VARCHAR2(20) not null, " + " in_date DATE default SYSDATE," + " gps_time DATE not null," + " longitude CHAR(10)," + " latitude CHAR(9)," + " height CHAR(9)," + " speed CHAR(3)," + " direction CHAR(3)," + " eff CHAR(1)," + " car_stat1 CHAR(1)," + " car_stat2 CHAR(1)" + ")"; this.pstmt=this.conn.prepareStatement(sql); this.pstmt.execute(); this.pstmt.close(); } }
代理主题实现类代码如下:
package com.test.dao; import java.sql.Connection; import com.test.dao.IGpsDao; import com.test.jdbc.IDBConnection; import com.test.jdbc.DBConnectionFactory; import com.test.vo.GPSLOG; public class GpsDaoProxy implements IGpsDao { //数据库连接 private IDBConnection dbc=null; //DAO对象 private IGpsDao dao=null; public GpsDaoProxy(){ System.out.println("GpsDaoProxy.GpsDaoProxy()"); this.dbc =DBConnectionFactory.getDBConnection();//连接数据库 //实例化真实主题类--多态:接口对象指向实现此接口类的实例 this.dao=new GpsLogDAOImpl(this.dbc.getConnection() ); System.out.println("GpsDaoProxy.GpsDaoProxy()---2"); } @Override public boolean insertLog(GPSLOG gpslog) throws Exception { // TODO Auto-generated method stub System.out.println("GpsDaoProxy.doCreate()"); boolean flag=false; try { flag=this.dao.insertLog(gpslog); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ this.dbc.close(); } return flag; } @Override public void createTab() throws Exception { // TODO Auto-generated method stub System.out.println("GpsDaoProxy.createTab()"); try { this.dao.createTab(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ this.dbc.close(); } } }
可以发现,在代理类的构造方法中实实例化了数据库连接类的对象以及真实主题实现类,而在代理中的各个方法也只是调用了真实主题实现类中的相应方法。
3》DAO的真实实现类和代理实现类编写完成后就需要编写工厂类,以降低代码间的耦合度。
package com.test.dao; import com.test.dao.IGpsDao; public class DAOFactory { public static IGpsDao getIGpsDaoInstance(){ System.out.println("DAOFactory.getIGpsDaoInstance()"); return new GpsDaoProxy(); } }至此DAO模式已经书写完成。
其工程目录结构如下图所示:
(4)测试DAO插入功能 。
package com.test.main; import java.util.Date; import com.test.dao.DAOFactory; import com.test.vo.GPSLOG; public class Test { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub GPSLOG gpslog=new GPSLOG(); gpslog.setLicenseplateno("粤AW1V75"); gpslog.setIn_date(new Date()); gpslog.setGps_time(new Date()); gpslog.setLongitude("+113.37310"); gpslog.setLatitude("+23.13655"); gpslog.setHeight("000"); gpslog.setEff("0"); gpslog.setSpeed("1"); gpslog.setCar_stat1("2"); gpslog.setCar_stat2("1"); gpslog.setDirection("111"); //测试增加数据库操作 DAOFactory .getIGpsDaoInstance().insertLog(gpslog); } }
结束。。。
完整代码:点击打开链接
相关文章推荐
- DAO-数据访问对象(Data Access Object) 模式
- J2EE设计模式-Dao(Data Access Object)模式
- Java设计模式-DAO( Data Access Object)
- DAO-数据访问对象(Data Access Object) 模式
- php设计模式 DAO(数据访问对象模式)
- 设计模式学习—数据访问对象模式(Data Access Object Design Pattern)
- [介绍]PHP设计模式:DAO(数据访问对象模式)
- Spring 数据访问对象(Data Access Object,DAO)框架入门
- java的设计模式——DAO(Date Access Object)133
- Spring 数据访问对象(Data Access Object,DAO)框架入门(转)
- JavaWeb 中 DAO(Data Access Objects) 设计模式
- SQlite数据库(4)---DAO(data access object)数据访问对象
- Spring 数据访问对象(Data Access Object,DAO)框架入门(翻译)
- php设计模式 DAO(数据访问对象模式)
- java DAO(Data Access Object,DAO) 数据访问对象
- Spring 数据访问对象(Data Access Object,DAO)框架入门
- [php]php设计模式 DAO(数据访问对象模式)
- [介绍]PHP设计模式:DAO(数据访问对象模式)