今天自己写的MySQL自定义JDBCUtils代码编写过程详解.

小弟我今天详细标注了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();
				}
			}
		}
	}
}
			//第十五步:  创建一个测试类,此处不再具体操作. 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值