JDBC連接數(shù)據(jù)庫操作

Mysql jdbc 連接數(shù)據(jù)庫

  • statement方式
  • 1.注冊驅(qū)動
    2.建立連接
    3.獲取執(zhí)行者平臺
    4.準備sql語句
    5.執(zhí)行sql語句,返回結(jié)果集
    6.處理結(jié)果集
    7.釋放資源
@Test
    public void run(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
            String user = "root";
            String password = "root";
            Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement();
            String sql = "select * from student;";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("name")+" -- "+rs.getString("age"));
            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Oracle

@Test
    public void run(){
        try {
            Class.forName("oracle.jdbc.OracleDriver");
            String url = "jdbc:oracle:thin:@localhost:1521:orcl";
            String user = "scott";
            String password = "1234";
            Connection conn = DriverManager.getConnection(url, user, password);
            Statement stmt = conn.createStatement();
            String sql = "select * from emp";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()){
                System.out.println(rs.getString("ename")+" -- "+rs.getInt("deptno"));
            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • prepareStatements方式
  • 1.注冊驅(qū)動
    2.建立連接
    3.準備sql語句
    4.獲取預處理執(zhí)行者平臺
    5.將需要操作的信息設置到ptmt
    6.執(zhí)行sql語句
    *7.釋放資源
@Test
    public void run1(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
            String user = "root";
            String password = "root";
            Connection conn = DriverManager.getConnection(url, user, password);
            String sql = "select * from student where id = ?;";
            PreparedStatement ptmt = conn.prepareStatement(sql);
            ptmt.setString(1, "4");
            ResultSet rs = ptmt.executeQuery();
            /*int i = ptmt.executeUpdate();
            if(i == 1){
                System.out.println("查詢成功");
                System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
            }else{
                System.out.println("查詢失敗");
            }*/
            while(rs.next()){
                System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
            }
            rs.close();
            ptmt.close();
            conn.close();
            
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

Oracle

@Test
    public void run1() throws Exception{
        Class.forName("oracle.jdbc.OracleDriver");
        String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        String user = "scott";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, user, password);
        String sql = "select * from emp";
        PreparedStatement ptmt = conn.prepareStatement(sql);
        ResultSet rs = ptmt.executeQuery();
        while(rs.next()){
            System.out.println(rs.getInt("empno")+"+"+rs.getString("ename")+"+"+rs.getString("job"));
        }
        rs.close();
        ptmt.close();
        conn.close();
    }

QueryRunner操作對象
插入數(shù)據(jù)

public void insert() throws SQLException {

        // 1. 獲取 Connection 連接對象
        // Connection conn = DataBaseUtils.getDataBaseConnection();

        // 2. 創(chuàng)建 QueryRunner 操作對象
        // 在調(diào)用 QueryRunner() 方法的時候,需要傳入一個 dataSource 數(shù)據(jù)源
        // dataSource 數(shù)據(jù)源 到底是一個什么東西?
        // 簡單理解,就是需要操作的數(shù)據(jù)庫中的數(shù)據(jù) DataSource
        // 在 DataBaseUtils 工具類中,通過 getDataBaseConnection() 已經(jīng)將數(shù)據(jù)庫資源獲取了
        QueryRunner qr = new QueryRunner();

        // 3. 準備 SQL
        String sql = "insert into tb_student(username, password) values (?, ?)";

        // 4. 給占位符進行賦值
        Object[] params = { "hello", 123 };

        // 5. 執(zhí)行操作
        int i = qr.execute(conn, sql, params);

        // 也可以使用 update() 方法進行操作,update() 方法可以同時操作 insert、update、delete
        // int i = qr.update(conn, sql, params);

        System.out.println(i);

        // 5. 釋放資源
        DbUtils.close(conn);
    }

更新數(shù)據(jù)

public void update() throws SQLException {

        QueryRunner qr = new QueryRunner();

        String sql = "update tb_student set username = ?, password = ? where id = ?";

        Object[] params = { "溫老板", 250, 3};

        int i = qr.execute(conn, sql, params);

        System.out.println(i);

        // 5. 釋放資源
        DbUtils.close(conn);
    }

刪除數(shù)據(jù)

public void delete() throws SQLException {

        QueryRunner qr = new QueryRunner();

        String sql = "delete from tb_student where id = ?";

        int i = qr.execute(conn, sql, 5);

        DbUtils.close(conn);
    }

DateBaseUtils工具類

public class DataBaseUtils {
    
    public DataBaseUtils(){
        super();
    }
    
    private static Connection conn;
    
    // 如果將注冊和獲取連接對象放到一個方法中的話,其實不好,因為想要用到它們的時候必須要先調(diào)用方法才行。
    // 而每次調(diào)用方法,都要重新注冊一次,獲取一次新的連接對象,對性能消耗太大
    // 疑問:能不能只要去注冊一次,只要有一個連接對象就可以?
    static {
        
        try {

            // 1. 注冊驅(qū)動(老司機)
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 獲取連接對象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true ",
                    "root", "root");
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    // 1. 獲取數(shù)據(jù)庫連接
    public static Connection getDataBaseConnection(){
        return conn;
    }
    
    // 2. 關閉資源
    public static void closeResource(Connection conn , Statement stmt, ResultSet rs){
        
        // 注意,在關閉之前,要判斷所操作的資源不能是 null,否則報 NullPointerException 異常
        if(rs != null){         
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if(stmt != null){           
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if(conn != null){           
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void closeResource(Connection conn , Statement stmt){

        if(stmt != null){           
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if(conn != null){           
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void closeResource(Connection conn){
    
        if(conn != null){           
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

commons.dbutils.QueryRunner query方法中RequestSetHandler 參數(shù)對應的返回類型:

AbstractListHandler -- 返回多行List的抽象類

ArrayHandler -- 返回一行的Object[]

ArrayListHandler -- 返回List,每行是Object[]

BeanHandler -- 返回第一個Bean對象

BeanListHandler -- 返回List,每行是Bean

ColumnListHandler -- 返回一列的List

KeyedHandler -- 返回Map,具體見代碼

MapHandler -- 返回單個Map

MapListHandler -- 返回List,每行是Map

ScalarHandler -- 返回列的頭一個值

apache.commons.dbutils.QueryRunner.query方法的handler參數(shù)
第一次用apache.commons.dbutils.QueryRunner訪問數(shù)據(jù)庫的人會有一個疑問..

String url = "jdbc:mysql://localhost:3306/test";
Connection con = DriverManager.getConnection(url, "root", "pwd");
String sql = "select * from myTable";
QueryRunner qr = new QueryRunner();
qr.query(con, sql, handler); //con是數(shù)據(jù)庫連接, sql是查詢語句, handler是什么?

QueryRunner.query方法的返回值是一個Object對象,該Object對象保存著從數(shù)據(jù)庫獲取的數(shù)據(jù),

它的類型(可顯式轉(zhuǎn)換的類型)是由調(diào)用query方法時的handler參數(shù)決定的.

ResultSetHandler handler = new ArrayHandler();
Object obj = qr.query(con, sql, handler);
Object[] arr = (Object[])obj;

ResultSetHandler handler = new ArrayListHandler();
Object obj = qr.query(con, sql, handler);
List list = (List)obj;

也就是說,保存數(shù)據(jù)的Object對象的顯式轉(zhuǎn)換類型是由handler參數(shù)決定的.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容