原文链接: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();
}
}
}