博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习-JDBC系列-7-封装一个DB工具类
阅读量:4302 次
发布时间:2019-05-27

本文共 4587 字,大约阅读时间需要 15 分钟。

我们前面在多个单元测试用例的时候,每个用例里都需要写加载驱动,创建连接,创建执行sql的stmt对象,创建结果集rs对象。这些很多重复的代码,我们可以提出来,写成一个静态工具类。这样,在使用的时候看起来很简洁。

1.我们尝试提取出来的连接数据库方法效果

我在项目src下创建一个com.anthony.utils的包,然后在这个包下创建DBUtils.java文件。

package com.anthony.utils;import java.sql.Connection;import java.sql.DriverManager;public class DBUtils {	//得到连接的方法	public static Connection getConnection() throws Exception {		Class.forName("com.mysql.jdbc.Driver");		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");		return conn;	}}

我们第一次抽取成这样,其实效果达到了,只是还不够完美。因为,我们数据库连接信息和驱动文件随时都可能发生改变,但是,这里我们采用硬编码,直接写死,这个是不合理。所以,下面我们来看看提取数据库连接信息到配置文件的效果。

2.采用配置文件保存数据库信息的优化效果

我首先在src下新建一个dbinfo.properties文件,写入下面这些内容。

classDriver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mydatabaseuser=rootpassword=123456

有了配置文件,我们继续优化连接数据库方法。

package com.anthony.utils;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;public class DBUtils {	private static String classDriver;	private static String url;	private static String user;	private static String password;		static {		Properties pro = new Properties();		InputStream in = DBUtils.class.getResourceAsStream("/dbinfo.properties");		try {			pro.load(in);			classDriver = pro.getProperty("classDriver");			url = pro.getProperty("url");			user = pro.getProperty("user");			password = pro.getProperty("password");		} catch (IOException e) {			e.printStackTrace();		}		try {			Class.forName(classDriver);		} catch (ClassNotFoundException e) {			e.printStackTrace();		}	}		//得到连接的方法	public static Connection getConnection() throws Exception{		return DriverManager.getConnection(url, user, password);	}		//关闭资源方法	public static void close(Connection conn, Statement stmt, ResultSet rs) {		if(rs != null) {			try {				rs.close();			} catch (SQLException e) {				e.printStackTrace();			}			rs = null; //赶紧垃圾回收		}		if(stmt != null) {			try {				stmt.close();			} catch (SQLException e) {				e.printStackTrace();			}			stmt = null;		}		if(conn != null) {			try {				conn.close();			} catch (SQLException e) {				e.printStackTrace();			}			conn = null;		}	}}

我写了一个测试类来测试下上面使用InputStream读取properties文件代码对不对。

package demo;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;import com.anthony.utils.DBUtils;public class CURD {		@Test	public void testSelect() {		Connection conn = null;		Statement stmt = null;		ResultSet rs = null;				try {			conn = DBUtils.getConnection();			stmt = conn.createStatement();			rs = stmt.executeQuery("SELECT * FROM student");			while (rs.next()) {				System.out.println(						rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4));			} 					} catch (Exception e) {			e.printStackTrace();		}	}}

我这边能打印查询内容,这种写法是没问题,唯一有点就是读取propeties文件这块有点啰嗦,下面我们换ResourceBundle类来读取properties文件会简单很多。

3.使用ResourceBundle类来获取配置文件key的value

这里我们来学习一个新的类,这个ResourceBundle是在G11n(国际化)开发中必须使用到的一个类。做过国际化测试的人应该知道,一个String,先是有英文,然后会翻译成日语,法语,德育,中文等不同本地化语言,靠的就是不同语言版本的资源文件。

package com.anthony.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ResourceBundle;public class DBUtils {	private static String classDriver;	private static String url;	private static String user;	private static String password;		static {		// 用于加载properties文件		ResourceBundle rb = ResourceBundle.getBundle("dbinfo"); //注意这里不需要文件扩展名.properties		classDriver = rb.getString("classDriver");		url = rb.getString("url");		user = rb.getString("user");		password = rb.getString("password");				try {			Class.forName(classDriver);		} catch (ClassNotFoundException e) {			e.printStackTrace();		}	}		//得到连接的方法	public static Connection getConnection() throws Exception{		return DriverManager.getConnection(url, user, password);	}		//关闭资源方法	public static void close(Connection conn, Statement stmt, ResultSet rs) {		if(rs != null) {			try {				rs.close();			} catch (SQLException e) {				e.printStackTrace();			}			rs = null; //赶紧垃圾回收		}		if(stmt != null) {			try {				stmt.close();			} catch (SQLException e) {				e.printStackTrace();			}			stmt = null;		}		if(conn != null) {			try {				conn.close();			} catch (SQLException e) {				e.printStackTrace();			}			conn = null;		}	}}

使用了ResourceBundle类加载properties文件之后,代码少了好几行,以后如果需要Java解析properties文件,建议使用这个,这个也很好记住,比那个InputStream好记多了。DBUtils工具类封装好了,下一篇,我们来写四个Junit单元测试用例,也就是SQL的CURD,增删改查四个用例。

 

转载地址:http://yuows.baihongyu.com/

你可能感兴趣的文章
DataWhale计算机视觉实践(目标检测)Task04
查看>>
LeetCode 刷题记录26. 删除有序数组中的重复项
查看>>
GlusterFS 3.4.2 安装记录
查看>>
Linux C/C++编程一站式学习中输出菱形
查看>>
glusterfs 3.4.2安装记录(一)
查看>>
Linux C/C++编程一站式学习--以可视化的形式打印直方图
查看>>
Linux C/C++编程一站式学习中选择排序
查看>>
Linux C/C++编程一站式学习中折半查找(如果待查找的元素在数组中有多个则返回第一个)
查看>>
Git分布式版本控制系统笔记
查看>>
Codewars第二天--Complementary DNA
查看>>
Codewars第二天--Disemvowel Trolls
查看>>
Codewars第三天--Binary Addition
查看>>
Codewars第三天--The museum of incredible dull things
查看>>
Codewars第四天--Find the stray number
查看>>
Codewars第三天--Unique In Order
查看>>
Codewars第三天--Largest 5 digit number in a series
查看>>
Codewars第三天--Breaking chocolate problem
查看>>
Codewars第三天--Create Phone Number
查看>>
Codewars第四天--Two to One
查看>>
Codewars第四天--Sum of Digits / Digital Root
查看>>