DAO实现之DQL操作

DAO(Data Access Object) 是一个数据访问接口,数据访问:顾名思义就是和数据库打交道。夹在业务逻辑和数据库资源之间。封装了数据的增删改查操作(CRUD)。

QQ图片20191029205853.png

  上面图中左边部分就是我们的客户端,比如我们需要查询某个信息,我们不直接操作数据库,而是调用中间的DAO组件获取我们想要的数据。这样的话对于多个客户端就可以省去好多冗余的代码。

  下图是在上图的基础上又加改进,增加了一个domain作为数据的中转。domain封装了对象的信息符合 JavaBean。 QQ图片20191029205853.png

开发步骤 : 拷贝数据库驱动包

  1. 先创建一个表,存储信息: t_student
  2. 建立domain包和domain类 : Stunent
  3. 建立dao包和dao接口 : IStudentDAO
  4. 建立dao.impl 包和dao 实现类:StudentDAOImpl
  5. 根据DAO接口创建DAO测试类:StudentDAOTest
  6. 编写StudentDAOImpl中的每一个 DAO方法的实现
  7. 每编写一个DAO 方法的实现,就测试该功能是否正确

创建DAO 对象: 1 : 面向接口编程 : 接口变量 = new 实现类() ; 2 : DAO对象的名字,起名为xxxDAO,xxx表示对象名称. 比如 : employeeDAO ,studentDAO . private IStudentDAO dao = new StudentDAOImpl() ;

                              

在写代码之前,我们要有这样一张表 :

代码: 我们这里用了 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);
	}

结果:

QQ图片20191029212539.png

# jdbc 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×