JavaWeb学习-JDBC系列-7-封装一个DB工具类
我们前面在多个单元测试用例的时候,每个用例里都需要写加载驱动,创建连接,创建执行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.Driver
url=jdbc:mysql://localhost:3306/mydatabase
user=root
password=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,增删改查四个用例。
还没有评论,来说两句吧...