1. 程式人生 > 其它 >通用的資料庫資料操作類

通用的資料庫資料操作類

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;
    }

}