1、什么事DAO
DAO是Data Access Object数据访问接口,就是与数据库打交道。夹在业务逻辑与数据库资源中间
DAO模式实际上是两个模式的组合即Data Accessor(数据访问者)模式和Active Domain Object(领域对象)模式。
Data Accessor模式实现了数据访问和业务逻辑的分类
Active Domain Object模式实现了业务数据的对象化封装
2、实现DAO模式
一个典型的DAO实现有下列几个组件
一个DAO接口;
一个实现DAO接口的具体类;
数据传递对象(DTO),有时候叫做值对象(VO),或领域模型(domain)
DBUtils工具类
package com.util.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
/*
* 数据库操作工具类
*
*/
public class DBUtils {
public static String URL ;
public static String USERNAME ;
public static String PASSWORD ;
public static String DRIVER ;
private static ResourceBundle rb=ResourceBundle.getBundle("com.util.db.db-config");
private DBUtils(){}
//使用静态块加载驱动程序
static{
URL=rb.getString("jdbc.url");
USERNAME=rb.getString("jdbc.username");
PASSWORD=rb.getString("jdbc.password");
DRIVER=rb.getString("jdbc.driver");
try {
Class.forName(DRIVER);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("加载数据库驱动失败");
}
}
//定义一个获取数据可连接的方法
public static Connection getConnection(){
Connection conn=null;
try {
conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("获取连接失败");
}
return conn;
}
/*
* 关闭数据库连接
*/
public static void close(ResultSet rs,Statement stat,Connection conn){
try {
if(rs!=null)rs.close();
if(stat!=null)stat.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
PersonDAO接口
package com.vince.dao;
import java.sql.SQLException;
import java.util.List;
import com.vince.domain.Person;
public interface PersonDAO {
//添加方法
public void add(Person p) throws SQLException;
//更新方法
public void update(Person p)throws SQLException;
//删除方法
public void delete(int id)throws SQLException;
//查找方法
public Person findById(int id) throws SQLException;
//查找所有
public List<Person> findAll() throws SQLException;
}
PersonDAO实现类
package com.vince.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.util.db.DBUtils;
import com.vince.dao.PersonDAO;
import com.vince.domain.Person;
public class PersonDaoImpl implements PersonDAO {
/*
* 这是PersonDAO的具体实现类
*
* @see com.vince.dao.PersonDAO#add(com.vince.domain.Person)
*/
@Override
public void add(Person p) throws SQLException {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
String sql = "insert into person(name,age,des) values(?,?,?)";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, p.getName());
ps.setInt(2, p.getAge());
ps.setString(3, p.getDes());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw new SQLException("添加信息失败");
}finally{
DBUtils.close(null,ps,conn);
}
}
@Override
public void delete(int id) throws SQLException {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
String sql = "delete from person where id=?";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1,id);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw new SQLException("删除信息失败");
}finally{
DBUtils.close(null,ps,conn);
}
}
@Override
public List<Person> findAll() throws SQLException {
// TODO Auto-generated method stub
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
Person p=null;
List<Person> persons=new ArrayList<Person>();
String sql="select id,name,age,des from person";
try {
conn=DBUtils.getConnection();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
p=new Person();
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setAge(rs.getInt(3));
p.setDes(rs.getString(4));
persons.add(p);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
throw new SQLException("查询所有数据失败");
}finally{
DBUtils.close(rs, ps, conn);
}
return persons;
}
@Override
public Person findById(int id) throws SQLException {
// TODO Auto-generated method stub
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
Person p=null;
String sql="select name,age,des from person where id=? ";
try {
conn=DBUtils.getConnection();
ps=conn.prepareStatement(sql);
ps.setInt(1, id);
rs=ps.executeQuery();
if(rs.next()){
p=new Person();
p.setId(id);
p.setName(rs.getString(1));
p.setAge(rs.getInt(2));
p.setDes(rs.getNString(3));
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
throw new SQLException("根据ID查询失败");
}finally{
DBUtils.close(rs, ps, conn);
}
return p;
}
@Override
public void update(Person p) throws SQLException {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
String sql = "update person set name=?,age=?,des=? where id=?";
try {
conn = DBUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, p.getName());
ps.setInt(2, p.getAge());
ps.setString(3, p.getDes());
ps.setInt(4, p.getId());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
throw new SQLException("更新信息失败");
}finally{
DBUtils.close(null,ps,conn);
}
}
}
Person实体类
package com.vince.domain;
public class Person {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
private int id;
private String name;
private int age;
private String des;
public Person(int id, String name, int age, String des) {
super();
this.id = id;
this.name = name;
this.age = age;
this.des = des;
}
@Override
public String toString() {
return "Person [age=" + age + ", des=" + des + ", id=" + id + ", name="
+ name + "]";
}
public Person(String name, int age, String des) {
super();
this.name = name;
this.age = age;
this.des = des;
}
public Person() {
// TODO Auto-generated constructor stub
}
}