1. 目标:
- 测试 DButil 功能
- 模糊查询 功能如何实现?
- 例如: 查询 userInfo 表里, 用户第二个字母为 a 的用户?
- (数据表如下:可以自定义查询的表和功能,如姓张的所有用户)
2. 创建 util 工具类(封装)
把 JDBC 中的 1. 注册驱动,2. 连接数据库,3. 释放资源,全部封装进 DButil 工具类里。
public class DButil {
/*
* 1. 工具类中的构造方法都是私有的
* 2. 工具类中的方法都是静态的,不需要new对象,直接采用类名调用
*/
private DButil (){}
// 静态代码在类加载时执行,并且只执行一次
static {
try {
// 1.注册驱动(只需要注册一次)
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 2. 获取连接对象
public static Connection getConnection() throws SQLException {
// 测试类中接收这里抛出的异常
return DriverManager.getConnection("jdbc:mysql://localhost:3306/school", "root", "root");
}
/*
* 释放资源
* @param conn 连接对象
* @param ps 数据库操作对象
* @param rs 结果集
*/
public static void release(Connection conn, PreparedStatement ps, ResultSet rs){
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3. 建立测试类
- 测试 DButil 功能是否可以正常使用?
- 注册驱动,连接数据库,释放资源 都只需要调用 DButil 工具类里的方法,通过一行代码实现。
public class JDBCTest03{
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
// 获取连接
conn = DButil.getConnection();
// 获取预编译的数据库操作对象
/*String sql = "select uname from userInfo where uname like '_?%' ";
ps = conn.prepareStatement(sql);
ps.setString(1, "a");
* 报错, ? 两边不能写占位符 _ 或 % !!!
*/
String sql = "select uname from userInfo where uname like ? ";
ps = conn.prepareStatement(sql);
ps.setString(1, "_a%");
rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getString("uname"));
}
}catch(Exception e){
e.printStackTrace();
}finally {
// 释放资源
DButil.release(conn, ps, rs);
}
}
}
输出:第二个字母为 a 的用户:
本篇知识点总结:
- JDBC编程 先创建 工具类 util,再创建 测试类 test,符合编程思想。
- 工具类中的构造方法都是 私有的 。
- 工具类中的方法都是 静态 的,不需要new对象,直接采用 类名调用 。
- 注册驱动可以只注册 一次 , 最好写到静态方法里,抽离出来。
- 可以在测试类中接收 getConnection() 方法抛出的异常。
- sql 语句中 ? 两边不能写占位符 _ 或 % ,会报错。