今天介绍一下jdbc工具类的正确写法和相关配置文件的使用。
先看源码示例:
package Practise;
import java.io.IOException;
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;
/**
* 标准jdbc工具类的写法:
* @author 曹
*
*/
public class JdbcUtilTrue {
//数据库驱动
private static String driverClass;
//具体数据库的相关路径
private static String url;
//连接数据库的用户名
private static String name;
//连接数据库的密码:
private static String password;
static {
Properties prop = new Properties();
//InputStream in = new FileInputStream("");这个一般情况下用于读取磁盘的文件
//以下这个一般用于读取项目中的文件:常用
InputStream in = JdbcUtilTrue.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
prop.load(in);
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
name = prop.getProperty("name");
password = prop.getProperty("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建连接并且获取连接
* @return:返回一个数据库连接对象
*/
public static Connection getConn() {
Connection conn=null;
try {
conn=DriverManager.getConnection(url, name, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库连接资源
* @param conn:连接对象
* @param st:数据传输集
* @param rs:数据结果集
*/
public static void close(Connection conn, Statement st, ResultSet rs) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
conn=null;
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
st=null;
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
rs=null;
}
}
/**
* 关闭数据库连接资源
* @param conn:连接对象
* @param st:数据传输集
*/
public static void close(Connection conn, Statement st) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
conn=null;
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
st=null;
}
}
}
源码剖析:
我们不会再像以前那样,将什么classdriver,url,user,password的值提前声明出来,这是一个不好的习惯,因为当你以后要换其他类型的数据库的时候,你需要去源码中修改,麻烦,不提倡。所以,我们直接将值写在了配置文件中,以后修改的时候直接去配置文件中。
在静态代码块中取值并为变量赋值,并且加载驱动(当然这一步高版本可以省略了)
上述代码中有这么两句代码:
分析如下:
1.注释部分通常是用来加载磁盘里面的文件,但是也可以加载项目中的文件,当加载项目中的文件时,需要写上完整的绝对路径,比较繁琐。
2.非注释通常读取的是项目中的文件,只需要填写文件的名称即可,不需要具体的绝对路径。
JdbcUtilTrue.class
是通过反射技术获得Class对象,当然了,这个对象本质上是运行jvm的时候实现的,因此,这个Class对象包含了当前类的所有信息。
JdbcUtilTrue.class.getClassLoader()
通过Class对象获得当前类加载器,说到类加载器,有四类,分别是bootstrapClassLoader,extensionsClassLoader,applicationClassLoader,customClassLoader,前三者都属于系统的类加载器,后者是用户自定义类加载器。
JdbcUtilTrue.class.getClassLoader().getResourceAsStream("jdbc.properties")
通过类加载器获得当前项目下的配置文件。
/**
* 关闭数据库连接资源
* @param conn:连接对象
* @param st:数据传输集
* @param rs:数据结果集
*/
public static void close(Connection conn, Statement st, ResultSet rs) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
conn=null;
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
st=null;
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
rs=null;
}
}
/**
* 关闭数据库连接资源
* @param conn:连接对象
* @param st:数据传输集
*/
public static void close(Connection conn, Statement st) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
conn=null;
}
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}else {
st=null;
}
}
当然了,以上就是资源的关闭代码了,是两段,使用了重载,因为有些资源用不上。