1. 程式人生 > 實用技巧 >JDBC工具類實現對資料庫資料的增刪改查

JDBC工具類實現對資料庫資料的增刪改查

1、先將連線的地址和賬號密碼放在屬性檔案中,本地連線直接///代替,java1.6以後自動載入驅動

url = jdbc:mysql:///testdata
user = root
password = 123456

2、讀取屬性檔案獲取值

private static String url;    
private static String user;
private static String password;
static{
        getLogin();
    }
    
public static void getLogin(){
    try {
        Properties p 
= new Properties(); InputStream is = new FileInputStream("E:/java_workspace/Demojdbc/src/jdbc.properties"); //這個路徑是屬性檔案存在的位置 p.load(is); url = p.getProperty("url"); user = p.getProperty("user"); password = p.getProperty("password"); } catch (Exception e) {
// TODO Auto-generated catch block e.printStackTrace(); } }

3、獲取連線

private static Connection conn = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;

/**
 * 連線資料庫
* @return  資料庫連線物件
*/
public static Connection getConn(){
    try {
        conn 
= DriverManager.getConnection(url, user,password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; }

4、關閉流

public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
        if (conn!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(ps != null){
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }finally{
                        if(rs != null){
                            try {
                                rs.close();
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }

5、增刪改操作:傳入sql語句和引數,引數可以是任意個

舉例:String sql = "select * from user"; 呼叫時直接是 crud(sql);

   String sql = "update user set name = ? where id = ? "; 根據佔位符傳引數,引數與佔位符的位置一一對應,有幾個佔位符對應幾個引數。

public static void crdu(String sql,Object...array){

        //獲取連線
        conn = getConn();
        try {
            ps = conn.prepareStatement(sql); 
            
            for (int i = 0; i < array.length; i++) {
                ps.setObject(i+1, array[i]);
            }

            ps.execute();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            jdbc.close(conn, ps, rs);
        }
    }

6、查詢操作

使用舉例:

public List<User> find(String name) {
String sql = "select * from cat where name like concat('%',?,'%')";
List<User> list = jdbc.read(sql, User.class, name);
return list;
}

/**
     * 對資料進行查詢
     * @param <E> 第一個E代表返回的型別是泛型,第二個E代表list存的是泛型E
     * @param sql  操作的sql語句
     * @param c       要操作的類物件,對那個物件操作傳哪個
     * @param array  引數陣列
     */
public static <E> List<E> read(String sql,Class<E> c,Object...array){
        List<E> list = null;

        //獲取連線
        conn = getConn();
        try {
            
            list = new ArrayList<>();
            
            ps = conn.prepareStatement(sql);
            
            for (int i = 0; i < array.length; i++) {
                ps.setObject(i+1, array[i]);
            }
            rs = ps.executeQuery();
            
            while(rs.next()){
                E e = c.newInstance();
                // 獲得ResultSetMetaData 物件,可以通過他來獲得列的數量和名稱
                ResultSetMetaData data = rs.getMetaData();
                // 獲得列的數量
                int count = data.getColumnCount();
                for (int i = 1; i <= count; i++) {
                    // 獲取到所有的列名稱
                    String colname = data.getColumnLabel(i);
                    //獲得class中指定屬性
                    Field f = c.getDeclaredField(colname);
                    //破壞訪問修飾符,讓許可權釋放,否則不能訪問私有屬性
                    f.setAccessible(true);
                    //對私有屬性賦值
                    f.set(e, rs.getObject(i));
                }
                list.add(e);
            }
            
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }finally{
            close(conn, ps, rs);
        }
        
        return list;
    }

以上除了屬性檔案裡的內容都是寫在一個類中的,可以直接複製貼上測試。