通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用。
1、使用properties配置文件
开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
文件要求如下:
1)文件位置:任意,建议在src下
2)文件名称:任意,扩展名为properties
3)文件内容:一行一组数据,格式是“key=value”.
a)key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
b)value值不支持中文,如果需要使用非英文字符,将进行Unicode转换
2、创建配置文件
右击src->new->file命名...
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8
username=root
password=12345
3.1、加载配置文件:ResourceBundle对象(JDBCUtils_V2.java文件)
package cn.itheima.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle; /**
* 提供获取连接和释放资源的方法
* @author Administrator
*
*/
public class JDBCUtils_V2 {
private static String driver; //驱动
private static String url; //路径
private static String username; //用户名
private static String password; //密码 /*
* 静态代码块加载配置文件信息
*/
static{
//1.使用JDK提供的工具类加载properties文件,getBundle()方法只需要填写文件,不加后缀!!!
ResourceBundle bundle=ResourceBundle.getBundle("db");
//2.通过key获得需要的值
driver=bundle.getString("driver");
url=bundle.getString("url");
username=bundle.getString("username");
password=bundle.getString("password");
} /*
* 获取连接方法
*/
public static Connection getConnection(){
Connection conn=null;
try {
//1.注册驱动
Class.forName(driver);
//2.获得连接
conn=DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/*
* 释放资源方法
*/
public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.2、加载配置文件:Properties对象((JDBCUtils_V3.java文件)可选)
package cn.itheima.jdbc; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle; /**
* 提供获取连接和释放资源的方法
* @author Administrator
*
*/
public class JDBCUtils_V3 {
private static String driver; //驱动
private static String url; //路径
private static String username; //用户名
private static String password; //密码 /*
* 静态代码块加载配置文件信息
*/
static{
try {
//1.通过当前类获得类加载器
ClassLoader classLoader=JDBCUtils_V3.class.getClassLoader();
//2.通过类加载器的方法获得一个输入流
InputStream is=classLoader.getResourceAsStream("db.properties");
//3.创建一个properties对象
Properties props=new Properties();
//4.加载输入流
props.load(is);
//5.获取相关参数的值
driver=props.getProperty("driver");
url=props.getProperty("url");
username=props.getProperty("username");
password=props.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 获取连接方法
*/
public static Connection getConnection(){
Connection conn=null;
try {
//1.注册驱动
Class.forName(driver);
//2.获得连接
conn=DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/*
* 释放资源
*/
public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4、实现CRUD操作(查询和添加使用的JDBCUtils_V2.java、删除和修改使用的是JDBCUtils_V3.java文件)
package cn.itheima.jdbc.test; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; import cn.itheima.jdbc.JDBCUtils_V2;
import cn.itheima.jdbc.JDBCUtils_V3; /*
* 测试工具类
*/
public class TestUtils {
/*
* 根据id查询用户信息
*/
@Test
public void testFindUserById() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取连接
conn = JDBCUtils_V2.getConnection();
// 2.编写sql语句
String sql = "select * from tbl_user where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 2);
// 5.执行查询操作
rs = pstmt.executeQuery();
// 6.处理结果集
while (rs.next()) {
System.out.println(rs.getString(2) + "----" + rs.getString("upassword"));
}
// 释放资源放在此处不行滴!
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 7.释放资源
JDBCUtils_V2.release(conn, pstmt, rs);
}
} /*
* 添加用户信息方法
*/
@Test
public void testAdd(){
Connection conn=null;
PreparedStatement pstmt=null;
try{
//1.获取连接
conn=JDBCUtils_V2.getConnection();
//2.编写sql语句
String sql="insert into tbl_user values(null,?,?)";
//3.获取执行sql语句对象
pstmt=conn.prepareStatement(sql);
//4.设置参数
pstmt.setString(1, "hehe");
pstmt.setString(2,"789");
//5.执行插入操作
int row=pstmt.executeUpdate();
if(row>0){
System.out.print("添加成功!");
}else{
System.out.print("添加失败 ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
JDBCUtils_V2.release(conn, pstmt, null);
}
} /*
* 根据id删除用户信息
*/
@Test
public void testDeleteById(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写sql语句
String sql = "delete from tbl_user where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 4);
// 5.执行删除操作
int row=pstmt.executeUpdate();
if(row>0){
System.out.print("删除成功!");
}else{
System.out.print("删除失败 ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
} /*
* 根据id更新用户信息
*/
@Test
public void testUpdateById(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写sql语句
String sql = "update tbl_user set upassword=? where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1, "233");
pstmt.setInt(2, 5);
// 5.执行更新操作
int row=pstmt.executeUpdate();
if(row>0){
System.out.print("更新成功!");
}else{
System.out.print("更新失败 ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
}
}
查询uid=2的效果如下:
添加成功的效果如下:
删除uid=4的效果如下:
更新uid=5的密码为233的效果如下: