DAO设计模式
DAO设计模式包括5个部分:
(1)数据库连接类
package com.mipo.dao.dbutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 数据库连接类,主要功能是连接数据库并获得连接对象,以及关闭数据库。
* 通过创建数据库连接类,可以大大简化开发,当需要连接数据库时,只须创建该类的实例,调用其方法即可;而不必每次操作都要写相同的代码。
* @author Administrator
*
*/
public class DatabaseConnection {
private static final String DB_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";//驱动
private static final String DB_CONNECTION = "jdbc:sqlserver://localhost:1433;Database=student";//SQLServer的连接URL
private static final String USER = "sa";//数据库用户名
private static final String PWD = "sasa";//数据库密码
//获得连接对象
public static Connection getConnection(){
Connection conn = null;
try {
//加载驱动
Class.forName(DB_DRIVER);
//创建连接对象
conn = DriverManager.getConnection(DB_CONNECTION,USER,PWD);
//检验连接是否成功
System.out.println(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭连接对象
public static void closeConn(Connection conn) {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//关闭陈述对象
public static void closePs(PreparedStatement ps) {
if (null != ps) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//关闭结果集
public static void closeRs(ResultSet rs) {
if (null != rs) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//关闭连接对象,陈述对象,结果集
public static void close(Connection conn,PreparedStatement ps, ResultSet rs) {
try {
if (null != conn) {
conn.close();
}
if (null != ps) {
ps.close();
}
if (null != rs) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(2)vo类
package com.mipo.dao.vo;
/**
* vo类是数据库中表的映射实体类,一个vo类代表数据库中一张表,其属性和表中字段是一一对应的,
* 并提供了setters和getters方法来设置和获取该类中的属性。
* @author Administrator
*
*/
public class Student {
private String name;
private int id;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)DAO接口
package com.mipo.dao.daointerface;
import java.util.Vector;
import com.mipo.dao.vo.Student;
/**
* DAO接口定义了所有对数据库的操作,如增删改查等,
* 因为是接口,只定义了抽象方法,需要子类实现。
* @author Administrator
*
*/
public interface StudentInterface {
public int insert(Student stu);
public int delete(int id);
public int update(Student stu);
public Vector<Vector<Object>> select(int id);
public Vector<Vector<Object>> selectAll();
}
(4)DAO实现类
package com.mipo.dao.implementclass;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Vector;
/**
* DAO实现类实现了DAO接口,并实现了接口中定义的所有方法
*/
import com.mipo.dao.daointerface.StudentInterface;
import com.mipo.dao.dbutil.DatabaseConnection;
import com.mipo.dao.vo.Student;
public class StudentDAO implements StudentInterface{
@Override
public int insert(Student stu) {//增加方法
int i = 0;
PreparedStatement ps=null;
String sql ="insert into Student(name,id,age) values(?,?,?)";
Connection conn=DatabaseConnection.getConnection();
try {
ps=conn.prepareStatement(sql);
ps.setString(1, stu.getName());
ps.setInt(1, stu.getId());
ps.setInt(1, stu.getAge());
i=ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DatabaseConnection.closePs(ps);
DatabaseConnection.closeConn(conn);
}
return i;
}
@Override
public int delete(int id) {//删除方法
int i=0;
Connection conn=DatabaseConnection.getConnection();
PreparedStatement ps=null;
String sql="delete from Student where id=?";
try {
ps=conn.prepareStatement(sql);
ps.setInt(1,id);
i=ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DatabaseConnection.closePs(ps);
DatabaseConnection.closeConn(conn);
}
return i;
}
@Override
public int update(Student stu) {//修改方法
int i=0;
Connection conn=DatabaseConnection.getConnection();
PreparedStatement ps=null;
String sql="update Student set name=?,id=?,age=? where id=?";
try {
ps=conn.prepareStatement(sql);
ps.setString(1, stu.getName());
ps.setInt(2, stu.getId());
ps.setInt(3,stu.getAge());
ps.setInt(4,stu.getId());
i=ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DatabaseConnection.closePs(ps);
DatabaseConnection.closeConn(conn);
}
return i;
}
@Override
public Vector<Vector<Object>> select(int id) {//查询方法
Vector<Vector<Object>> vvc=new Vector<Vector<Object>>();
Connection conn=DatabaseConnection.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
String sql="select name,id,age from Student where id = ?";
try {
ps=conn.prepareStatement(sql);
ps.setInt(1,id);
rs=ps.executeQuery();
while(rs!=null&&rs.next()){
Vector<Object> vc=new Vector<Object>();
vc.add(rs.getString(1));
vc.add(rs.getInt(2));
vc.add(rs.getInt(3));
vvc.add(vc);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DatabaseConnection.close(conn, ps, rs);
}
return vvc;
}
@Override
public Vector<Vector<Object>> selectAll() {//查询所有
Vector<Vector<Object>> vvc=new Vector<Vector<Object>>();
Connection conn=DatabaseConnection.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
try {
//查询所有数据
String sql="select name, id, age from Student";
ps = conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs!=null&&rs.next()){
Vector<Object> vc=new Vector<Object>();
vc.add(rs.getString(1));//添加gpID
vc.add(rs.getInt(2));
vc.add(rs.getInt(3));
vvc.add(vc);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DatabaseConnection.close(conn, ps, rs);
}
return vvc;
}
}
(5)DAO工厂类
package com.mipo.dao.factoryclass;
import com.mipo.dao.implementclass.StudentDAO;
/**
* DAO工厂类:
* 在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库操作。
* 这样调用时,需要知道接口和各个具体的实现类,比较麻烦。
*
* 使用DAO工厂类,可以比较方便地对代码进行管理,而且可以很好地解决后期修改的问题,通过该DAO工厂类的一个静态方法来获取DAO实现类实例。
* 这时如果要替换DAO实现类,只需要修改该Dao工厂类中的方法代码,而不必邀修改所有的操作数据库代码。
* 调用时,只需要知道接口和DAO工厂类即可,比价方便。
* @author Administrator
*
*/
public class StudentFactory {//通过DAO工厂类获取各个实现类
//获取DAO实现类实例
public static StudentDAO getStudentDAO () {
return new StudentDAO();
}
//获取xx实现类实例
/*
public static xx getxx () {
return new xx;
}
*/
}