day03
複習
1.使用JDBC的流程
- 下載jar包
註冊驅動
Class.forName(DriverClassName);
獲得連接對象
BasicDataSource ds=new BasicDataSource(); Connection conn=ds.getConnection();
獲取能夠執行sql語句的對象
Statement sta=conn.createStatement(); PreparedStatement ps=conn.preparedStatement(DML);
運行sql語句/執行計劃
- sta.execute(DDL);
- ps.setXXX(index,值);
- ps.executeUpdate();
- ResultSet rs=ps.executeQuery();
處理ResultSet中結果集
while(rs.next()){ rs.getXXX("字段名");//注意別名 rs.getXXX(index); }
歸還連接對象
conn.close();
批量處理
什麼是批量處理
爲什麼使用批量處理
使用批量處理
積攢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);
}
}
積攢參數,使用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);
}
}
課堂練習
使用sta對象,批量執行DDL語句 5個
log6 (id int,msg varchar(20)) sta.addBatch(sql) sta.executeBatch()
使用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);
課堂練習
- 完成轉賬事務邏輯
- 提高,把這個邏輯封裝成方法 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);
}
}