3.3 Java与数据库(三)DAO设计模式

一、DAO设计模式概述

1、DAO模式是标准的J2EE设计模式之一,开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开,减少了代码的耦合度。

2、DAO设计模式第一个层:称之为实体类层。

3、DAO设计模式的项目结构如下:

(1)cn.bean包:存放用户属性类。

(2)cn.dao包:利用接口,设计和用户类的相关方法。

(3)cn.dao.impl包:用于实现cn.dao中的方法。

(4)cn.dbc包:存放数据库的连接以及关闭类。

(5)cn.demo包:项目和演示和运行。




二、DAO案例:学生信息管理系统

1、前期准备:新建项目,重新构建路径,添加JUnit4库和mysql-connector-java-5.1.45-bin.jar包。

2、利用Navicat新建数据库myuser,并建立表,结构如下:


3、新建cn.bean包,代码如下:

//Grade.java

package cn.bean;

public class Grade {
	/*
	 * 年级信息类
	 */
	private int id;
	private String gra;
	
	public Grade() {
		super();
	}
	public Grade(int id, String gra) {
		super();
		this.id = id;
		this.gra = gra;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getGra() {
		return gra;
	}
	public void setGra(String gra) {
		this.gra = gra;
	}
	

}

//Student.java

package cn.bean;

public class Student {
	/*
	 * 学生信息类
	 */
	private int id;
	private String sname;
	private String ssex;
	private String sdate;
	private String phone;
	private int gid;
	
	public Student() {
		super();
	}
	public Student(int id, String sname, String ssex, String sdate, String phone, int gid) {
		super();
		this.id = id;
		this.sname = sname;
		this.ssex = ssex;
		this.sdate = sdate;
		this.phone = phone;
		this.gid = gid;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getSsex() {
		return ssex;
	}
	public void setSsex(String ssex) {
		this.ssex = ssex;
	}
	public String getSdate() {
		return sdate;
	}
	public void setSdate(String sdate) {
		this.sdate = sdate;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public int getGid() {
		return gid;
	}
	public void setGid(int gid) {
		this.gid = gid;
	}
}

4、新建cn.dao包,代码如下:

//GradeDao.java

package cn.dao;

import cn.bean.Grade;

public interface GradeDao {
	/*
	 * 设计和Grade类相关的方法
	 */
	public void findAllGrade(); //查询所有年级信息
	
	public Grade findGradeById(int id);

}

//StudentDao.java

package cn.dao;

import cn.bean.Student;

public interface StudentDao {
	public boolean doStudent(int id,int gid,String sname,String ssex);
	
	public boolean delStudent(int id);
	
	public boolean updateStudent(int id,String sname);
	
	public void findAllStudentByGid(int gid);  //查询某个年级的所有学生
	
	public Student findStudentById(int id); //查询具体学号的学生

}

5、新建cn.dao.impl包,代码如下:

//GradeDaoImpl.java

package cn.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.bean.Grade;
import cn.dao.GradeDao;
import cn.dbc.BaseDao;

public class GradeDaoImpl implements GradeDao {
	BaseDao bs=new BaseDao();
	Connection conn=null;
	PreparedStatement pstmt=null;
	ResultSet rs=null;
	

	@Override
	public void findAllGrade() {
		conn=bs.getConnection();
		if(conn!=null) {
			String sql="select * from grade";
			try {
				pstmt=conn.prepareStatement(sql);
				rs=pstmt.executeQuery();
				while(rs.next()){
					System.out.println(rs.getInt(1)+"\t"+rs.getString(2));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}

	}

	@Override
	public Grade findGradeById(int id) {
		Grade g=null;
		conn=bs.getConnection();
		if(conn!=null){
			String sql="select * from grade where id=?";
			try {
				pstmt=conn.prepareStatement(sql);
				pstmt.setInt(1, id);
				rs=pstmt.executeQuery();
				if(rs.next()){
					g=new Grade();
					g.setId(rs.getInt(1));
					g.setGra(rs.getString(2));
					System.out.println(rs.getInt(1)+"\t"+rs.getString(2));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}
		return null;
	}

}

//StudentDaoImpl.java

package cn.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.bean.Student;
import cn.dao.StudentDao;
import cn.dbc.BaseDao;

public class StudentDaoImpl implements StudentDao {
	BaseDao bs=new BaseDao();
	Connection conn=null;
	PreparedStatement pstmt=null;
	ResultSet rs=null;

	@Override
	public boolean doStudent(int id,int gid,String sname,String ssex) {
		conn=bs.getConnection();
		if(conn!=null){
			String sql="insert into stu(id,gid,sname,ssex) values(?,?,?,?)";
			try {
				pstmt=conn.prepareStatement(sql);
				pstmt.setInt(1,id);
				pstmt.setInt(2,gid);
				pstmt.setString(3,sname);
				pstmt.setString(4,ssex);
				int num=pstmt.executeUpdate();
				if(num>0)
				{
					System.out.println("添加成功");
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}
		return false;
	}

	@Override
	public boolean delStudent(int id) {
		conn=bs.getConnection();
		if(conn!=null){
			String sql="delete from stu where id=?";		
			try {
				pstmt=conn.prepareStatement(sql);
				pstmt.setInt(1,id);
				int num=pstmt.executeUpdate();
				if(num>0)
				{
					System.out.println("删除成功!");
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}
		return false;
	}

	@Override
	public boolean updateStudent(int id, String sname) {
		conn=bs.getConnection();
		if(conn!=null){
			String sql="update stu set sname=? where id=?";
			try {
				pstmt=conn.prepareStatement(sql);
				pstmt.setString(1,sname);
				pstmt.setInt(2,id);
				int num=pstmt.executeUpdate();
				if(num>0)
				{
					System.out.println("修改成功");
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}
		return false;
	}

	@Override
	public void findAllStudentByGid(int gid) {
		conn=bs.getConnection();
		if(conn!=null){
			String sql="select * from stu where gid=?";
			try {
				pstmt=conn.prepareStatement(sql);
				pstmt.setInt(1, gid);
				rs=pstmt.executeQuery();
				while(rs.next()){
					System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4)+"\t"+rs.getString(5)+"\t"+rs.getString(6));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}

	}

	@Override
	public Student findStudentById(int id) {
		conn=bs.getConnection();
		if(conn!=null){
			String sql="select * from stu where id=?";		
			try {
				pstmt=conn.prepareStatement(sql);
				pstmt.setInt(1, id);
				rs=pstmt.executeQuery();
				while(rs.next()){
					System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4)+"\t"+rs.getString(5)+"\t"+rs.getString(6));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				bs.closeConn(conn, pstmt, rs);
			}
		}
		return null;
	}

}

6、新建cn.dbc包,代码如下:

//BaseDao.java

package cn.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.sql.PreparedStatement;


public class BaseDao {
	public Connection getConnection(){
		Connection conn=null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/myuser?characterEncoding=utf-8", "root", "123456");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public void closeConn(Connection conn,PreparedStatement pstmt,ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(pstmt!=null){
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}

7、新建n.demo包,代码如下:

//Demo.java

package cn.demo;
import org.junit.Test;

import cn.dao.*;
import cn.dao.impl.GradeDaoImpl;
import cn.dao.impl.StudentDaoImpl;
import java.util.Scanner;



public class Demo {
	Scanner input=new Scanner(System.in);
	@Test
	public void testgrade(){
		GradeDao grade = new GradeDaoImpl();
		grade.findAllGrade();
		System.out.println("请输入年级号:");
		int a=input.nextInt();
		grade.findGradeById(a);
		System.out.println();
	}
	//添加数据
	@Test
	public void teststudent(){
		StudentDao student=new StudentDaoImpl();
		System.out.println("请输入您要添加的学生学号:");
		int a=input.nextInt();
		System.out.println("请输入您要添加的学生年级:");
		int b=input.nextInt();
		System.out.println("请输入您要添加的学生姓名:");
		String c=input.next();
		System.out.println("请输入您要添加的学生性别:");
		String d=input.next();
		student.doStudent(a,b,c,d);
	}
	
	//修改数据
	@Test
	public void test02(){
		StudentDao student=new StudentDaoImpl();
		System.out.println("请输入您要修改的学生学号:");
		int a=input.nextInt();
		System.out.println("请输入您要修改的学生姓名:");
		String b=input.next();
		student.updateStudent(a, b);
	}
	
	//删除数据
	@Test
	public void test03(){
		StudentDao student=new StudentDaoImpl();
		System.out.println("请输入您要删除的学生学号:");
		int a=input.nextInt();
		student.delStudent(a);
	}
	
	
	//查询一个年级的所有学生
	@Test
	public void test04(){
		StudentDao student=new StudentDaoImpl();
		System.out.println("请输入您要查询的年级号:");
		int a=input.nextInt();
		student.findAllStudentByGid(a);
	}
	
	//查询某个学生的信息
	@Test
	public void test05(){
		StudentDao student=new StudentDaoImpl();
		System.out.println("请输入您要查询的学生学号:");
		int a=input.nextInt();
		student.findStudentById(a);
	}


}



Java与数据库相关知识:


3.1 Java与数据库(一)数据库概述

3.2 Java与数据库(二)JDBC连接数据库

3.3 Java与数据库(三)DAO设计模式

3.4 Java与数据库(四)数据库总结



猜你喜欢

转载自blog.csdn.net/qq_40254536/article/details/80917236
3.3