DAO(Data Access Object) 是一个数据访问接口,数据访问:顾名思义就是和数据库打交道。夹在业务逻辑和数据库资源之间。封装了数据的增删改查操作(CRUD)。
上面图中左边部分就是我们的客户端,比如我们需要查询某个信息,我们不直接操作数据库,而是调用中间的DAO组件获取我们想要的数据。这样的话对于多个客户端就可以省去好多冗余的代码。
下图是在上图的基础上又加改进,增加了一个domain作为数据的中转。domain封装了对象的信息符合 JavaBean。
开发步骤 : 拷贝数据库驱动包
- 先创建一个表,存储信息: t_student
- 建立domain包和domain类 : Stunent
- 建立dao包和dao接口 : IStudentDAO
- 建立dao.impl 包和dao 实现类:StudentDAOImpl
- 根据DAO接口创建DAO测试类:StudentDAOTest
- 编写StudentDAOImpl中的每一个 DAO方法的实现
- 每编写一个DAO 方法的实现,就测试该功能是否正确
创建DAO 对象:
1 : 面向接口编程 :
接口变量 = new 实现类() ;
2 : DAO对象的名字,起名为xxxDAO,xxx表示对象名称.
比如 : employeeDAO ,studentDAO .
private IStudentDAO
在写代码之前,我们要有这样一张表 :
代码:
我们这里用了 javabean规范。
先写 Student 类
package com._520it._01_smis.domain;
import lombok.Getter;
import lombok.Setter;
// 学生信息
@Setter@Getter
public class Student {
private Long id ;
private String name ; // 姓名
private Integer age ; // 年龄
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
DAO接口 :
IStudentDAO.java
package com._520it._01_smis.dao;
import java.util.List;
import com._520it._01_smis.domain.Student;
// 封装的 Student 对象的CRUD 操作
// 增删改查
public interface IStudentDAO {
/**
* 保存操作
* @param stu 学生对象,封装了需要保存的信息
*/
void save(Student stu) ;
/**
* 删除操作
* id 删除指定id的学生
*
*/
void delete(Long id ) ;
/**
* 更新操作
* id : 被更改的学生 id
* newStu : 学生的新信息
*/
void update(Long id , Student newStu) ;
/**
* 查询学生的id
* 如果id存在,返回该学生对象,否则,返回null
*/
Student get(Long id ) ;
/**
* 查询并返回所有学生的信息
* @return 如果结果集为空, 返回一个空的list对象
*/
List<Student> listAll() ;
}
DAO接口的实现类 :
StudentDAOImpl.java
package com._520it._01_smis.dao.impl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com._520it._01_smis.dao.IStudentDAO;
import com._520it._01_smis.domain.Student;
// 这是 Student DAO 的实现类
public class StudentDAOImpl implements IStudentDAO{
public void save(Student stu) {
}
public void delete(Long id) {
}
public void update(Long id, Student newStu) {
}
public Student get(Long id) {
String sql = "SELECT * FROM t_student WHERE id = "+ id ;
// 声明所用的资源对象
Connection conn = null ;
Statement st = null ;
ResultSet rs = null ;
try {
// 贾琏欲执事
// 1 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver") ;
// 2 连接数据库
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","100200s+o2=so2") ;
// 创建语句对象
st = conn.createStatement() ;
// 执行SQL
rs = st.executeQuery(sql) ;
// 处理结果集
if(rs.next()) {
Student stu = new Student() ;
stu.setId(rs.getLong("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
return stu ;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
try {
if(rs !=null) {
rs.close();
}
} catch (Exception e2) {
}finally {
try {
if(conn !=null) {
conn.close();
}
}catch(Exception e3) {
}
finally {
try {
if(st !=null) {
st.close();
}
}catch(Exception e4) {
}
}
}
}
return null;
}
public List<Student> listAll() {
String sql = "SELECT * FROM t_student " ;
// 声明所用的资源对象
Connection conn = null ;
Statement st = null ;
ResultSet rs = null ;
List<Student> list = new ArrayList<>() ;
try {
// 贾琏欲执事
// 1 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver") ;
// 2 连接数据库
conn = DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","100200s+o2=so2") ;
// 创建语句对象
st = conn.createStatement() ;
// 执行SQL
rs = st.executeQuery(sql) ;
// 处理结果集
while(rs.next()) {
Student stu = new Student() ;
stu.setId(rs.getLong("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
list.add(stu) ;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
try {
if(rs !=null) {
rs.close();
}
} catch (Exception e2) {
}finally {
try {
if(conn !=null) {
conn.close();
}
}catch(Exception e3) {
}
finally {
try {
if(st !=null) {
st.close();
}
}catch(Exception e4) {
}
}
}
}
return list;
}
}
测试 :
StudentDAOTest.java
package com._520it._01_smis.test;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
import com._520it._01_smis.dao.IStudentDAO;
import com._520it._01_smis.dao.impl.StudentDAOImpl;
import com._520it._01_smis.domain.Student;
public class IStudentDAOTest {
// private 接口 xxxDAO = new 实现() ;
// private 类名 = new 实现类
private IStudentDAO dao = new StudentDAOImpl() ;
@Test
public void testSave() {
fail("Not yet implemented");
}
@Test
public void testDelete() {
fail("Not yet implemented");
}
@Test
public void testUpdate() {
fail("Not yet implemented");
}
@Test
public void testGet() {
Student stu = dao.get(5L);
System.out.println(stu);
}
@Test
public void testListAll() {
List<Student> stus = dao.listAll();
for(Student stu : stus ) {
System.out.println(stu);
}
}
}
最后运行测试类的 testGet方法
@Test
public void testGet() {
Student stu = dao.get(5L);
System.out.println(stu);
}
结果: