JDBC_06封装JDBC工具类
1.有哪些代码可以封装进工具类
分析如下jdbc程序:
package com.tsccg.jdbc.util;
import java.sql.*;
/**
* @Author: TSCCG
* @Date: 2021/07/29 13:00
* 工具类抽离模板
*/
public class JdbcTest01 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/tsccg";
String user = "root";
String password = "123456";
conn = DriverManager.getConnection(url,user,password);
//3.获取预编译数据库操作对象
String sql = "select ename from emp where ename like ?";
ps = conn.prepareStatement(sql);
//给占位符赋值
ps.setString(1,"__A%");
//4.执行sql语句
rs = ps.executeQuery();
//5.处理查询结果集
while (rs.next()) {
System.out.println(rs.getString("ename"));
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
//6.释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
纵观整个程序,我们可以发现第3、5步的代码是不固定的,而第4步的代码只有一行,即使封装进工具类中,使用时也要用一行代码调用。
所以,我们可以将1、2、6这三步比较固定且冗余的代码封装进工具类中。
2.实现工具类
package com.tsccg.jdbc.util;
import java.sql.*;
/**
* @Author: TSCCG
* @Date: 2021/07/29 12:57
* jdbc工具类
*/
public class JdbcUtil {
/**
* 工具类中的方法都是静态的,不需要new对象,直接用类名调用
* 所以可将构造方法设为私有的,这是模仿在源码里的工具类中构造方法的写法
*/
private JdbcUtil() {
}
//1.注册驱动
//注册驱动只需要执行一次,可放进静态代码块中。
//只要一调用工具类,就会调用工具类的构造方法,随之就会加载静态代码块中的内容
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 2.获取连接对象
* @return 数据库连接对象
* @throws SQLException 上抛SQL异常
*/
public static Connection connect() throws SQLException {
String url = "jdbc:mysql://localhost:3306/tsccg";
String user = "root";
String password = "123456";
return DriverManager.getConnection(url,user,password);
}
/**
* 6.关闭资源
* @param rs 查询结果集
* @param stmt 可操作数据库对象
* @param conn 连接对象
*/
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
3.测试工具类
先使用工具类改造前面的程序
package com.tsccg.jdbc.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @Author: TSCCG
* @Date: 2021/07/29 13:19
* 实现模糊查询
* 使用jdbc工具类
*/
public class JdbcLikeDemo01 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.注册、2.获取连接
conn = JdbcUtil.connect();
//3.获取预编译的数据库操作对象
String sql = "select ename from emp where ename like ?";
ps = conn.prepareStatement(sql);
//查询第三个字母为A的员工名字
ps.setString(1,"__A%");
//4.执行sql语句
rs = ps.executeQuery();
//5.处理查询结果集
while (rs.next()) {
System.out.println(rs.getString("ename"));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
//6.关闭资源
JdbcUtil.close(conn,ps,rs);
}
}
}
结果:
BLAKE
CLARK
ADAMS