小弟我今天详细标注了JDBCUtils类的编写过程,写明了每一步的目的.如有错误,请各位务必指出,以免误导他人.
数据库连接是操作数据库的基础. 工具类一旦编写完成,便能省去大量重复操作,提高工作学习效率,更好的实现代码的复用性.
可能以前有前辈总结过,如有重复,大家自由选择参考,大家都是同一个目的,分享技术,共同进步.
下面废话不多说,直接上代码
package JDBCUtils;
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;
public class MyJDBCUtils {
//-----------------------------------获取数据库连接对象部分-----------------------------------------
//第三步:创建一个Properties集合对象,通过键值对的形式存储jdbcmsg.properties内的数据,将其放在成员变量的位置,并且设置为静态,随类加载一次即可.节省资源.
private static Properties pro = new Properties();
//第五步,将之前的加载Driver的代码放入静态代码块中,这样只会跟随类加载一次.节省资源.
static{
try {
//第一步: 在文件的根目录下创建一个jdbcmsg.properties文件,通过键值对的形势存储Driver,url,username,password
//第二步: 定义一个输入流对象 ,利用反射技术,通过本类的字节码文件,获得一个类的加载器,通过这个加载器调用配置文件的数据.
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbcmsg.properties");
//第四步:Properties集合对象,添加数据.
pro.load(in);
//第五步: 导入SQL包,然后通过反射将com.mysql.jdbc.Driver加载入内存,Driver类中有一个静态代码块,用来注册驱动,此时需要处理异常
Class.forName(pro.getProperty("Driver"));
} catch (Exception e) {
//打印出来异常结果
e.printStackTrace();
//如过加载Driver失败,那么后面的代码就没必要执行,直接抛出运行时异常,停止程序即可.
throw new RuntimeException();
}
}
//第六步:书写一个获取数据库连接对象的静态方法 getCon(),返回值是connection,这样可以直接类名调用,无需创建对象.
public static Connection getCon(){
//第八步:在try/catch外 定义一个Connection变量,赋值为null,这样做的目的是防止发生异常,return的是一个未定义的值而报错.
Connection con = null;
//第七步:通过执行者对象获取数据库连接,但是此时需要抛出异常.
try {
con = DriverManager.getConnection(pro.getProperty("url"),pro.getProperty("username"),pro.getProperty("password"));
} catch (SQLException e) {
//如果有异常,则打印异常信息
e.printStackTrace();
//如果异常,那么数据库的连接对象则获取失败,抛一个运行时异常结束即可.
throw new RuntimeException();
}
return con;
}
//-------------------------------下面是释放资源部分(所偶的异常都通过try/catch处理)------------------------------------
//第九步:书写一个释放资源的静态方法,这个方法不需要返回值,但是在调用时需要传参数.
public static void close(ResultSet rs, Statement sta, Connection con){
try {
//第十步:在关流之前,需要先判空,如果为空,则无需关流(后面同理,不再解释)
if (rs != null) {
//第十一步: 关流 ,关流时需要try/catch,打印异常结果,但是不要抛出运行时异常.(后面同理,不再解释)
rs.close();
//第十二步: 灌流后再将其值定义为null值,理论上可以让垃圾回收器尽快来回收(这步不写亦可.后面同理,不再解释)
rs = null;
}
} catch (SQLException e) {
//打印异常
e.printStackTrace();
} finally {
//第十三步:关流的顺序是从后向前,依次关流,层层嵌套,写在上一步的finally中,使代码必须执行,最后关数据库连接流.
try {
if (sta != null) {
sta.close();
sta = null;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//第十四步: 原理同上
try {
if (con != null) {
con.close();
con = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
//第十五步: 创建一个测试类,此处不再具体操作.