學習jdbc第三天(最後一天)

day03

複習

1.使用JDBC的流程

  1. 下載jar包
  2. 註冊驅動

    Class.forName(DriverClassName);

  3. 獲得連接對象

    BasicDataSource ds=new BasicDataSource(); Connection conn=ds.getConnection();

  4. 獲取能夠執行sql語句的對象

    Statement sta=conn.createStatement(); PreparedStatement ps=conn.preparedStatement(DML);

  5. 運行sql語句/執行計劃

    • sta.execute(DDL);
    • ps.setXXX(index,值);
    • ps.executeUpdate();
    • ResultSet rs=ps.executeQuery();
  6. 處理ResultSet中結果集

    while(rs.next()){ rs.getXXX("字段名");//注意別名 rs.getXXX(index); }

  7. 歸還連接對象

    conn.close();

批量處理

什麼是批量處理

爲什麼使用批量處理




使用批量處理

  1. 積攢DDL語句,使用Statement對象

    sta.addBatch(ddl);
    sta.executeBatch();
    sta.clearBatch();
    

public static void main(String[] args) {
    //準備一批sql語句
    String ddl1="create table log1(id int,msg varchar(20))";
    String ddl2="create table log3(id int,msg varchar(20))";
    String ddl3="create table log4(id int,msg varchar(20))";
    String ddl4="create table log5(id int,msg varchar(20))";
    String ddl5="create table log2(id int,msg varchar(20))";
    Connection conn=null;
    try {
        conn=DBUtils1.getConnection();
        Statement sta=conn.createStatement();
        //把一批sql語句添加到緩存中
        sta.addBatch(ddl1);
        sta.addBatch(ddl2);
        sta.addBatch(ddl3);
        sta.addBatch(ddl4);
        sta.addBatch(ddl5);
        //執行一批SQL語句
        int[] arr=sta.executeBatch();
        //返回值有3種
        //1.>=0 代表成功
        //2.代表成功-2
        //oracle對executeBatch()並不完全支持,返回-2
        //3.代表失敗-3
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        DBUtils1.closeConnection(conn);
    }

}
  1. 積攢參數,使用PreparedStatement,重用執行計劃

    ps.addBatch(); ps.executeBatch(); ps.clearBatch();


public static void main(String[] args) {
    //準備dml語句
    String dml=
            "insert into log1 values(?,?)";
    Connection conn=null;
    try {
        conn=DBUtils1.getConnection();
        PreparedStatement ps=
                conn.prepareStatement(dml);
        //把一批參數添加到ps的緩存中
        ps.setInt(1, 1);
        ps.setString(2, "1111");
        ps.addBatch();
        ps.setInt(1, 2);
        ps.setString(2, "2222");
        ps.addBatch();
        ps.setInt(1, 3);
        ps.setString(2, "3333");
        ps.addBatch();
        //批量執行一批參數
        int[] arr=ps.executeBatch();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        DBUtils1.closeConnection(conn);
    }
}

結果集元數據

就是結果集的相關信息

爲了獲取結果集中其它的描述信息


如何使用

public static void main(String[] args) {
    Connection conn=null;
    try {
        conn=DBUtils1.getConnection();
        String sql="select * from emp";
        Statement sta=conn.createStatement();
        ResultSet rs=sta.executeQuery(sql);
        //獲取元數據
        ResultSetMetaData meta=
                rs.getMetaData();
        //獲取列的數量
        int n=meta.getColumnCount();
        System.out.println(n);
        //獲取列的名稱
        String name1=meta.getColumnName(1);
        String name2=meta.getColumnName(2);
        System.out.println(name1+"~"+name2);
        for(int i=1;i<=meta.getColumnCount();i++){
            System.out.println(meta.getColumnName(i));
        }


    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        DBUtils1.closeConnection(conn);
    }
}

課堂練習

  1. 使用sta對象,批量執行DDL語句 5個

    log6 (id int,msg varchar(20)) sta.addBatch(sql) sta.executeBatch()

  2. 使用preparedStatement對象,批量更新20條數據

    • 控制不讓內存溢出

事務

set autocommit=0; start transaction

.... commit/rollback

課堂練習

  • 借錢的業務

    create table account1( id int, name varchar(20), money double(7,2) ) insert into account1 values(1,'aaa',10000); insert into account1 values(2,'bbb',100);

課堂練習

  1. 完成轉賬事務邏輯
  2. 提高,把這個邏輯封裝成方法 pay(int from,int to,double money) from--->減錢的賬戶ID to----->加錢的賬戶id money-->轉了多少錢

返回自動主鍵

    create table post(
        id int  primary key auto_increment,
        content varchar(200),
        k_id int
    );
    create table keywords(
        id int primary key auto_increment,
        content varchar(20)
    );

jdbc操作分頁

mysql大表查詢必須使用分頁

select id from keywords limit 1,5;

    public static void main(String[] args) {
        Connection conn=null;
        try {
            conn=DBUtils1.getConnection();
            String sql="select id "
                    + "from keywords limit ?,?";
            PreparedStatement ps=
                    conn.prepareStatement(sql);
            //從0開始,顯示5條
            ps.setInt(1, 0);
            ps.setInt(2, 5);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getInt(1));
            }
        } catch (Exception e) {
        }finally {
            DBUtils1.closeConnection(conn);
        }
    }


官方要求查詢結果存在數據庫的緩存中

直到rs.getXXX,數據纔會傳到服務器內存

但是mysql根標準官方建議不一樣,對jdbc查詢實現的不好

Mysql只要一執行查詢,就把結果全部存到服務器內存中了

Mysql只要查詢大表,必須使用分頁

所以mysql的分頁操作非常簡單,算是一種補救

查詢不許使用select *

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