学习jdbc第三天(最后一天)
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);
}
}