第七章 JDBC高级应用
1, 使用滚动结果集操作数据库
con = DBManager.getCon();
String sql="select * from student";
//只读结果集
pst=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
rst = pst.executeQuery();
rst.absolute(3);//定位至结果集第三条记录
System.out.println(rst.getString(2));
rst.previous();//定位至当前记录的上一条记录
System.out.println(rst.getString(2));
rst.next();//定位至当前记录的下一条记录
System.out.println(rst.getString(2));
rst.first();//定位至第一条记录
System.out.println(rst.getString(2));
rst.last();//定位至最后一条记录
System.out.println(rst.getString(2));
//可以修改结果集,并且修改的数据可以反应到表中,表中的修改可以反应到//结果集中、
pst=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rst = pst.executeQuery();
//通过结果集向表中插入一行数据
rst.moveToInsertRow();//移动到可以插入的数据列
rst.updateString(“name”, “0916”);//设置要插入字段的信息
rst.updateString(“majoy”, “法律”);//设置要插入字段的信息
rst.insertRow();//插入数据
//通过结果集更新表stuclass中第三条记录majoy字段的信息,表中的数据也变
rst.absolute(3);//将结果集指针定位至第三条记录
rst.updateString(“majoy”, “英语”);//更新第三条记录字段的信息
rst.updateRow();//更新数据
//删除结果集中的第十三条记录,表中的这条记录也删除
rst.absolute(13);//定位至结果集中的第13条记录
rst.deleteRow();//删除第13条记录
2, 使用CallableStatement调用存储过程
存储过程分类:无参数的存储过程、带输入参数的存储过程、带输入及输出参数的存储过程、带return语句的存储过程
调用步骤:
第一步:调用连接对象的prepareCall方法创建CallableStatement对象,并在该方法中设置固定格式的参数
语法:con.prepareCall(“{call 存储过程名称()}”);
a) 调用无参的存储过程
Connection con=getCon();
CallableStatement cst=null;
ResultSet rs=null;
cst=con.prepareCall(“{call pro_student()}”);
cst.execute(); //执行存储过程
rs=cst.getResultSet();
b) 调用含输入参数的存储过程
存储过程pro_stu1有一个输入参数
Connection con=getCon();
CallableStatement cst=null;
ResultSet rs=null;
cst=con.prepareCall(“{call pro_student(?)}”);
cst.setString(1,”xcl”);
cst.execute();
rs=cst.getResultSet();
c) 有输出参数的存储过程
存储过程pro_stu2有一个输入参数和一个整形的输出参数
Connection con=getCon();
CallableStatement cst=null;
ResultSet rs=null;
cst=con.prepareCall(“{call pro_student(?,?)}”);
cst.setString(1,”xcl”);
cst.registerOutParameter(2,java.sql.Types.INTEGER);
cst.execute();
//获得输出参数值并输出
System.out.println(cst.getInt(2));
d) 调用含return语句的存储过程,需要在call语句前使用占位符获取return语句返回的信息
Connection con=getCon();
CallableStatement cst=null;
ResultSet rs=null;
cst=con.prepareCall(“{? =call pro_student(?,?)}”);
cst.setString(1,java.sql.Types.INTEGER);
cst.setString(2,”xcl”);
cst.registerOutParameter(3,java.sql.Types.INTEGER);
cst.execute();
//获得返回值并输出
System.out.println(cst.getInt(1));
3, JDBC事务
A,Java事务分类:JDBC事务、JTA(Java Transaction API)事务、容器事务
B,使用JDBC事务的步骤:
第一步:取消Connection对象默认的事务自动提交方式
con.setAutoCommit(false);
第二步:所有SQL语句执行成功后提交事务
con.commit();
第三步:若执行SQL语句过程过发生异常则回滚事务
con.rollback();
try{
con = DBManager.getCon();
con.setAutoCommit(false); //取消自动提交事务方式
pst = con.prepareStatement("insert into stuclass values('0924','英语')");
pst.execute();
pst = con.prepareStatement("insert into stuclass values('092'5','法律')");
pst.execute();
con.commit(); //在所有语句执行成功的情况下提交事务
}catch(Exception e){
try {
con.rollback(); //若执行过程中发生异常则回滚事务
}catch(Exception ex){
ex.printStackTrace();
}
e.printStackTrace();
}
通过设置回滚点(Savepoint),撤销部分操作
Savepoint sp=null; //回滚点类型
try{
con = DBManager.getCon();
con.setAutoCommit(false); //取消自动提交事务方式
pst = con.prepareStatement("insert into stuclass values('0924','英语')");
pst.execute();
sp=con.setSavepoint(); //创建回滚点对象
pst = con.prepareStatement("insert into stuclass values('092'5','法律')");
pst.execute();
con.commit(); //在所有语句执行成功的情况下提交事务
}catch(Exception e){
try {
con.rollback(sp); //回滚事务至回滚点
con.commit(); //提交事务,不能少
}catch(Exception ex){
ex.printStackTrace();
}
e.printStackTrace();
}