您的位置:首页 > 移动开发 > Objective-C

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);
}
}


结束。。。

完整代码:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: