一、简介
数据访问对象(DAO)封装数据库访问的细节,提供对数据库中表的粗粒度或者一次一条记录的访问。值对象(VO)封装了被访问的数据结构,有效地表示了被访问的记录。
为了更好的模块化,用一个数据库工具类隔离底层数据库访问行为,使获取和更新数据的业务方法不需要负责数据库操作。这样使得数据库相关的操作都由工具类完成,使用这个工具类的各种对象之间可以有效的共享这些操作。
二、DAO描述
DAO的目的是封装数据库访问和提供为业务对象屏蔽访问细节的方法。这种方法提供了代码共享,因为各种业务对象之间共享了DAO,所以这种方法还可以本地化对数据访问代码可能的必要修改。
这些DAO和相应的表的值对象紧紧耦合并通过表相互作用,存储从表中取来的值的类成员变量都存储在一个值对象中,此值对象又是一个类成员变量。
三、VO描述
值对象设计模式封装了数据记录,包括反映数据记录字段的类成员变量和属性。在类中声明了一组get和set方法用于从类成员中获取值和设置成员变量为指定的值。
四、代码示例:
1.数据表的结构
列名 | 数据类型 | 说明 |
Depart_id | Int(0) | 部门编号,主键,自增 |
Depart_name | Varchar(10) | 部门名称 |
2.简单DAO:DepartDAO.java
package com.sdust.omims.db.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
import com.sdust.omims.db.bean.DepartBean;
import com.sdust.omims.db.utils.DBUtil;
/**
* 部门信息DAO
*
* @author Shmily
* @version 1.0
*/
public class DepartDAO {
// hold SQL Statement
private String insertStmt;
private String deleteStmt;
private String selectByNameStmt;
private String selectStmt;
// hold prepared statement
private PreparedStatement insertPreStmt;
private PreparedStatement deletePreStmt;
private PreparedStatement selectByNamePreStmt;
private PreparedStatement selectPreStmt;
// DB Utility
DBUtil dbUtil;
// Department Bean
DepartBean departmentBean;
public DepartDAO() {
departmentBean = new DepartBean();
dbUtil = new DBUtil();
createPreStmts();
}
/**
* 创建PreparedStatement对象
*/
public void createPreStmts() {
try {
insertStmt = "INSERT INTO tb_department VALUES(?)";
insertPreStmt = dbUtil.createPreStmt(insertStmt);
deleteStmt = "DELETE FROM tb_department where depart_name = ?";
deletePreStmt = dbUtil.createPreStmt(deleteStmt);
selectByNameStmt = "SELECT * FROM tb_department WHERE depart_name = ?";
selectByNamePreStmt = dbUtil.createPreStmt(selectByNameStmt);
selectStmt = "SELECT * FROM tb_department";
selectPreStmt = dbUtil.createPreStmt(selectStmt);
} catch (Exception e) {
// TODO: handle exception
System.out
.println("SQLException caught in DepartDAO.createPreStmts().");
}
}
/**
* 部门是否存在
*
* @param department
* 部门信息
*
* @return isExit 如果存在,返回true;否则,返回false.
*/
public Boolean isDepartExit(DepartBean department) {
Boolean isExit = false;
try {
selectByNamePreStmt.setString(1, department.getDepartName());
ResultSet rs = selectByNamePreStmt.executeQuery();
if (rs.next()) {
if (rs.getInt(1) != 0) {
isExit = true;
}
}
} catch (Exception e) {
// TODO: handle exception
System.out
.println("SQLException caught in DepartDAO.isDepartExit().");
}
return isExit;
}
/**
* 增加新的部门
*
* @param department
* 部门信息
*/
public void insertDAO(DepartBean department) {
if (isDepartExit(department)) {
System.out.println("该部门已存在!!!");
} else {
try {
insertPreStmt.setString(1, department.getDepartName());
insertPreStmt.executeUpdate();
} catch (Exception e) {
// TODO: handle exception
System.out
.println("SQLException caught in DepartDAO.insertDAO().");
}
}
}
/**
* 删除某个部门
*
* @param department
* 部门信息
*/
public void deleteDAO(DepartBean department) {
try {
deletePreStmt.setString(1, department.getDepartName());
deletePreStmt.executeUpdate();
} catch (Exception e) {
// TODO: handle exception
System.out.println("SQLException caught in DepartDAO.deleteDAO().");
}
}
/**
* 获取所有部门的信息
*
* @return vector 所有部门的集合
*/
public Vector<DepartBean> getAll() {
Vector<DepartBean> vector = new Vector<DepartBean>();
try {
ResultSet rs = selectPreStmt.executeQuery();
while (rs.next()) {
DepartBean department = new DepartBean();
department.setDepartId(rs.getInt(1));
department.setDepartName(rs.getString(2));
vector.add(department);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("SQLException caught in DepartDAO.getAll().");
}
return vector;
}
}
3.VO:DepartBean.java
package com.sdust.omims.db.bean;
/**
* 部门信息类
*
* @author Shmily
* @version 1.0
*/
public class DepartBean {
// 部门ID
private int departId;
// 部门名称
private String departName;
public DepartBean() {
}
public void setDepartId(int id) {
this.departId = id;
}
public int getDepartId() {
return this.departId;
}
public void setDepartName(String name) {
this.departName = name;
}
public String getDepartName() {
return this.departName;
}
public Object get(int column) {
switch (column) {
case 0:
return this.getDepartId();
case 1:
return this.getDepartName();
default:
return null;
}
}
}
4.数据库工具类:DBUtil.java
见http://my.oschina.net/NorthOcean/blog/261116