jdbc的封裝(增刪查改)

DBHelperjava

package com.nll.dao;

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.HashMap;
import java.util.List;
import java.util.Map;

public class DBHelper {
//加載驅動通常來講只加載一次
    static {
        try {
            //第一步加載驅動
            //mysql5.0+版("com.mysql.cj.jdbc.Driver")8.0+版("com.mysql.cj.jdbc.Driver")
            Class.forName("oracle.jdbc.OracleDriver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection() {
        //第二步 創建鏈接 咱們也封裝一下沒有爲何 主要是太長了 本身寫麻煩
        Connection conn=null;
        try {
            //mysql能夠改成"jdbc:mysql://localhost:3306/(數據庫名)?allowPublicKeyRetrieval=true&serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8"
            conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","scott");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    //第三步 寫sql語句 對咱們來講 sql語句只是預處理語句對象裏面的一個參數而已 並且功能不同 sql語句不同
    //所以 sql語句咱們最終也就當作一個參數便可
    
    
    //增刪改 都是同一個方法 executeUpdate 並且返回值也是同樣
    //因此咱們封裝的時候 增刪改一塊兒封裝
    public int doUpdate(String sql,Object...params) {
        //首先獲取鏈接
        Connection conn=getConnection();
        //肯定一個返回值
        int result=-1;
        try {
            //預處理語句對象
            PreparedStatement pstmt=conn.prepareStatement(sql);
            //參數呢,會不會有佔位符?
            //由於不僅僅是增刪改會員參數 咱們查詢也會有參數因此咱們也封裝一下
            
            doParams(pstmt,params);
            //執行sql語句
            result=pstmt.executeUpdate();
            closeAll(null,conn,pstmt);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return result;
        
    }
    public List<Map<String,String>> findAll(String sql,Object...params) {
        List<Map<String,String>> list=new ArrayList<Map<String,String>>();
        try {
        //首先獲取鏈接
        Connection conn=getConnection();
        ResultSet resultset=null;
    
            //預處理語句對象
            PreparedStatement pstmt=conn.prepareStatement(sql);
            //參數呢,會不會有佔位符?
            //由於不僅僅是增刪改會員參數 咱們查詢也會有參數因此咱們也封裝一下
            
            doParams(pstmt,params);
            resultset=pstmt.executeQuery();
            
            //如何獲得Map的鍵-》這個sql語句的字段
            //首先要經過結果集 獲得元數據
            ResultSetMetaData rsmd=resultset.getMetaData();
            String[] columnNames=new String[rsmd.getColumnCount()];
            for (int i = 0; i < columnNames.length; i++) {
                //注意咱們這裏獲得的鍵全都是大寫 所以咱們改成咱們習慣的小寫
                columnNames[i]=rsmd.getColumnName(i+1).toLowerCase();
                
            }
            while(resultset.next()) {
                Map<String,String> map=new HashMap<String,String>();
                //根據列名來取值
                for(String cn:columnNames) {
                    String value=resultset.getString(cn);
                    map.put(cn, value);
                }
                //當一條取完放到list裏面去
                list.add(map);
            }
            closeAll(resultset,conn,pstmt);
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
        
        
    
        
    }
    private void closeAll(ResultSet rs, Connection conn, PreparedStatement pstmt) {
        // TODO Auto-generated method stub
        
            try {
                if(rs!=null) {
                rs.close();
                }
                if(conn!=null) {
                    conn.close();
                }
                if(pstmt!=null) {
                    pstmt.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    private void doParams(PreparedStatement pstmt, Object...params) {
        //先判斷 用戶沒有傳參數過來 那咱們就不用注入參數
        if(params!=null&&params.length>0) {
            //有參數 咱們才注入參數 Object... 量詞參數,本質是一個數組
            for (int i = 0; i < params.length; i++) {
                //萬物皆對象
                try {
                    pstmt.setObject(i+1, params[i]);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        
        
    }
    
}

Test.javamysql

package com.nll.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class Test1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //測試jdbc的封裝
        //由於咱們不是靜態方法 因此先示例化
        DBHelper db=new DBHelper();
//        //寫sql語句不帶參數
//        String sql1="update autoincre_demo set id=id+1";
//        int result1=db.doUpdate(sql1);
//        if(result1>0) {
//            System.out.println("修改爲功");
//        }else {
//            System.out.println("修改失敗");
//        }
//        //寫sql語句 (帶參數的)
//        String sql="update autoincre_demo set NAME=?";
//        //執行
//        int result=db.doUpdate(sql,"海口");
//        if(result>0) {
//            System.out.println("修改爲功");
//        }else {
//            System.out.println("修改失敗");
//        }
        //查詢操做
      String sql2="select * from autoincre_demo";
       List<Map<String,String>> list=db.findAll(sql2);
       for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).get("name"));
    }

       
    }

}
相關文章
相關標籤/搜索