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ù)類型操作
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ù).
如何在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);
}
}