JDBC之比较execute、executeUpdate的区别

原文链接:https://blog.csdn.net/CNAHYZ/article/details/80572718

参考资料: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();
        }
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值