JDBC(四)之事务以及比较execute、executeUpdate的区别

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

一、比较execute、executeUpdate的区别

1.相同点:

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

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();
		}
	}
}


你可能感兴趣的:(JDBC)