本文共 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/