34 jdbc工具封装

java是一门面向对象的语言,对于重复的代码,我们能封装就封装,在32节中,我们写了student表的的dao层,能用,但有很多重复代码,比如加载驱动,获取Connection对象等,我们可以将它们封装到一个类中。

同样地,我们创建一个Util包用来存放封装的工具,创建一个JdbcUtil类用来封装我们的jdbc相关的重复代码。

properties配置文件

我们将加载jdbc的关键数据:driver 驱动器类全地址,url,username数据库登录用户名,password对应密码 封装在一个文件中,起名db.properties 放在src目录下。

注意:文件中的内容应为:属性=属性名形式,多个属性直接回车换行隔开,不适用引号,不留空格。如下:

JdbcUtil类设计思路

  • 声明配置文件对应的四个变量
  • 静态块加载 读取db.properties文件给上面四个变量赋值,加载驱动面
  • 创建下满几个方法:
    • getConnection()  获取Connection对象
    • getStatement()  获取Statement对象,只用在查询上(如果用在增删改无法避免sql注入)
    • getPreparedStatement() 获取PreparedStatement对象,用在增删改上
    • executeDML()  执行SQL语句的方法
    • closeAll() 关闭资源的方法

需要注意的知识点

获取db.properties文件中的属性

  • 使用Properties类配合配置文件的输入流获取属性
  • 动态获取文件流:当前类名.class.getResourceAsStream(相对地址);
  • 获取属性:Properties对象.getProperty(属性名)

完整代码

package com.xiaohei.tools;

import java.io.IOException;
import java.io.InputStream;
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.Properties;

public class JdbcUtil {
	//声明jdbc参数
	private static String driver = null;
	private static String url = null;
	private static String username = null;
	private static String password = null;
	
	static {
		//创建properties对象获取属性问价的内容
		Properties p = new Properties();
		//获取属性文件的读取流对象(动态获取资源)
		InputStream is = JdbcUtil.class.getResourceAsStream("/db.propreties");
		try {
			//加载配置文件
			p.load(is);
			driver = p.getProperty("driver");
			url = p.getProperty("url");
			username = p.getProperty("username");
			password = p.getProperty("password");
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		//加载驱动
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//获取conn
	public static Connection getConnection() {
		Connection conn =null;
		try {
			 conn = DriverManager.getConnection(url,username,password);
			 conn.setAutoCommit(false);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	//获取statement
	public static Statement getStatement(Connection conn) {
		
		Statement stmt = null;
		try {
			stmt = conn.createStatement();
			return stmt;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stmt;
	}
	//获取PreparedStatement
	public static PreparedStatement getPreparedStatement(Connection conn,String sql) {
		PreparedStatement stmt = null;
		try {
			stmt  = conn.prepareStatement(sql);
			return stmt;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
		
	}
	
	//DML方法
	public static int executeDML(String sql,Object...objs) {
		//创建连接对象
		Connection conn = getConnection();
		//创建ps对象
		PreparedStatement ps = JdbcUtil.getPreparedStatement(conn,sql);
		//给占位符赋值
		for(int i=0;i<objs.length;i++) {
			try {
				ps.setObject(i+1, objs[i]);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		//执行SQL命令
		int i = -1;
		try {
			i = ps.executeUpdate();
			//手动提交
			conn.commit();
		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		//关闭资源
		JdbcUtil.closeAll(null,ps,conn);
		//返回结果
		return i;
	}
		
		
		
	

	public static void closeAll(ResultSet rs, PreparedStatement ps, Connection conn) {
		try {
			if(rs!=null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

  

StudentDaoImpl的修改

代码:

package com.xiaohei.daoimpl;
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 com.xiaohei.pojo.Student;
import com.xiaohei.tools.JdbcUtil;

public class StudentDaoImpl {
	private ArrayList<Student> list;
	public StudentDaoImpl() {

	}
	
	/**
	 * 增加一个学生通过姓名,年龄和金钱
	 * @param sname 学生姓名,sage 学生年龄,money 钱
	 * @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数
	 */
	public int insertStu(String sname,int sage,double money) {
		//sql语句
		String sql = "insert into student values(stu_seq.nextval,?,?,?)";
		//执行SQL语句
		int i = JdbcUtil.executeDML(sql, sname,sage,money);
		//处理结果
		return i;
	}
	
	/**
	 * 删除学生按指定的学号
	 * @param sno 学生学号
	 * @return i 返回-1表示失败,返回其它值表示成功执行的SQL语句条数
	 */
	public int deleteStu(int sno) {
		//sql
		String sql = "delete from student where sno =?";
		//执行SQL
		int i = JdbcUtil.executeDML(sql, sno);
		//处理结果
		return i;
	}
    
	/**
	 * update操作:修改学生姓名,年龄和金钱 通过 学生sno
	 * @param sno 学生学号
	 * @return
	 */
	public int updateStu(int sno,String sname,int sage,double money) {
		//sql语句
		String sql = "update student set sname=?,sage=?,money=? where sno=?";
		int i = JdbcUtil.executeDML(sql,sname,sage,money,sno);
		//处理结果
		return i;
	}
	
	/**
	 * 查询
	 * @return 返回一个ArrayList<Student>对象
	 */
	public ArrayList<Student> queryStu(){
		list = new ArrayList<>(); 
		Connection conn = null;
		try {
			conn = JdbcUtil.getConnection();
			//SQL语句
			String sql = "select * from student order by sno";
			//stmt
			Statement stmt = JdbcUtil.getStatement(conn);
			ResultSet set = stmt.executeQuery(sql);
			//处理结果
			while(set.next()) {
				Student s = new Student();
				s.setSno(set.getInt("sno"));
				s.setSage(set.getInt("sage"));
				s.setSname(set.getString("sname"));
				s.setMoney(set.getDouble("money"));
				list.add(s);
			}
			return list;
		}catch(SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
}

  

原文地址:https://www.cnblogs.com/Scorpicat/p/12322378.html