java的jdbc连接数据库封装
- jdbc的驱动、获取连接、释放资源 进行了封装
- 我们把JDBC用的一些代码进行整合复用,形成JDBC工具类。主要是资源释放工作的整合,
- 以及驱动的防二次注册,还把建立连接的过程封装起来,并使用properties读取属性,方便以后的维护。
- DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- Driver这个类里面有静态代码块,一上来就执行了驱动的注册,执行到这行又执行一遍,所以等同于我们注册了两次驱动,其实没这个必要。
注意问题:
1.当使用 InputStream is = new FileInputStream("jdbc.properties"); 读取配置文件时,文件放在项目中
2. 当使用 InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"); 读取配置文件时,文件放在项目src的目录下,不然会出现异常
准备工作:
1.导入mysql-connector数据库的jar包
2.创建jdbc.properties配置文件,里面是driveClass、url、name、password的值
jdbc.properties文件的内容,务必确保数据存在,用户名和密码正确
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
class JDBCUtil {
static String driverClass = null;
static String url = null;
static String name = null;
static String password = null;
// 静态代码块,随着类的加载而加载,将配置文件的内容加载到这个类
static {
try {
// 1. 创建一个属性配置对象
Properties properties = new Properties();
// 2. 把properties文件转化为inputstream流
// 方法一:如果把properties文件放在工程的根目录下,可以使用下面的语句读取这个文件
// InputStream is = new FileInputStream("jdbc.properties");
// 方法二:使用类加载器,去读取src目录下的资源文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 3. 导入输入流。
properties.load(is);
// 4. 读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 对获取连接进行封装获取连接对象 加载驱动获取连接 这个地方用的不是DriverManager.registerDriver();
* 所以驱动就在这加载了一遍 Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
* Class.forName是一个静态方法,同样可以用来加载类。 该方法有两种形式:Class.forName(String name,
* boolean initialize, ClassLoader loader)和 Class.forName(String className)。
* 第一种形式的参数 name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。
* 第二种形式则相当于设置了参数 initialize的值为 true,loader的值为当前类的类加载器。
*
* @return
*/
static Connection getConn() {
Connection conn = null;
try {
Class.forName(driverClass); // 4.0版本之后不需要使用Class.forName();语句注册了,它会自动帮我们注册驱动。
// 静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new
// Driver());
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");
// 2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
// 这是getConnection()的另外一种写法 上面的是直接写String的参数
conn = DriverManager.getConnection(url, name, password); // 获取连接
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/*
* 对释放资源进行封装
*
* @param conn
*
* @param st
*
* @param rs
*/
public static void release(Connection conn, Statement ps, ResultSet rs) {
closeRs(rs);
closeSt(ps);
closeConn(conn);
}
public static void release(Connection conn, Statement ps) {
closeSt(ps);
closeConn(conn);
}
private static void closeRs(ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs = null;
}
}
private static void closeSt(Statement st) {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
st = null;
}
}
private static void closeConn(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
MainTest类:测试一下封装的jdbc能否使用
/*
* 添加junit4的jar包
* /
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;
public class MainTest {
@Test
public void testDelete(){
// 查询
Connection conn = null;
Statement st = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "delete from t_stu where name='aobama'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, st);
}
}
@Test
public void testUpdate(){
// 查询
Connection conn = null;
Statement st = null;
try {
// 1. 获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "update t_stu set age = 26 where name ='qyq'";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, st);
}
}
}
结果: 使用junit4方法运行测试类
张三 20
李四 18
klz 19
klz 19
klz 19
klz 19
klz 19
aaobama 59
删除失败
添加成功
更新成功