mysql对数据库加载驱动、数据库连接、释放资源的操作封装成工具类
资源文件的使用:
使用何种数据库驱动,连接数据库使用的URL、用户名及密码都放在资源文件当中,该资源文件的后缀名为".properties",且该文件的命名一般都为db.properties,放置在src目录下。用该资源文件的优点是能够较大程度的解除代码对数据库连接等的耦合,如果更换数据库或用户名及密码,那么底层的代码也要进行修改,耦合性很大,不利于项目的维护。
1.加载资源文件
首先要考虑的是如何把资源文件的内容加载进来?其最重要的是如何获取到资源文件的路径,我们应该考虑到:资源文件是不能用绝对路径来获取的,因为将来我们要部署到服务器上,其路径已经不再是我们现在项目的路径了,而且用相对路径也是不可行的。但项目src目录下的所有文件都会被编译存储到bin目录下,而我们只要找到当前类在bin中的位置就可以找到资源文件的位置了。
首先获取到当前类的字节码文件,然后再获取到类加载器:
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
其次利用类加载器获取资源文件作为流:
InputStream is = classLoader.getResourceAsStream("db.properties");
创建资源文件对象,让它加载流,所有的信息全部都加载进Properties对象中,而且它会自动解析资源文件中的键值对:
properties = new Properties();
properties.load(is);
注意:最好将资源文件中的键在工具类中再次包装成常量,以免当键改变时,代码中所有用到键的地方全都要改掉,这样可维护性较差。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package utils; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.sql.PreparedStatement; 8 import java.sql.ResultSet; 9 import java.sql.SQLException; 10 import java.sql.Statement; 11 import java.util.Properties; 12 13 public class JDBCUtils { 14 15 private static final String DRIVER = "driver"; 16 private static final String URL = "url"; 17 private static final String USERNAME = "username"; 18 private static final String PASSWORD = "password"; 19 private static Properties properties = null; 20 21 static { 22 try { 23 // 加载资源文件 24 properties = new Properties(); 25 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); 26 InputStream is = classLoader.getResourceAsStream("db.properties"); 27 properties.load(is); 28 29 // 加载驱动 30 String driver = properties.getProperty(DRIVER); 31 Class.forName(driver); 32 } catch (ClassNotFoundException e) { 33 e.printStackTrace(); 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 } 38 39 /**功能: 连接数据库 40 * @return 41 */ 42 public static Connection getConnection() { 43 String url = properties.getProperty(URL); 44 String username = properties.getProperty(USERNAME); 45 String password = properties.getProperty(PASSWORD); 46 Connection connection = null; 47 try { 48 connection = DriverManager.getConnection(url, username, password); 49 return connection; 50 } catch (SQLException e) { 51 e.printStackTrace(); 52 } 53 return null; 54 } 55 56 /**功能: 释放 ResultSet, Statement, Connection资源 57 * @param resultSet 58 * @param statement 59 * @param connection 60 */ 61 public static void release(ResultSet resultSet, Statement statement, Connection connection) { 62 try { 63 if (resultSet != null) { 64 resultSet.close(); 65 } 66 if (statement != null) { 67 statement.close(); 68 } 69 if (connection != null) { 70 connection.close(); 71 } 72 } catch (SQLException e) { 73 e.printStackTrace(); 74 } 75 } 76 77 /**功能: 释放ResultSet资源 78 * @param resultSet 79 */ 80 public static void release(ResultSet resultSet) { 81 if (resultSet != null) { 82 try { 83 resultSet.close(); 84 } catch (SQLException e) { 85 e.printStackTrace(); 86 } 87 } 88 } 89 90 /**功能: 释放Statement资源 91 * @param statement 92 */ 93 public static void release(Statement statement) { 94 if (statement != null) { 95 try { 96 statement.close(); 97 } catch (SQLException e) { 98 e.printStackTrace(); 99 } 100 } 101 } 102 103 /**功能: 释放Connection资源 104 * @param connection 105 */ 106 public static void release(Connection connection) { 107 if (connection != null) { 108 try { 109 connection.close(); 110 } catch (SQLException e) { 111 e.printStackTrace(); 112 } 113 } 114 } 115 116 /**功能: 释放PreparedStatement资源 117 * @param PreparedStatement 118 */ 119 public static void release(PreparedStatement preparedStatement) { 120 if (preparedStatement != null) { 121 try { 122 preparedStatement.close(); 123 } catch (SQLException e) { 124 e.printStackTrace(); 125 } 126 } 127 } 128 129 }