MySQL JDBC工具類及CRUD工具類

1. JDBC工具類

使用properties配置文件實現JDBC工具類

1.1 properties配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/數據庫名稱
username=root
password=123456

1.2 JDBC工具類

/**
 * JDBC工具類
 * @Author: fangju
 * @Date: 2019/6/15 
 */
public class JDBCUtil {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    //靜態代碼塊,在程序編譯的時候執行
    static {
        try {
            //創建Properties對象
            Properties p = new Properties();
            //獲取文件輸入流
            ClassLoader classloader = JDBCUtil.class.getClassLoader();
            URL res = classloader.getResource("jdbc.properties"); 
            String path = res.getPath();
            //加載輸入流
            p.load(new FileReader(path));
            //獲取數據庫連接驅動名字
            driver = p.getProperty("driverClassName",null);
            //獲取數據庫連接地址
            url = p.getProperty("url",null);
            //獲取數據庫連接用戶名
            username = p.getProperty("username",null);
            //獲取數據庫連接密碼
            password = p.getProperty("password",null);
            if(driver != null && url != null
                    && username != null && password != null){
                //加載驅動
                Class.forName(driver);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取連接對象
     * @return Connection連接對象
     */
    public static Connection getConn(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 關閉連接(Connection連接對象必須在最後關閉)
     * @param conn Connection連接對象
     * @param st 編譯執行對象
     * @param rs 結果集
     */
    public static void close(Connection conn, Statement st, ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
            if(st != null){
                st.close();
            }
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2. CRUD工具類

/**
 * 增刪改工具類
 * @Author: fangju
 * @Date: 2019/6/15
 */
public class CRUDTemplate {
    /**
     * 增刪改操作
     * @param sql 傳入的SQL語句
     * @param params 可變參數
     * @return 操作結果
     */
    public static int executeUpdate(String sql,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        int result = 0;
        try {
            //獲取數據庫連接對象
            conn = JDBCUtil.getConn();
            //獲取預編譯語句對象
            psmt = conn.prepareStatement(sql);
            //給預編譯語句賦值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //執行SQL語句獲取執行結果
            result = psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //關閉數據庫連接
            JDBCUtil.close(conn,psmt,null);
        }
        return result;
    }

    /**
     * 查詢操作
     * @param sql SQL語句
     * @param handler 判斷查詢一個還是多個
     * @param params 可變參數
     * @param <T> 具體操作的實體類
     * @return 返回IResultSetHandler接口中的泛型
     */
    public static <T> T executeQuery(String sql, IResultSetHandler<T> handler,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            //獲取數據庫連接對象
            conn = JDBCUtil.getConn();
            //獲取預編譯語句對象
            psmt = conn.prepareStatement(sql);
            //給預編譯語句賦值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //執行SQL語句獲取結果集
            rs = psmt.executeQuery();
            //處理結果集
            return handler.handle(rs);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //關閉數據庫連接
            JDBCUtil.close(conn,psmt,rs);
        }
        return null;
    }
}

對於查詢,可能返回一個JavaBean對象,也可能返回一個JavaBean的集合,所以我們可以定義一個接口,這個接口專門來處理結果集,接口方法返回的爲泛型參數,具體返回什麼由用戶自己定義。

(1)接口

/**
 * 把JDBC返回的結果集封裝成特定類型
 * @Author: fangju
 * @Date: 2019/6/15
 */
public interface IResultSetHandler<T> {
    T handle(ResultSet rs) throws Exception;
}

(2)接口實現類

/**
 * 返回一個JavaBean
 * @Author: fangju
 * @Date: 2019/6/15
 */
public class BeanHandler<T> implements IResultSetHandler<T> {
    private Class<T> clazz;

    public BeanHandler(Class<T> clazz){
        this.clazz = clazz;
    }

    @Override
    public T handle(ResultSet rs) throws Exception{
        //結果集默認指向爲第一個數據的前一個
        if (rs.next()){
            //根據傳入的字節碼創建傳入的指定對象
            T obj = clazz.newInstance();
            //獲取指定字節碼信息
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
            //獲取所有屬性描述器
            PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor pd:pds){
                //獲取結果集中對應字段名的值
                Object o = rs.getObject(pd.getName());
                //執行當前方法並傳入參數
                pd.getWriteMethod().invoke(obj,o);
            }
            return obj;
        }
        return null;
    }
}
/**
 * 返回一個JavaBean的集合
 * @Author: fangju
 * @Date: 2019/6/15 17:31
 */
public class BeanListHandler<T> implements IResultSetHandler<List<T>> {
    private Class<T> clazz;

    public BeanListHandler(Class<T> clazz){
        this.clazz = clazz;
    }

    @Override
    public List<T> handle(ResultSet rs) throws Exception {
        //獲取指定字節碼信息
        BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
        //獲取所有屬性描述器
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        List<T> list = new ArrayList<>();
        while (rs.next()){
            T obj = clazz.newInstance();
            for (PropertyDescriptor pd:pds){
                //獲取結果集中對應字段名的值
                Object o = rs.getObject(pd.getName());
                //執行當前方法並傳入參數
                pd.getWriteMethod().invoke(obj,o);
            }
            list.add(obj);
        }
        return list;
    }
}

3. 測試

轉自:https://blog.csdn.net/qq_40833790/article/details/92164828

表示感謝!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章