JAVA- JDBC之DBHelper


package com.myit.util;

import java.lang.reflect.Field;
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.util.ArrayList;
import java.util.List;

public class DBHelper {
    private static final String DRIVER="com.mysql.jdbc";
    private static final String URL="jdbc:mysql://localhost:3306/dvd";
    private static final String USER="root";
    private static final String PASSWORD="root";
    
    /**
     * 連接數據庫
     * @return 鏈接數據庫對象
     */
    public Connection getConnection(){
        Connection conn=null;
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            conn=DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    
    /**
     * 釋放相應的資源
     * @param rs
     * @param pstmt
     * @param conn
     */
    public void closeAll(ResultSet rs,PreparedStatement pstmt,Connection conn){
        try {
            if(rs!=null){
                rs.close();
            }
            if(pstmt!=null){
                pstmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 此方法可以完成增刪改所有的操作
     * @param sql
     * @param params
     * @return true or false
     */
    public boolean excuteUpdate(String sql,List<Object> params){
        int res=0;//受影響的行數
        Connection conn=null;
        PreparedStatement pstmt = null;
        ResultSet rs=null;
        try {
            conn=getConnection();
            pstmt=conn.prepareStatement(sql);//裝載sql語句
            if(params!=null){
                //加入有?占位符,在執行之前把?占位符替換掉
                for(int i=0;i<params.size();i++){
                    pstmt.setObject(i+1, params.get(i));
                }
            }
            res=pstmt.executeUpdate();
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            closeAll(rs, pstmt, conn);
        }
        return res>0?true:false;
    }
    
    /**
     * 使用泛型方法和反射機制進行封裝
     * @param sql
     * @param params
     * @param cls
     * @return
     */
    public <T> List<T> executeQuery(String sql,List<Object> params,Class<T> cls) throws Exception{
        Connection conn=null;
        PreparedStatement pstmt = null;
        ResultSet rs=null;
        List<T> data=new ArrayList<T>();
        try {
            conn=getConnection();
            pstmt=conn.prepareStatement(sql);//裝載sql語句
            if(params!=null){
                //加入有?占位符,在執行之前把?占位符替換掉
                for(int i=0;i<params.size();i++){
                    pstmt.setObject(i+1, params.get(i));
                }
            }
            rs=pstmt.executeQuery();
            //把查詢出來的記錄封裝成對應的實體類對象
            ResultSetMetaData rsd=rs.getMetaData();//獲得列對象,通過此對象可以得到表的結構,包括,列名,列的個數,列的數據類型
            while(rs.next()){
                T m=cls.newInstance();
                for(int i=0;i<rsd.getColumnCount();i++){
                    String col_name=rsd.getColumnName(i+1);//獲得列名
                    Object value=rs.getObject(col_name);//獲得列所對應的值
                    Field field=cls.getDeclaredField(col_name);
                    field.setAccessible(true);//給私有屬性設置可訪問權
                    field.set(m, value);//給對象的私有屬性賦值
                }
                data.add(m);
            }
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            closeAll(rs, pstmt, conn);
        }
        return data;
    }
}
 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM