DBUtil——通用的数据库帮助类,可以简化Dao层的代码量。

帮助类一般建议写在 xxx.util包中

这一篇,我们编写DBUtil将JAVA学习笔记032实例中StudentDao.java代码简化,提高代码的复用性。

即将StudentDao.java 分解为通用复用文件DBUtil和StudentDao.java

 

一、原来的StudentDao.java文件源代码:

package org.student.dao;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import org.student.entity.Student;
 
 
//数据访问层:原子性的增删改查,不能再分
public class StudentDao {
//	private final String URL="jdbd:mysql://localhost:3306/three?serverTimezone=UTC";
//	private final String USERNAME="root";
//	private final String PASSWORD="prolific";
	
	private static final String URL="jdbc:mysql://localhost:3306/three?serverTimezone=UTC";
	private static final String USERNAME="root";
	private static final String PASSWORD="prolific";
 
	
	public boolean isExist(int sno) {//true:此人存在    false:此人不存在。
		return queryStudentBySno(sno)==null? false:true;
		//		if (queryStudentBySno(sno)==null) { //如果是空的,说明此人步存在,false;
//			System.out.println("is Exit=false");
//			return false;
//		}else {
//			System.out.println("is Exit=false");
//			return true;
//		}
	}
	
	//增加学生操作
	public boolean addStudent(Student student) {//zs 23 xa
		Connection connection = null;
		PreparedStatement pstmt =null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
			
			String sql="insert into student values(?,?,?,?)";
			pstmt=connection.prepareStatement(sql);
			pstmt.setInt(1, student.getSno());
			pstmt.setString(2, student.getSname());
			pstmt.setInt(3, student.getSage());
			pstmt.setString(4, student.getSaddress());
			int count=pstmt.executeUpdate();
			if (count>0) 
				return true;
			else
				return false;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}catch(Exception e) {
			e.printStackTrace();
			return false;
		}finally {
			try {
				if(connection!=null) connection.close();
				if(pstmt!=null) pstmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
				return false;
			}
		}
		
		
	}
	
	//根据学号查学生
	public Student queryStudentBySno(int sno) {
		Connection connection = null;
		PreparedStatement pstmt =null;
		ResultSet rs=null;
		Student student=null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
			String sql="select * from student where sno=?";
			pstmt=connection.prepareStatement(sql);
			pstmt.setInt(1, sno);
			rs=pstmt.executeQuery();
			if(rs.next()) {
				int no = rs.getInt("sno");
				String name = rs.getString("sname");
				int age = rs.getInt("sage");
				String address = rs.getString("saddress");
				student=new Student(no,name,age,address);
				
			}
			return student;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}catch(SQLException e) {
			e.printStackTrace();
			return null;
		}catch(Exception e) {
			e.printStackTrace();
			return null;
		}finally {
			try {
				if(rs!=null) rs.close();
				if(connection!=null) connection.close();
				if(pstmt!=null) pstmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	//查询全部学生
	public List<Student> queryAllStudents() {
		List<Student> students=new ArrayList<>();
		Connection connection = null;
		PreparedStatement pstmt =null;
		ResultSet rs=null;
		Student student=null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
			String sql="select * from student";
			pstmt=connection.prepareStatement(sql);
			rs=pstmt.executeQuery();
			while(rs.next()) {
				int no = rs.getInt("sno");
				String name = rs.getString("sname");
				int age = rs.getInt("sage");
				String address = rs.getString("saddress");
				student=new Student(no,name,age,address);
				students.add(student);
			}
			return students;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}catch(SQLException e) {
			e.printStackTrace();
			return null;
		}catch(Exception e) {
			e.printStackTrace();
			return null;
		}finally {
			try {
				if(rs!=null) rs.close();
				if(connection!=null) connection.close();
				if(pstmt!=null) pstmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
	//根据学号 删除学生
	public boolean deleteStudentBySno(int sno) {
		Connection connection = null;
		PreparedStatement pstmt =null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
			
			String sql="delete from student where sno=?";
			pstmt=connection.prepareStatement(sql);
			pstmt.setInt(1, sno);
			int count=pstmt.executeUpdate();
			if (count>0) 
				return true;
			else
				return false;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}catch(Exception e) {
			e.printStackTrace();
			return false;
		}finally {
			try {
				if(connection!=null) connection.close();
				if(pstmt!=null) pstmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
				return false;
			}
		}
	}
	
	//根据学好修改学生:根据sno知道待修改的人,在把这个人修改成student
	public boolean updateStudentBySno(int sno,Student student) {
		Connection connection = null;
		PreparedStatement pstmt =null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
			
			String sql="update student set sname=?,sage=?,saddress=? where sno=?";
			pstmt=connection.prepareStatement(sql);
			pstmt.setString(1, student.getSname());
			pstmt.setInt(2, student.getSage());
			pstmt.setString(3, student.getSaddress());
			pstmt.setInt(4, sno);
			int count=pstmt.executeUpdate();
			if (count>0) 
				return true;
			else
				return false;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}catch(Exception e) {
			e.printStackTrace();
			return false;
		}finally {
			try {
				if(connection!=null) connection.close();
				if(pstmt!=null) pstmt.close();
			}catch(SQLException e) {
				e.printStackTrace();
				return false;
			}
		}
	}
	
}

 

 

二、修改后的DBUtil.java和StudentDao.java文件源代码:

1.DBUtil.java

package ort.student.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.student.entity.Student;

//通用的数据库操作方法
public class DBUtil {
	//通用的增删改
	private static final String URL="jdbc:mysql://localhost:3306/three?serverTimezone=UTC";
	private static final String USERNAME="root";
	private static final String PASSWORD="prolific";

	public static Connection connection = null;
	public static PreparedStatement pstmt =null;
	public static ResultSet rs=null;

	
	//获取链接
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		Class.forName("com.mysql.cj.jdbc.Driver");
		return connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
	}
	
	//关闭
	public static void closeAll(ResultSet rs,Statement stmt,Connection connection) {
		try {
			if(rs!=null) rs.close();
			if(connection!=null) connection.close();
			if(pstmt!=null) pstmt.close();
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	//获取PreparedStatement
	public static PreparedStatement createPreParedStatement(String sql,Object[] params) throws SQLException, ClassNotFoundException {
		pstmt=getConnection().prepareStatement(sql);  //获取链接
		if (params!=null) {
			for (int i=0;i<params.length;i++) {
				pstmt.setObject(i+1, params[i]);
			}
		}
		return pstmt;
	}
	

	//通用的增删改
	public static boolean executeUpdate(String sql,Object[] params) {
		PreparedStatement pstmt =null;
		try {
			pstmt=createPreParedStatement(sql,params);
			int count=pstmt.executeUpdate();
			if (count>0) 
				return true;
			else
				return false;

		}catch(SQLException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.printStackTrace();
			return false;
		}finally {
			closeAll(null,pstmt,connection);
		}
		return false;
	}
	
	//通用的查
	public static ResultSet executeQuery(String sql,Object[] params) throws ClassNotFoundException, SQLException {
			pstmt=createPreParedStatement(sql,params);
			rs=pstmt.executeQuery();
			return rs;
	}
}

2.StudentDao.java

package org.student.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.student.entity.Student;

import ort.student.util.DBUtil;


//数据访问层:原子性的增删改查,不能再分
public class StudentDao {
	private static final String URL="jdbc:mysql://localhost:3306/three?serverTimezone=UTC";
	private static final String USERNAME="root";
	private static final String PASSWORD="prolific";
	
	public boolean isExist(int sno) {//true:此人存在    false:此人不存在。
		return queryStudentBySno(sno)==null? false:true;
	}
	
	//根据学号查学生
	public Student queryStudentBySno(int sno){
		String sql="select * from student where sno=?";
		Connection connection = null;
		PreparedStatement pstmt =null;
		ResultSet rs=null;
		Student student=null;
		Object[] params= {sno};
		try {
//			Class.forName("com.mysql.cj.jdbc.Driver");
//			connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);
//			pstmt=connection.prepareStatement(sql);
//			pstmt.setInt(1, sno);
//			rs=pstmt.executeQuery();
			
			rs=DBUtil.executeQuery(sql,params);
			if(rs.next()) {
				int no = rs.getInt("sno");
				String name = rs.getString("sname");
				int age = rs.getInt("sage");
				String address = rs.getString("saddress");
				student=new Student(no,name,age,address);
				
			}
			return student;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}catch(SQLException e) {
			e.printStackTrace();
			return null;
		}catch(Exception e) {
			e.printStackTrace();
			return null;
		}finally {
			DBUtil.closeAll(rs, pstmt, connection);
		}
	}
	
	//查询全部学生
	public List<Student> queryAllStudents() {
		List<Student> students=new ArrayList<>();
		PreparedStatement pstmt =null;
		ResultSet rs=null;
		Student student=null;
		try {
			String sql="select * from student";
			rs=DBUtil.executeQuery(sql,null);
			while(rs.next()) {
				int no = rs.getInt("sno");
				String name = rs.getString("sname");
				int age = rs.getInt("sage");
				String address = rs.getString("saddress");
				student=new Student(no,name,age,address);
				students.add(student);
			}
			return students;
			
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}catch(SQLException e) {
			e.printStackTrace();
			return null;
		}catch(Exception e) {
			e.printStackTrace();
			return null;
		}finally {
				DBUtil.closeAll(rs,pstmt,DBUtil.connection);
//			try {
//				if(rs!=null) rs.close();
//				if(DBUtil.connection!=null) DBUtil.connection.close();
//				if(pstmt!=null) pstmt.close();
//			}catch(SQLException e) {
//				e.printStackTrace();
//			}
		}
	}
	
	//增加学生操作
	public boolean addStudent(Student student) {//zs 23 xa
		String sql="insert into student values(?,?,?,?)";
		Object[] params= {student.getSno(),student.getSname(),student.getSage(),student.getSaddress()};
		return DBUtil.executeUpdate(sql,params);
	}
	
	//根据学号 删除学生
	public boolean deleteStudentBySno(int sno) {
		String sql="delete from student where sno=?";		
		Object[] params= {sno};
		return DBUtil.executeUpdate(sql,params);
	}
	
	//根据学号修改学生:根据sno知道待修改的人,在把这个人修改成student
	public boolean updateStudentBySno(int sno,Student student) {
		String sql="update student set sname=?,sage=?,saddress=? where sno=?";
		Object[] params=  {student.getSname(),student.getSage(),student.getSaddress(),sno};
		return DBUtil.executeUpdate(sql,params);
	}
}

以上替换代码经验证,增删改查均运行正常。

留待学习的地方:try{ }catch{}finalll{}结构的使用,和常用的方法。

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐