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;
}
}

浙公网安备 33010602011771号