JDBC(五)批處理操作、大數(shù)據(jù)類型、自動(dòng)獲取主鍵

1.批處理操作

批量操作(batch):

當(dāng)需要成批插入或者更新記錄時(shí)。可以采用Java的批量更新機(jī)制.
這一機(jī)制允許多條語(yǔ)句一次性提交給數(shù)據(jù)庫(kù)批量處理。通常情況下比單獨(dú)提交處理更有效率.
JDBC的批量處理語(yǔ)句包括下面兩個(gè)方法:

addBatch(String sql):添加需要批量處理的SQL語(yǔ)句或是參數(shù);
executeBatch();執(zhí)行批量處理語(yǔ)句;

通常我們會(huì)遇到兩種批量執(zhí)行SQL語(yǔ)句的情況:

  • 1.多條SQL語(yǔ)句的批量處理; :Statement
  • 2.一個(gè)SQL語(yǔ)句的批量傳參; :PreparedStatement

需求:同時(shí)向t_student表,插入1000條數(shù)據(jù)。在JDBC中,MySQL不支持批量操作。

public class BatchTest extends TestCase {

    // 耗時(shí):1022
    public void testInsertByStatementBatch() throws Exception {
        Connection conn = JdbcUtil.getConn();
        Statement st = conn.createStatement();
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            String sql = "INSERT INTO t_student (NAME, age) VALUES ('name" + i + "'," + i + ");";

            st.addBatch(sql);
            if (i % 200 == 0) {
                System.out.println("sql:" + sql);
                st.executeBatch();// 執(zhí)行批量處理
                st.clearBatch();// 清除批量處理中的信息
            }
        }
        System.out.println("耗時(shí):" + (System.currentTimeMillis() - begin));
        JdbcUtil.close(conn, st, null);
    }

    // 耗時(shí):1045
    public void testInsertByPrepareStatementBatch() throws Exception {
        Connection conn = JdbcUtil.getConn();
        String sql = "INSERT INTO t_student (NAME, age) VALUES ('?',?);";
        PreparedStatement ps = conn.prepareStatement(sql);
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            ps.setString(1, "name" + i);
            ps.setInt(2, i);
            ps.addBatch();
            if (i % 200 == 0) {
                System.out.println("sql:" + sql);
                ps.executeBatch(); // 執(zhí)行批量處理
                ps.clearBatch(); // 清除批量處理中的信息
                ps.clearParameters();// 清除批量處理中的參數(shù)
            }
        }
        System.out.println("耗時(shí):" + (System.currentTimeMillis() - begin));
        JdbcUtil.close(conn, ps, null);
    }

}

Statement 批處理: 一次性可以執(zhí)行多條sql語(yǔ)句,需要編譯多次。

應(yīng)用場(chǎng)景:系統(tǒng)初始化 (創(chuàng)建表,創(chuàng)建數(shù)據(jù)等)
添加sql語(yǔ)句,st.addBatch(sql) --添加sql語(yǔ)句
批量處理sql語(yǔ)句,int[] st.executeBatch()
清除緩存: st.clearBatch();


PreparedStatement 批處理: 執(zhí)行一條sql語(yǔ)句,編譯一次,執(zhí)行sql語(yǔ)句的參數(shù)不同。

應(yīng)用場(chǎng)景:表數(shù)據(jù)初始化
添加批量參數(shù):psmt.addBatch() --添加實(shí)際參數(shù),執(zhí)行之前,需要執(zhí)行psmt.setXxx()設(shè)置實(shí)際參數(shù)
執(zhí)行批處理:int[] psmt.executeBatch()
清除緩存:pstm.clearBatch();

2.大數(shù)據(jù)類型操作

大數(shù)據(jù)類型1.png
大數(shù)據(jù)類型2.png

BLOB系列是大的二進(jìn)制類型,允許存儲(chǔ)(255個(gè)字節(jié)到4G).二進(jìn)制類型存儲(chǔ)二進(jìn)制數(shù)據(jù)(圖像,音頻,視頻等);
在開發(fā)中,對(duì)于圖片,音頻,視頻,我們往往是不會(huì)直接存儲(chǔ)到數(shù)據(jù)庫(kù)中的.我們把圖片,音頻,視頻存儲(chǔ)到服務(wù)端磁盤中,然后在數(shù)據(jù)庫(kù)表中存儲(chǔ)其存儲(chǔ)的位置.

id          name        age          headImg
--------------------------------------------------------
1           蕭峰        30           /upload/qiao.png
2           阿朱        18           /upload/az.png

存儲(chǔ)圖片.png

TEXT系列,是大的VARCHAR類型.
一般的,存儲(chǔ)文字過(guò)多的博客,書籍內(nèi)容等.
TEXT系列的類型和VARCHAR僅僅只是在MySQL中數(shù)據(jù)類型不一樣,在Java代碼中都對(duì)應(yīng)著String數(shù)據(jù)類型。

3.獲取自動(dòng)生成的主鍵

為什么需要獲取主鍵: 分析一個(gè)案例:

在線注冊(cè)案例:
1:進(jìn)入注冊(cè)頁(yè)面
2:處理注冊(cè)功能:在數(shù)據(jù)庫(kù)表中插入一條數(shù)據(jù).
3:進(jìn)入信息完善頁(yè)面.
4:處理完善個(gè)人信息:在數(shù)據(jù)庫(kù)表中更新一條數(shù)據(jù).

獲取自動(dòng)生成的主鍵案例.png

如何在JDBC中保存數(shù)據(jù)的時(shí)候獲取自動(dòng)生成的主鍵呢?

  • Statement方式:

1.執(zhí)行SQL:

int executeUpdate(String sql,int autoGeneratedKeys)
//參數(shù):autoGeneratedKeys,是否需要返回自動(dòng)生成的主鍵.常量值:Statement.RETURN_GENERATED_KEYS.

2.getGeneratedKeys

ResultSet getGeneratedKeys():獲取自動(dòng)生成的主鍵
  • PreparedStatement方式:
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)  :
//創(chuàng)建PreparedStatement對(duì)象,病指定是否需要返回生成的主鍵. 常量值:Statement.RETURN_GENERATED_KEYS

單據(jù)和單據(jù)明細(xì):

Hibernate中可以自動(dòng)返回

public class GeneratedKeysTest extends TestCase {

    
    public void testInsertByStatemen() throws Exception {
        String sql = "INSERT INTO t_student (NAME, age) VALUES ('jarry',20)";
        Connection conn = JdbcUtil.getConn();
        Statement st = conn.createStatement();
        st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
        ResultSet rs=st.getGeneratedKeys();
        if(rs.next()){
            Long id=rs.getLong(1);
            System.out.println(id);
        }
        JdbcUtil.close(conn, st, rs);
    }

    
    public void testInsertByPrepareStatement() throws Exception {
        Connection conn = JdbcUtil.getConn();
        String sql = "INSERT INTO t_student (NAME, age) VALUES ('?',?);";
        PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
        ps.setString(1, "xiaohua");
        ps.setInt(2, 80);
        ps.executeUpdate();
        ResultSet rs=ps.getGeneratedKeys();
        if(rs.next()){
            Long id=rs.getLong(1);
            System.out.println(id);
        }
        JdbcUtil.close(conn, ps, rs);
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評(píng)論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,368評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,235評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,427評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,656評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,160評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,380評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容