通用的資料庫資料操作類
阿新 • • 發佈:2021-07-30
package com.lyang.dao; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.lyang.util.PageInfo; import com.lyang.util.JdbcUtil; /** * 通用的資料庫資料操作類 */ public class BaseDao { /** * 通用查詢資料列表 * @param <T> 具體的類 * @param sql sql指令 * @param cls 反射類 * @param param 引數 * @return */ public <T> List<T> selectList(String sql, Class<T> cls, Object... param) { Connection conn = JdbcUtil.getConn(); PreparedStatement prep = null; ResultSet rs = null; List<T> data = new ArrayList<T>(); try { prep = conn.prepareStatement(sql); //迴圈設定引數 for (int i = 0; i < param.length; i++) { prep.setObject(i + 1, param[i]); } //查詢結果 rs = prep.executeQuery(); while (rs.next()) { T bean = rsToBean(rs, cls); data.add(bean); } } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, prep, rs); } return data; } /** * 查詢一條資料 * @param <T> 具體的類 * @param sql sql指令 * @param cls 反射類 * @param param 引數 * @return */ public <T> T selectOne(String sql, Class<T> cls, Object... param) { List<T> list = this.selectList(sql, cls, param); if (!list.isEmpty() && list.size() == 1) { return list.get(0); } return null; } /** * 將ResultSet 轉化為任意對應的JavaBean * @param <T> 具體的類 * @param rs 結果集 * @param cls 反射類 * @return */ public <T> T rsToBean(ResultSet rs, Class<T> cls) { T t = null; try { t = cls.newInstance(); // 獲取查詢結果的元資料 ResultSetMetaData metaData = rs.getMetaData(); // 獲取列的個數 查詢結果的列的個數 int columnCount = metaData.getColumnCount(); for (int i = 0; i < columnCount; i++) { // 獲取列名稱 String columnLabel = metaData.getColumnLabel(i + 1); // 獲取該列對應的值 Object value = rs.getObject(columnLabel); // 根據結果列名稱 查詢對應屬性 Field field = cls.getDeclaredField(columnLabel); // 設定許可權,因為屬性都為私有的,無法直接獲取 field.setAccessible(true); // 為屬性設定值 field.set(t, value); } } catch (Exception e) { e.printStackTrace(); } return t; } /** * 通用刪除 * @param sql sql指令 * @return */ public boolean deleteById(String sql) { Connection conn = JdbcUtil.getConn(); PreparedStatement prep = null; try { prep = conn.prepareStatement(sql); int m = prep.executeUpdate(); return m == 1 ? true : false; } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, prep); } return false; } /** * 向表插入資料 返回 自增漲主鍵值 * @param sql sql指令 * @param param 引數 * @return */ public int insert(String sql, Object... param) { Connection conn = JdbcUtil.getConn(); PreparedStatement prep = null; ResultSet rs = null; try { // PreparedStatement.RETURN_GENERATED_KEYS:返回生成的key prep = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS); for (int i = 0; i < param.length; i++) { prep.setObject(i + 1, param[i]); } prep.executeUpdate(); // 生成的主鍵 rs = prep.getGeneratedKeys(); if (rs != null) { rs.next(); return rs.getInt(1); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, prep); } return 0; } /** * 通用更新 * @param sql sql指令 * @param param 引數 * @return */ public boolean update(String sql, Object... param) { Connection conn = JdbcUtil.getConn(); PreparedStatement prep = null; try { prep = conn.prepareStatement(sql); for (int i = 0; i < param.length; i++) { prep.setObject(i + 1, param[i]); } int m = prep.executeUpdate(); return m > 0 ? true : false; } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, prep); } return false; } /** * 分頁查詢 * @param <T> 具體的類 * @param sql sql指令 * @param page 頁碼 * @param limit 每頁條數 * @param cls 反射類 * @return */ public <T> PageInfo<T> selectPage(String sql, Integer page, Integer limit, Class<T> cls) { // 總行數 int total = this.selectCount(sql); // 最大頁碼 int maxPage = total % limit == 0 ? total / limit : total / limit + 1; // 如果page比最大頁碼大 則值為最大頁碼 if (page > maxPage) { page = maxPage; } // 如果page值小於1 則為1 if (page < 1) { page = 1; } int startIndex = (page - 1) * limit; sql = sql + " limit " + startIndex + "," + limit; // 查詢資料 List<T> data = this.selectList(sql, cls); PageInfo<T> pageInfo = new PageInfo<T>(page, limit, total, maxPage, data); return pageInfo; } /** * 符合條件的總行數 * @param sql sql指令 * @return */ private int selectCount(String sql) { sql = "select count(1) from (" + sql + ") as rs"; Connection conn = JdbcUtil.getConn(); PreparedStatement prep = null; ResultSet rs = null; try { prep = conn.prepareStatement(sql); rs = prep.executeQuery(); rs.next(); return rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, prep, rs); } return 0; } }