JDBC数据库编程总结(二)

本文深入解析SQL语句在JDBC中的应用,包括普通Statement、灵活的PreparedStatement、用于调用存储过程的CallableStatement,以及JDBC的事务管理机制。通过实例代码,详细演示如何执行SQL语句、批处理、存储过程调用,并阐述事务的使用场景及回滚机制。

三种不同的Statement:Statement、PreparedStatement、CallableStatement

(1)最普通的Statement:Connection.createStatement()
(2)可以灵活指定SQL语句中的变量PreparedStatement
           pstmt = Connection.prepareStatement("insert into sample values(?,?,?)") (?为占位符)
           pstmt.executeUpdate()执行。
(3)对存储过程进行调用CallableStatement:cstmt = Connection.prepareCall("{call p(?,?,?,?)}")
        调用存储过程需要指定存储过程中参数的类型,假设存储过程p要四个参数,第1、2个参数为输入参数,第3、
4个参数为输出参数

Code:
  1. cstmt.registerOutParameter(3, java.sql.Types.INTEGER);   
  2. cstmt.registerOutParameter(4, java.sql.Types.INTEGER);   
  3. cstmt.setInt(1,3);   
  4. cstmt.setString(2,"123");   
  5. cstmt.execute();  

JDBC进行批处理,一次执行多条SQL语句 Batch:

Statement的做法:

Code:
  1. String[] sql = {"insert into sample values(1001,'tt',22)",
  2.                 "insert into sample values(1002,'yy',21)",
  3.        "insert into sample values(1003,'qq',20)"};   
  4. for(int i=0; i<sql.length; i++) {   
  5. stmt.addBatch();   
  6. }   
  7. stmt.executeBatch();  

preparedStatement的做法:

Code:
  1. pstmt = Connection.prepareStatement("insert into sample values(?,?,?)");   
  2. pstmt.setInt(11001);   
  3. pstmt.setString(2"tt");   
  4. pstmt.setInt(322);   
  5. pstmt.addBatch();   
  6.   
  7. pstmt.setInt(11002);   
  8. pstmt.setString(2"yy");   
  9. pstmt.setInt(322);   
  10. pstmt.addBatch();   
  11.   
  12. pstmt.setInt(11001);   
  13. pstmt.setString(2"qq");   
  14. pstmt.setInt(322);   
  15. pstmt.addBatch();   
  16.   
  17. pstmt.executeBatch();  

事务Transaction,银行转账 事务回滚:

默认状态DML语句会自动提交这样如果上一条语句执行成功的时候,下一条语句没有成功,会出现脏数据,这样的情况是不允许出现的,事务就是解决这种问题的。

Code:
  1. try {   
  2.     conn.setAutoCommit(false); //设置不自动提交   
  3.     stmt = conn.createStatement();   
  4.     String[] sql = {"insert into sample values(1001,'tt',22)",   
  5.             "insert into sample values(1002,'yy',21)",   
  6.             "insert into sample values(1003,'qq',20)"};   
  7.     for(int i=0; i<sql.length; i++) {   
  8.         stmt.addBatch();   
  9.     }   
  10.     stmt.executeBatch();   
  11.     conn.commit(); //手动提交   
  12.     conn.setAutoCommit(true);  //恢复现场   
  13. catch(SQLException e) {   
  14.     System.out.println("执行sql语句时出现异常,操作将被撤销!");   
  15.     try {   
  16.         if(onn != null) {   
  17.             conn.rollback();   
  18.             conn.setAutoCommit(true);  //恢复现场   
  19.         }   
  20.     } catch(SQLException e) {   
  21.         e.printStackTrace();   
  22.     }   
  23. finally {   
  24.     //关闭操作   
  25. }  

可滚动的结果集 Movable ResultSet:

Code:
  1. stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);   
  2. ResultSet rs = stmt.executeQuery("select * from sample");   
  3. rs.next();   
  4. rs.last(); //往最后一条记录滚   
  5. rs.previous();   
  6. rs.absolute(6); //定位到第6条记录   
  7. rs.getRow(); //返回记录总数  

可更新的结果集 Updatable ResultSet:

Code:
  1. stmt = conn.createStatement(ResultSet.Type_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);   
  2. rs = stmt.executeQuery("select * from sample");   
  3. rs.next();   
  4. rs.updateString("xxxx""AAAA"); //更新某个字段   
  5. rs.updateRow(); //和上一句同时使用得到更新   
  6. //插入新行   
  7. rs.moveToInsertRow();   
  8. rs.updateXXX(); //为新插入的行更新数据   
  9. rs.insertRow();   
  10. //将光标移动到新行   
  11. rs.moveToCurrentRow();   
  12. //删除行   
  13. rs.absolute(5);   
  14. rs.deleteRow();   
  15. //取消更新   
  16. rs.cancelRowUpdates();  

说明:rs是一个结果集,它应该是一个指针(Java中没有指针的显示概念),我们在做操作的时候,首先要对其进行定位,然后才可以执行操作。

JDBC的更新:

DataSource和RowSet
DriverManager -> DataSource
ResultSet -> RowSet

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值