DAO由以下几个部分组成:
DatabaseConnection:专门负责数据库的打开与关闭操作的类。
VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的没一条记录。
DAO:主要定义操作的接口,定义一系列数据库的原子性操作标准,如增加、修改、删除、按ID查询等。
Impl:DAO接口的真是实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭。
Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。
Factory:工厂类,通过工厂类取得一个DAO的实例化对象。
数据库连接类----DatabaseConnection.java
import java.sql.Connection;
import java.sql.DriverManager;
public class DatabaseConnection {
private static final String DBDRIVER = "com.mysql.jdbc.Driver";
private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/ihubdb";
private static final String DBUSER ="root";
private static final String DBPASSWORD="password";
private Connection conn = null;
public DatabaseConnection() throws Exception{
try{
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL, DBUSER,DBPASSWORD);
}catch (Exception e){
throw e;
}
}
public Connection getConnection(){
return this.conn;
}
public void close() throws Exception{
if (this.conn!=null){
try{
this.conn.close();
}catch(Exception e){
throw e;
}
}
}
}
定义对应的VO类----Emp.java
import java.util.Date;
public class Emp {
private int empno;
private String ename;
private String job;
private Date hiredate;
private float sal;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
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;
}
}
定义DAO操作标准----IEmpDAO.java
import java.util.List;
public interface IEmpDAO {
//数据的增加操作,一般以doXxx的方式命名
public boolean doCreate(Emp emp) throws Exception;
//查询全部的数据,一般以findXxx的方式命名
public List<Emp> findAll(String keyWord) throws Exception;
//根据雇员编号查询雇员信息
public Emp findById(int empno) throws Exception;
}
真实主题实现类----EmpDAOImpl.java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
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 {
// TODO Auto-generated method stub
boolean flag = false;
String sql="insert into 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 java.sql.Date(emp.getHiredate().getTime()));
this.pstmt.setFloat(5, emp.getSal());
if(this.pstmt.executeUpdate()>0){
flag = true;
}
this.pstmt.close();
return flag;
}
@Override
public List<Emp> findAll(String keyWord) throws Exception {
// TODO Auto-generated method stub
List<Emp> all = new ArrayList<Emp>();
String sql = "select empno,ename,job,hiedate,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 {
// TODO Auto-generated method stub
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;
}
}
代理主题实现类----IEmpDAOProxy.java
import java.util.List;
public class EmpDAOProxy implements IEmpDAO{
private DatabaseConnection dbc = null;
private IEmpDAO dao = null;
public EmpDAOProxy() throws Exception{
this.dbc = new DatabaseConnection();
this.dao = new EmpDAOImpl(this.dbc.getConnection());
}
@Override
public boolean doCreate(Emp emp) throws Exception {
// TODO Auto-generated method stub
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 List<Emp> findAll(String keyWord) throws Exception {
// TODO Auto-generated method stub
List<Emp> all = null;
try{
all = this.dao.findAll(keyWord);
}catch (Exception e){
throw e;
}finally{
this.dbc.close();
}
return all;
}
@Override
public Emp findById(int empno) throws Exception {
// TODO Auto-generated method stub
Emp emp = null;
try{
emp = this.dao.findById(empno);
}catch (Exception e ){
throw e;
}finally{
this.dbc.close();
}
return emp;
}
}
DAO工厂类----DAOFactory
public class DAOFactory {
public class DAOFactory {
public static IEmpDAO getIEmpDAOInstance() throws Exception{//取得DAO接口实例
return new EmpDAOProxy();//取得代理类的实例
}
}
测试查询操作----TestDAOFactory.java
import java.util.Iterator;
import java.util.List;
public class TestDAOSelect {
public static void main(String [] args) throws Exception{
List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll("");
Iterator<Emp> iter = all.iterator();
while(iter.hasNext()){
Emp emp = iter.next();
System.out.println(emp.getEmpno()+"、"+ emp.getEname()+"→"+emp.getEname());
}
}
}