Java獲取資料庫各種查詢結果
阿新 • • 發佈:2019-02-16
在查詢時候有時候要一條資料,有時候要的是一個結果集,然而有時候返回就是一個統計值,通過對ResultSet和ResultSetMetaData的變換得到各類所需的查詢結果,因為沒有利用連線池資料鏈接管理比較麻煩,所以謝了一個工具類,
package com.sky.connect; import java.lang.reflect.InvocationTargetException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.ResultSetMetaData; /** * DAO設計模式 * * @author 潘琢文 * */ public class DAO { /** * 更新資料庫操作 * * @param sql * @param args */ public void update(String sql, Object... args) { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JDBCTools.getConnection(); preparedStatement = (PreparedStatement) connection .prepareStatement(sql); for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1, args[i]); } preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(preparedStatement, connection); } } /** * 通用查詢方法,返回一條記錄 * * @param clazz * @param sql * @param args * @return */ public <T> T get(Class<T> clazz, String sql, Object... args) { T entity = null; Connection connection = null; PreparedStatement preparedStatement = null; ResultSet result = null; try { connection = JDBCTools.getConnection(); preparedStatement = (PreparedStatement) connection .prepareStatement(sql); for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1, args[i]); } result = preparedStatement.executeQuery(); Map<String, Object> map = new HashMap<String, Object>(); ResultSetMetaData rsmd = (ResultSetMetaData) result.getMetaData(); if (result.next()) { for (int i = 0; i < rsmd.getColumnCount(); i++) { String columnLabel = rsmd.getColumnLabel(i + 1); Object value = result.getObject(i + 1); map.put(columnLabel, value); } } if (map.size() > 0) { entity = clazz.newInstance(); for (Map.Entry<String, Object> entry : map.entrySet()) { String filedName = entry.getKey(); Object filedObject = entry.getValue(); BeanUtils.setProperty(entity, filedName, filedObject); } } } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(result, preparedStatement, connection); } return entity; } /** * 通用查詢方法,返回一個結果集 * * @param clazz * @param sql * @param args * @return */ public <T> List<T> getForList(Class<T> clazz, String sql, Object... args) { List<T> list = new ArrayList<T>(); Connection connection = null; PreparedStatement preparedStatement = null; ResultSet result = null; try { connection = JDBCTools.getConnection(); preparedStatement = (PreparedStatement) connection .prepareStatement(sql); for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1, args[i]); } result = preparedStatement.executeQuery(); List<Map<String, Object>> values = handleResultSetToMapList(result); list = transfterMapListToBeanList(clazz, values); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(result, preparedStatement, connection); } return list; } /** * * @param clazz * @param values * @return * @throws InstantiationException * @throws IllegalAccessException * @throws InvocationTargetException */ public <T> List<T> transfterMapListToBeanList(Class<T> clazz, List<Map<String, Object>> values) throws InstantiationException, IllegalAccessException, InvocationTargetException { List<T> result = new ArrayList<T>(); T bean = null; if (values.size() > 0) { for (Map<String, Object> m : values) { bean = clazz.newInstance(); for (Map.Entry<String, Object> entry : m.entrySet()) { String propertyName = entry.getKey(); Object value = entry.getValue(); BeanUtils.setProperty(bean, propertyName, value); } // 13. 把 Object 物件放入到 list 中. result.add(bean); } } return result; } /** * * @param resultSet * @return * @throws SQLException */ public List<Map<String, Object>> handleResultSetToMapList( ResultSet resultSet) throws SQLException { List<Map<String, Object>> values = new ArrayList<Map<String, Object>>(); List<String> columnLabels = getColumnLabels(resultSet); Map<String, Object> map = null; while (resultSet.next()) { map = new HashMap<String, Object>(); for (String columnLabel : columnLabels) { Object value = resultSet.getObject(columnLabel); map.put(columnLabel, value); } values.add(map); } return values; } /** * * @param resultSet * @return * @throws SQLException */ private List<String> getColumnLabels(ResultSet resultSet) throws SQLException { List<String> labels = new ArrayList<String>(); ResultSetMetaData rsmd = (ResultSetMetaData) resultSet.getMetaData(); for (int i = 0; i < rsmd.getColumnCount(); i++) { labels.add(rsmd.getColumnLabel(i + 1)); } return labels; } /** * 通用查詢方法,返回一個值(可能是統計值) * * @param sql * @param args * @return */ @SuppressWarnings("unchecked") public <E> E getForValue(String sql, Object... args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { connection = JDBCTools.getConnection(); preparedStatement = (PreparedStatement) connection .prepareStatement(sql); for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1, args[i]); } resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { return (E) resultSet.getObject(1); } } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(resultSet, preparedStatement, connection); } return null; } }
package com.sky.connect; import java.io.IOException; import java.io.InputStream; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Driver; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; /** * JDBC操作的工具類 版本 1.0 * * @author 潘琢文 * */ public class JDBCTools { /** * 使用preparedStatement進行資料更新 * * @param sql * @param args */ public static void update(String sql, Object ... args) { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JDBCTools.getConnection(); preparedStatement = (PreparedStatement) connection .prepareStatement(sql); for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1, args[i]); } preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(preparedStatement, connection); } } /** * 結果查詢關閉 * * @param rs * @param statement * @param conn */ public static void release(ResultSet rs, Statement statement, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (Exception e2) { e2.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } /** * 資料庫更新方法 * * @param sql */ public void uodate(String sql) { Connection connection = null; Statement statement = null; try { connection = JDBCTools.getConnection(); statement = (Statement) connection.createStatement(); statement.executeUpdate(sql); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(statement, connection); } } /** * 關閉資料庫連線的方法 * * @param statement * @param conn */ public static void release(Statement statement, Connection conn) { if (statement != null) { try { statement.close(); } catch (Exception e2) { e2.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } /** * 編寫通用方法獲取任意資料庫連結,不用修改源程式 * * @return * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException * @throws SQLException * @throws IOException */ public static Connection getConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException, IOException { String driverClass = null; String jdbcUrl = null; String user = null; String password = null; // 讀取properties檔案 InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream( "jdbc.properties"); Properties properties = new Properties(); properties.load(in); driverClass = properties.getProperty("driver"); jdbcUrl = properties.getProperty("url"); user = properties.getProperty("user"); password = properties.getProperty("password"); Class.forName(driverClass); Connection connection = (Connection) DriverManager.getConnection( jdbcUrl, user, password); return connection; } }