一.概念理解
通过封装对数据源的所有访问,管理与数据源的连接获取其中的数据,实现与数据源的相关的访问机制。
解决的问题:业务对象和数据访问代码完全耦合在一起,代码混乱,不容易扩展,业务对象应该关注的是业务逻辑,不应该关心数据存取的细节,DAO商业组件只对他的客户端暴露一些非常简单的DAO外部接口,而将数据源的实现细节对客户端完全的隐藏了起来.DAO低层数据源的实现发生改变时不影响客户端和商业组件之间的交流,DAO在组件和数据源之间扮演着协调者的角色.。
实现原理:DAO提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离,对上层提供面向对象的数据访问接口。(因为数据源的不同,访问数据的方法也会有所不同,访问持久化的数据源,比如数据库,也会由于其存储类型的不同(关系数据库,面向对象的数据库,简单文件储存,其他方式)和提供商自定义数据类型的不同而有很大的区别 。
如果把连接数据库和数据的操作代码和这些组件写在一起的话,会导致这些组件和数据库操作之间的耦合,这种耦合的存在,使得在应用程序中从当前数据源类型迁移到另一种数据源类型变的十分困难和乏味. 如果数据源改变了,那么你的组件也不得不改变来适应新的数据源.)
优点:DAO设计模式可以减少代码量,增强程序的可移植性,提高代码的可读性。
二.具体实现
数据访问对象接口:定义了一个在模型对象上要执行的标准操作。
数据访问对象实体类:实现了上述接口,负责从数据源获取数据,数据源可以是数据库,也可以是xml,或者是其他的存储机制。
模型对象/数值对象:简单的POJO,包含了get/set方法来存储使用DAO类检索到的数据。
具体实现:
1.数据源:任何类型的数据源
2.DAO:抽象或者封装了所有对底层数据访问的方法
3.客户端的商业对象:指的是客户端,通常要去访问数据源已获得数据或者存储数据
4.传递对象:数据的载体,例如实体bean
三.主要对象介绍
1.PreparedStatement对象:执行已经编译的SQL语句,执行效率比Statement的高,通过集成Statement实现的
- 可以在执行过程中向该对象中的sql语句传递参数 对于sql中每个输入参数都保
- 留一个问好“?”作为占位符
- 每个?占位符的值必须在该语句执行前被赋值
1.1创建方法:通过接口创建
PreparedStatement ps = connection. prepareStatement(sql);
1.2传递参数
- 在执行PreparedStatement 对象之前,为每个?赋值
- 调用PreparedStatement 的setXXX()方法来完成其中xxx是和参数相应的类型。
- 传递参数的时候对应的序号是从1开始,且和sql中的?问好对应
1.3执行语句
在使用PreparedStatement 对象设置sql语句以及对应的参数后,可以使用executeUpdate(),execute(),executeQuery()方法让其开始执行操作。
1.4使用
- 在PreparedStatement 中设置的sql语句可以反复的使用,如果没有被其他的sql语句覆盖的话
- 如果想清除PreparedStatement 对象中的sql语句可以使用Connection中的clearParameters()方法执行
2.CallableStatement对象
1.CallableStatement类继承了PreparedStatement类,主要用于执行SQL存储过程,JDBC API提供了一个SQL存储过程的转义语法,该语法允许对所有RDBMS使用标准方式调用存储过程;该语法有一个包含结果参数的形式和一个不包含结果参数的形式
- 如果使用了包含结果参数的形式,则必须将结果参数注册为OUT型参数。 结果
- 参数以外的其他参数可用于输入、输出或同时用于二者。
- 参数是按数字形式引用,第一个参数的序号是1。
2.使用
CallableStatement是用Connection方法创建的
CallableStatement cst = connection.prepareCall(“{ call getTestData( ?, ? ) }”);
3.常用的方法
1.setString( String parameterName, String x )
2.将指定参数设置为给定的JAVA String值。
3.registerOutParameter( int parameterIndex, int sqlType )
4.按顺序位置parameterIndex将OUT参数注册为JDBC类型sqlType。 getString( int
5.parameterIndex ) 以JAVA编程语言中String的形式检索指定的JDBC
6.CHAR、VARCHAR或LONGVARCHAR参数的值(获得结果)。
四.实战代码
Person.java
// 值对象,包含属性,setter,getter方法
public class Person {
private int id;
private String name;
private String password;
private int age;
private String email;
// 生成getter、setter方法
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(int age) {
this.age = age;
}
public void setEmail(String email) {
this.email = email;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getPassword() {
return this.password;
}
public int getAge() {
return this.age;
}
public String getEmail() {
return this.email;
}
}
PersonDAO.java
// 规定出了操作person表在此项目里的全部方法
public interface PersonDAO {
// 增加操作
public void insert(Person person) throws Exception;
// 修改操作
public void update(Person person) throws Exception;
// 删除操作
public void delete(String id) throws Exception;
// 按ID查询操作
public Person queryById(int id) throws Exception;
// 查询全部
public List queryAll() throws Exception;
// 模糊查询
public List queryByLike(String cond) throws Exception;
}
PersonDAOImpl.java
// 此类需要完成具体的数据库操作,需要JDB代码
public class PersonDAOImpl implements PersonDAO {
// 增加操作
public void insert(Person person) throws Exception {
String sql =
"INSERT INTO person (name,password,age,email) VALUES (?,?,?,?)";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
// 下面是针对数据库的具体操作
try {
// 连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
//pstmt.setString(1, person.getId());
pstmt.setString(2, person.getName());
pstmt.setString(3, person.getPassword());
pstmt.setInt(4, person.getAge());
pstmt.setString(5, person.getEmail());
// 进行数据库更新操作
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally {
// 关闭数据库连接
dbc.close();
}
}
// 修改操作
public void update(Person person) throws Exception {
String sql =
"UPDATE person SET name=?,password=?,age=?,email=? WHERE id=?";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
// 下面是针对数据库的具体操作
try {
// 连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setString(1, person.getName());
pstmt.setString(2, person.getPassword());
pstmt.setInt(3, person.getAge());
pstmt.setString(4, person.getEmail());
pstmt.setInt(5, person.getId());
// 进行数据库更新操作
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally {
// 关闭数据库连接
dbc.close();
}
}
// 删除操作
public void delete(int id) throws Exception {
String sql = "DELETE FROM person WHERE id=?";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
// 下面是针对数据库的具体操作
try {
// 连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setInt(1, id);
// 进行数据库更新操作
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally {
// 关闭数据库连接
dbc.close();
}
}
// 按ID查询操作
public Person queryById(int id) throws Exception {
Person person = null;
String sql = "SELECT id,name,password,age,email FROM person WHERE id=?";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
// 下面是针对数据库的具体操作
try {
// 连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
pstmt.setInt(1, id);
// 进行数据库查询操作
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
// 查询出内容,之后将查询出的内容赋值给person对象
person = new Person();
person.setId(rs.getInt(1));
person.setName(rs.getString(2));
person.setPassword(rs.getString(3));
person.setAge(rs.getInt(4));
person.setEmail(rs.getString(5));
}
rs.close();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally {
// 关闭数据库连接
dbc.close();
}
return person;
}
// 查询全部
public List queryAll() throws Exception {
List all = new ArrayList();
String sql = "SELECT id,name,password,age,email FROM person";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
// 下面是针对数据库的具体操作
try {
// 连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
// 进行数据库查询操作
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
// 查询出内容,之后将查询出的内容赋值给person对象
Person person = new Person();
person.setId(rs.getInt(1));
person.setName(rs.getString(2));
person.setPassword(rs.getString(3));
person.setAge(rs.getInt(4));
person.setEmail(rs.getString(5));
// 将查询出来的数据加入到List对象之中
all.add(person);
}
rs.close();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally {
// 关闭数据库连接
dbc.close();
}
return all;
}
// 模糊查询
public List queryByLike(String cond) throws Exception {
List all = new ArrayList();
String sql = "SELECT id,name,password,age,email FROM person WHERE name LIKE ? or email LIKE ?";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
// 下面是针对数据库的具体操作
try {
// 连接数据库
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
// 设置模糊查询条件
pstmt.setString(1, "%" + cond + "%");
pstmt.setString(2, "%" + cond + "%");
// 进行数据库查询操作
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
// 查询出内容,之后将查询出的内容赋值给person对象
Person person = new Person();
person.setId(rs.getInt(1));
person.setName(rs.getString(2));
person.setPassword(rs.getString(3));
person.setAge(rs.getInt(4));
person.setEmail(rs.getString(5));
// 将查询出来的数据加入到List对象之中
all.add(person);
}
rs.close();
pstmt.close();
} catch (Exception e) {
throw new Exception("操作出现异常");
} finally {
// 关闭数据库连接
dbc.close();
}
return all;
}
}
DAOFactory.java
public class DAOFactory {
public static PersonDAO getPersonDAOInstance() {
return new PersonDAOImpl();
}
}
TestDemo.java
public class TestDemo {
public static void main(String args[]) {
TestDemo.testInsert();
}
//测试插入方法
public static void testInsert() {
Person person = new Person(); //实例化数据bean
person.setId("ZS");
person.setName("张三");
person.setPassword("zzzzzz");
person.setAge(30);
person.setEmail("zs@126.com");
//通过工厂得到personDAO对象
PersonDAO dao = DAOFactory.getPersonDAOInstance();
try {
dao.insert(person); //插入操作,把数据bean传入
System.out.println("插入成功");
} catch (Exception e) {
System.out.println("插入失败");
e.printStackTrace();
}
}
//测试修改方法
public void testUpdate() {
Person person = new Person(); //实例化数据bean
person.setId("ZS");
person.setName("张三");
person.setPassword("yyyyyy");
person.setAge(30);
person.setEmail("zs@126.com");
//通过工厂得到personDAO对象
PersonDAO dao = DAOFactory.getPersonDAOInstance();
try {
dao.update(person);
System.out.println("更新成功");
} catch (Exception e) {
System.out.println("更新失败");
e.printStackTrace();
}
}
//测试根据ID查找方法
public void testIdSelect() {
PersonDAO dao = DAOFactory.getPersonDAOInstance();
try {
Person person = dao.queryById("ZS");
System.out.println(person.getName());
System.out.println(person.getPassword());
System.out.println(person.getAge());
System.out.println(person.getEmail());
} catch (Exception e) {
System.out.println("查询失败");
e.printStackTrace();
}
}
//测试查询所有纪录方法
public void testAllSelect() {
PersonDAO dao = DAOFactory.getPersonDAOInstance();
try {
List list = dao.queryAll();
Iterator iter = list.iterator();
while (iter.hasNext()) {
Person person = (Person) iter.next();
System.out.print(person.getId() + " ");
System.out.print(person.getName() + " ");
System.out.print(person.getAge() + " ");
System.out.print(person.getPassword() + " ");
System.out.print(person.getEmail() + " ");
System.out.println();
}
} catch (Exception e) {
System.out.println("更新失败");
e.printStackTrace();
}
}
}