package com.myweb.utils; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; public class DBManager { /** * @param args */ static String driver; static String url; static String username; static String password; private Connection connection; private PreparedStatement pstmt; private ResultSet resultSet; public DBManager() { InputStream in = DBManager.class.getClassLoader().getResourceAsStream( "db.properties"); Properties pro = new Properties(); try { pro.load(in); } catch (IOException e) { e.printStackTrace(); } driver = pro.getProperty("driver"); url = pro.getProperty("url"); username = pro.getProperty("username"); password = pro.getProperty("password"); try { Class.forName(driver); } catch (Exception e) { } } /** * 獲得數據庫的連接 * * @return * @throws ClassNotFoundException */ public Connection getConnection() { try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (Exception e) { System.out.println("fail to connect database"); } return connection; } /** * 獲得最大ID * * @param tableName * @return * @throws SQLException */ public int getMaxId(String tableName) { Statement state = null; ResultSet rs = null; int maxId = 0; try { state = connection.createStatement(); String sql = "select max(id) maxId from " + tableName; rs = state.executeQuery(sql); // 從resultset對象中將數據取出 if (rs.next()) { maxId = rs.getInt("maxId"); } } catch (Exception ex) { // TODO Auto-generated catch block ex.printStackTrace(); } return ++maxId; } /** * 增加、刪除、改 * * @param sql * @param params * @return * @throws SQLException */ public boolean updateByPreparedStatement(String sql, List<Object> params) throws SQLException { boolean flag = false; int result = -1; pstmt = connection.prepareStatement(sql); int index = 1; if (params != null && !params.isEmpty()) { for (int i = 0; i < params.size(); i++) { pstmt.setObject(index++, params.get(i)); } } result = pstmt.executeUpdate(); flag = result > 0 ? true : false; return flag; } /** * 查詢單條記錄 * * @param sql * @param params * @return * @throws SQLException */ public Map<String, Object> findSimpleResult(String sql, List<Object> params) throws SQLException { Map<String, Object> map = new HashMap<String, Object>(); int index = 1; pstmt = connection.prepareStatement(sql); if (params != null && !params.isEmpty()) { for (int i = 0; i < params.size(); i++) { pstmt.setObject(index++, params.get(i)); } } resultSet = pstmt.executeQuery();// 返回查詢結果 ResultSetMetaData metaData = resultSet.getMetaData(); int col_len = metaData.getColumnCount(); while (resultSet.next()) { for (int i = 0; i < col_len; i++) { String cols_name = metaData.getColumnName(i + 1); Object cols_value = resultSet.getObject(cols_name); if (cols_value == null) { cols_value = ""; } map.put(cols_name, cols_value); } } return map; } /** * 查詢多條記錄 * * @param sql * @param params * @return * @throws SQLException */ public List<Map<String, Object>> findModeResult(String sql, List<Object> params) throws SQLException { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); int index = 1; pstmt = connection.prepareStatement(sql); if (params != null && !params.isEmpty()) { for (int i = 0; i < params.size(); i++) { pstmt.setObject(index++, params.get(i)); } } resultSet = pstmt.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); int cols_len = metaData.getColumnCount(); while (resultSet.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (int i = 0; i < cols_len; i++) { String cols_name = metaData.getColumnName(i + 1); Object cols_value = resultSet.getObject(cols_name); if (cols_value == null) { cols_value = ""; } map.put(cols_name, cols_value); } list.add(map); } return list; } /** * 通過反射機制查詢單條記錄 * * @param sql * @param params * @param cls * @return * @throws Exception */ public <T> T findSimpleRefResult(String sql, List<Object> params, Class<T> cls) throws Exception { T resultObject = null; int index = 1; pstmt = connection.prepareStatement(sql); if (params != null && !params.isEmpty()) { for (int i = 0; i < params.size(); i++) { pstmt.setObject(index++, params.get(i)); } } resultSet = pstmt.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); int cols_len = metaData.getColumnCount(); while (resultSet.next()) { // 通過反射機制創建一個實例 resultObject = cls.newInstance(); for (int i = 0; i < cols_len; i++) { String cols_name = metaData.getColumnName(i + 1); Object cols_value = resultSet.getObject(cols_name); int type = metaData.getColumnType(i + 1); if (cols_value == null) { if (type == Types.INTEGER) { cols_value = 0; } else { cols_value = ""; } } Field field = cls.getDeclaredField(cols_name.toLowerCase()); field.setAccessible(true); // 打開javabean的訪問權限 if (type == Types.TIMESTAMP) { field.set(resultObject, String.valueOf(cols_value)); } else { field.set(resultObject, cols_value); } } } return resultObject; } /** * 通過反射機制查詢多條記錄 * * @param sql * @param params * @param cls * @return * @throws Exception */ public <T> List<T> findMoreRefResult(String sql, List<Object> params, Class<T> cls) throws Exception { List<T> list = new ArrayList<T>(); int index = 1; pstmt = connection.prepareStatement(sql); if (params != null && !params.isEmpty()) { for (int i = 0; i < params.size(); i++) { pstmt.setObject(index++, params.get(i)); } } resultSet = pstmt.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); int cols_len = metaData.getColumnCount(); while (resultSet.next()) { // 通過反射機制創建一個實例 T resultObject = cls.newInstance(); for (int i = 0; i < cols_len; i++) { String cols_name = metaData.getColumnName(i + 1); Object cols_value = resultSet.getObject(cols_name); if (cols_value == null) { cols_value = ""; } Field field = cls.getDeclaredField(cols_name); field.setAccessible(true); // 打開javabean的訪問權限 field.set(resultObject, cols_value); } list.add(resultObject); } return list; } /** * 釋放數據庫連接 */ public void releaseConn() { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * @param args * @throws ClassNotFoundException */ public static void main(String[] args) throws SQLException, ClassNotFoundException { /*DBManager db = new DBManager(); Connection connection2 = db.getConnection(); System.out.println(connection2);*/ // TODO Auto-generated method stubs // JdbcUtils jdbcUtils = new JdbcUtils(); // jdbcUtils.getConnection(); /******************* 增 *********************/ /* * String sql = * "insert into userinfo (username, pswd) values (?, ?), (?, ?), (?, ?)" * ; List<Object> params = new ArrayList<Object>(); params.add("小明"); * params.add("123xiaoming"); params.add("張三"); params.add("zhangsan"); * params.add("李四"); params.add("lisi000"); try { boolean flag = * jdbcUtils.updateByPreparedStatement(sql, params); * System.out.println(flag); } catch (SQLException e) { // TODO * Auto-generated catch block e.printStackTrace(); } */ /******************* 刪 *********************/ // 刪除名字為張三的記錄 /* * String sql = "delete from userinfo where username = ?"; List<Object> * params = new ArrayList<Object>(); params.add("小明"); boolean flag = * jdbcUtils.updateByPreparedStatement(sql, params); */ /******************* 改 *********************/ // 將名字為李四的密碼改了 /* * String sql = "update userinfo set pswd = ? where username = ? "; * List<Object> params = new ArrayList<Object>(); * params.add("lisi88888"); params.add("李四"); boolean flag = * jdbcUtils.updateByPreparedStatement(sql, params); * System.out.println(flag); */ /******************* 查 *********************/ // 不利用反射查詢多個記錄 /* * String sql2 = "select * from userinfo "; List<Map<String, Object>> * list = jdbcUtils.findModeResult(sql2, null); * System.out.println(list); */ // 利用反射查詢 單條記錄 /* * String sql = "select * from userinfo where username = ? "; * List<Object> params = new ArrayList<Object>(); params.add("李四"); * UserInfo userInfo; try { userInfo = * jdbcUtils.findSimpleRefResult(sql, params, UserInfo.class); * System.out.print(userInfo); } catch (Exception e) { // TODO * Auto-generated catch block e.printStackTrace(); } Class clcs = * UserInfo.class; try { Object obj = clcs.newInstance(); Method f = * clcs.getDeclaredMethod("setUsername", String.class); f.invoke(obj, * "yan123"); Method f2 = clcs.getDeclaredMethod("getUsername", null); * Object name = f2.invoke(obj, null); System.out.println("反射得到的名字 = " + * name); * * } catch (InstantiationException e) { // TODO Auto-generated catch * block e.printStackTrace(); } catch (IllegalAccessException e) { // * TODO Auto-generated catch block e.printStackTrace(); } catch * (NoSuchMethodException e) { // TODO Auto-generated catch block * e.printStackTrace(); } catch (SecurityException e) { // TODO * Auto-generated catch block e.printStackTrace(); } catch * (IllegalArgumentException e) { // TODO Auto-generated catch block * e.printStackTrace(); } catch (InvocationTargetException e) { // TODO * Auto-generated catch block e.printStackTrace(); } */ } }
以上代碼便是我對於數據庫進行增刪改查的一個數據庫封裝類,使用此類可以直接將數據的增刪改查操作進行統一的封裝無需再dao層進行再次操作
此類直接將數據庫的查詢結果值分為4各方面,一方面為利用反射查詢單個結果與多個結果,另一個為得到單個的結果集和多條記錄封裝為List<Map>便於在視圖層采用jstl標簽進行顯示。
好長時間沒有更新博客信息,很長一段時間在忙於實習的事情,大家一起共同進步。
