JavaWeb学习-JDBC系列-7-封装一个DB工具类

绝地灬酷狼 2022-02-13 04:57 321阅读 0赞

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

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

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

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

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

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

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

  1. classDriver=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/mydatabase
  3. user=root
  4. password=123456

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

  1. package com.anthony.utils;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.sql.Connection;
  5. import java.sql.DriverManager;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9. import java.util.Properties;
  10. public class DBUtils {
  11. private static String classDriver;
  12. private static String url;
  13. private static String user;
  14. private static String password;
  15. static {
  16. Properties pro = new Properties();
  17. InputStream in = DBUtils.class.getResourceAsStream("/dbinfo.properties");
  18. try {
  19. pro.load(in);
  20. classDriver = pro.getProperty("classDriver");
  21. url = pro.getProperty("url");
  22. user = pro.getProperty("user");
  23. password = pro.getProperty("password");
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. try {
  28. Class.forName(classDriver);
  29. } catch (ClassNotFoundException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. //得到连接的方法
  34. public static Connection getConnection() throws Exception{
  35. return DriverManager.getConnection(url, user, password);
  36. }
  37. //关闭资源方法
  38. public static void close(Connection conn, Statement stmt, ResultSet rs) {
  39. if(rs != null) {
  40. try {
  41. rs.close();
  42. } catch (SQLException e) {
  43. e.printStackTrace();
  44. }
  45. rs = null; //赶紧垃圾回收
  46. }
  47. if(stmt != null) {
  48. try {
  49. stmt.close();
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }
  53. stmt = null;
  54. }
  55. if(conn != null) {
  56. try {
  57. conn.close();
  58. } catch (SQLException e) {
  59. e.printStackTrace();
  60. }
  61. conn = null;
  62. }
  63. }
  64. }

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

  1. package demo;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. import org.junit.Test;
  6. import com.anthony.utils.DBUtils;
  7. public class CURD {
  8. @Test
  9. public void testSelect() {
  10. Connection conn = null;
  11. Statement stmt = null;
  12. ResultSet rs = null;
  13. try {
  14. conn = DBUtils.getConnection();
  15. stmt = conn.createStatement();
  16. rs = stmt.executeQuery("SELECT * FROM student");
  17. while (rs.next()) {
  18. System.out.println(
  19. rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t" + rs.getObject(4));
  20. }
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

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

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

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

  1. package com.anthony.utils;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. import java.util.ResourceBundle;
  8. public class DBUtils {
  9. private static String classDriver;
  10. private static String url;
  11. private static String user;
  12. private static String password;
  13. static {
  14. // 用于加载properties文件
  15. ResourceBundle rb = ResourceBundle.getBundle("dbinfo"); //注意这里不需要文件扩展名.properties
  16. classDriver = rb.getString("classDriver");
  17. url = rb.getString("url");
  18. user = rb.getString("user");
  19. password = rb.getString("password");
  20. try {
  21. Class.forName(classDriver);
  22. } catch (ClassNotFoundException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. //得到连接的方法
  27. public static Connection getConnection() throws Exception{
  28. return DriverManager.getConnection(url, user, password);
  29. }
  30. //关闭资源方法
  31. public static void close(Connection conn, Statement stmt, ResultSet rs) {
  32. if(rs != null) {
  33. try {
  34. rs.close();
  35. } catch (SQLException e) {
  36. e.printStackTrace();
  37. }
  38. rs = null; //赶紧垃圾回收
  39. }
  40. if(stmt != null) {
  41. try {
  42. stmt.close();
  43. } catch (SQLException e) {
  44. e.printStackTrace();
  45. }
  46. stmt = null;
  47. }
  48. if(conn != null) {
  49. try {
  50. conn.close();
  51. } catch (SQLException e) {
  52. e.printStackTrace();
  53. }
  54. conn = null;
  55. }
  56. }
  57. }

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

发表评论

表情:
评论列表 (有 0 条评论,321人围观)

还没有评论,来说两句吧...

相关阅读