为什么要封装成工具类?
在入门阶段将jdbc的框架代码敲熟了以后,已经明显感觉到每一次重复的敲打是冗余的,所以我们考虑将框架封装成在一个工具类中方便以后的调用
如何封装?
- 首先,工具类的方法为静态方法,为了防止他人创建对象,应设置一个私有的无参构造方法
- 每一次的获取Connection对象,Statement对象等操作都需要进行驱动的加载,所以可以将驱动的加载的步骤放入静态代码块中
- 在给连接对象的参数赋值时,我们如果写死 url , username 和 password ,不利于以后的修改
所以可以创建的一个资源文件存放这3项数据 - 之后就可以将需要获取的 jdbc 对象进行封装,供以后的调用,甚至可以封装DML语句的执行
import java.sql.*;
import java.util.ResourceBundle;
public class DBUtil {
private static String driver;
private static String url;
private static String username;
private static String password;
//给一个私有构造方法,防止外界创建对象
private DBUtil(){}
static{
//使用资源绑定器绑定属性配置文件
ResourceBundle bundle = ResourceBundle.getBundle("com.join.jdbc01.hm01");
try {
//获取jdbc01参数
driver=bundle.getString("driver");
url=bundle.getString("url");
username=bundle.getString("username");
password=bundle.getString("password");
//加载驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取Connection对象
public static Connection getConnection(){
Connection conn=null;
try {
conn= DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//获取PreparedStatement对象
public static PreparedStatement getPreparedStatement(String sql, Connection conn){
PreparedStatement ps=null;
try {
ps =conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
//封装获取Statement对象
public static Statement getStatement(Connection conn){
Statement stmt=null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stmt;
}
//关闭资源
public static void close(ResultSet rs,Statement stmt,Connection conn){
if(rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//封装DML
public static int executeDML(String sql,Object...objs){
//创建数据库连接对象
Connection conn=DBUtil.getConnection();
//创建数据库操作对象
PreparedStatement ps=DBUtil.getPreparedStatement(sql, conn);
//占位符赋值
try {
conn.setAutoCommit(false);
for(int i=0;i<objs.length;i++){
ps.setObject(i+1, objs[i]);
}
int count = ps.executeUpdate();
if(count == 1) {
conn.commit();
}
return count;
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//关闭资源
DBUtil.close(null, ps, conn);
}
return -1;
}
}
比如在 jdbc.properties 文件中,就可以写入
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/DBname?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8
username=root
password=123123