首页 > 编程知识 正文

jdbc事务,jdbc update

时间:2023-05-04 06:36:06 阅读:211526 作者:2203

参考资料:http://how2j.cn?p=28607

一、比较execute、executeUpdate的区别
1.相同点:

        execute与executeUpdate的相同点:都可以执行增加,删除,修改

2.不同点

    不同1:

        execute可以执行查询语句,然后通过getResultSet,把结果集取出来。

        executeUpdate不能执行查询语句。

    不同2:

        execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等。

        executeUpdate返回的是int,表示有多少条数据受到了影响。

运行示例:

import java.sql.*;/** * @author 15643 * 比较execute和executeUpdate的区别 */public class ExcuteAndUpdate {public static void main(String[] args) {String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";String dbUrl = "jdbc:sqlserver://localhost:1433;DatabaseName=SC";String userName = "test";String userPwd = "test";Connection conn = null;PreparedStatement pStmt = null;try {Class.forName(driverName);conn = DriverManager.getConnection(dbUrl, userName, userPwd);String sql = "update course set coursecredit = 5 where courseno like ?";pStmt = conn.prepareStatement(sql);} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}try {pStmt.setString(1, "101_");// executeUpdate返回的是int,表示有多少条数据受到了影响int cnt = pStmt.executeUpdate();// execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等boolean isSelect = pStmt.execute();System.out.println("修改的条数:" + cnt);System.out.println("是否查询语句:" + isSelect);} catch (SQLException e) {e.printStackTrace();}try {if (pStmt != null)pStmt.close();if (conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}}}

运行截图:

二、事务1.事务简介概念
例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
特性
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

        原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
        一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
        隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
        持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

2.实例

        假设业务操作是:对某同学的一科成绩减去5分,另一科成绩加上5分,预期结果是该同学的总分不变。
但是在实际操作中把加分的语句不小心写错写成了 updata(而非update)----在没有使用事务的情况下,最后结果显而易见是总分增加了5分,而非期望的不变。那么,要如何操作才会避免这种事情发生呢?
        使用事务:
        通过 c.setAutoCommit(false);关闭自动提交
        使用 c.commit();进行手动提交
        红色的代码就处于同一个事务当中,它们要么都成功,要么都失败
        所以,虽然第一条SQL语句是可以执行的,但是第二条SQL语句有错误,其结果就是两条SQL语句都没有被提交。 除非两条SQL语句都是正确的。

/** * @author 15643 *事务的操作 */import java.sql.*;public class Transation {public static void main(String[] args) {String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";String dbUrl = "jdbc:sqlserver://localhost:1433;DatabaseName=SC";String userName = "test";String userPwd = "test";Connection conn = null;Statement stmt = null;ResultSet rs0 = null;try {Class.forName(driverName);conn = DriverManager.getConnection(dbUrl, userName, userPwd);String sql0 = "select finalscore from score where studentno = '10403201'";stmt = conn.createStatement();rs0 = stmt.executeQuery(sql0);//提取更新之前的数据while(rs0.next()) {System.out.println(rs0.getDouble(1));}conn.setAutoCommit(false);// 关闭自动提交String sql1 = "update score set finalscore = finalscore + 5 where studentno = '10403201'";String sql2 = "updata score set finalscore = finalscore - 5 where studentno = '10403201'";stmt.execute(sql1);stmt.execute(sql2);conn.commit();//手动提交事务} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}try {if (stmt != null)stmt.close();if (conn != null)conn.close();} catch (SQLException e) {e.printStackTrace();}}}


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。