21.5.2 事务处理的过程演练

【实例21.4】本节将通过一个实例,演示事务处理中的回滚功能。实例代码如下所示。


01 import java.sql.*;

02 ///通过连接数据库来获取数据

03 ///将setAutoCommit(false)设为false,即不自动提交。

04 ///rollback进行回滚

05 public class sqltest1

06 {

07 private Connection con;

08 public static void main(String[]args)

09 {

10 try

11 {

12 sqltest1 test=new sqltest1();

13 Connection con=test.getConnection();

14 con.setAutoCommit(false);

15 String sql="select*from teacherinfo";

16 String sql1="insert into teacherinfo values('朱雪莲','674322','女','24','1981-1-6','上海市','5000')";

17 System.out.println("插入数据后的数据是:");

18 test.getStudent1(sql1);

19 test.getStudent(con, sql);

20 con.rollback();

21 System.out.println("回滚数据后的数据是:");

22 test.getStudent(con, sql);

23 }

24 catch(Exception e){}

25 }

26 public void getStudent1(String sql)

27 {

28 try

29 {

30 Statement st=con.createStatement();

31 st.executeUpdate(sql);

32 st.close();

33 con.close();

34 }

35 catch(Exception e){}

36 }

37 ///通过结果集的getString方法来获得表中的数据字段

38 ///将所有获得来的字段输出

39 public void getStudent(Connection con, String sql)

40 {

41 try

42 {

43 Statement st=con.createStatement();

44 ResultSet rs=st.executeQuery(sql);

45 while(rs.next())

46 {

47 String name1=rs.getString(1);

48 String code1=rs.getString(2);

49 String sexy1=rs.getString(3);

50 String age1=rs.getString(4);

51 System.out.println("\n姓名:"+name1+"\t 学号:"+code1+"\t 性别:"+sexy1+"\t 年龄:"+age1);

52 }

53 st.close();

54 con.close();

55 }

56 catch(Exception e){e.printStackTrace();}

57 }

58 ///用来连接数据库的类

59 ///con是指定用来连接数据库的连接类

60 ///username是进入数据库的用户名

61 ///password是指进入数据库的密码

62 ///url1是连接数据库的URL

63 public Connection getConnection()

64 {

65 String url1="jdbc:odbc:schoolmanage";

66 String username="";

67 String password="";

68 try

69 {

70 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

71 con=DriverManager.getConnection(url1,username, password);

72 }

73 catch(SQLException e){e.printStackTrace();}

74 catch(ClassNotFoundException ex){ex.printStackTrace();}

75 return con;

76 }

77 }


【代码说明】第63~76行创建数据库的连接,这里通过第65行还是指定了前面创建的ODBC。第26~36行和第39~57行创建了两个getStudent()方法,使用的参数不同,处理的功能也不同。第20行使用了事务的回滚功能。

【运行效果】


插入数据后的数据是:

姓名:王鹏 学号:2001 性别:男 年龄:23

姓名:宋江 学号:2001 性别:男 年龄:23

姓名:李丽 学号:2001 性别:女 年龄:23

姓名:钱敏 学号:2001 性别:女 年龄:23

姓名:朱庭 学号:2001 性别:男 年龄:23

姓名:祖海 学号:2001 性别:女 年龄:23

姓名:周浩 学号:2001 性别:男 年龄:23

姓名:张平 学号:2001 性别:男 年龄:23

姓名:孙军 学号:2001 性别:男 年龄:23

姓名:王俊 学号:2001 性别:男 年龄:23

姓名:李鹏 学号:2001 性别:男 年龄:23

姓名:孙鹏 学号:2001 性别:男 年龄:23

姓名:王海 学号:2001 性别:男 年龄:23

姓名:周洁 学号:2001 性别:女 年龄:23

姓名:宋平 学号:2001 性别:女 年龄:23

姓名:吴浩 学号:2001 性别:男 年龄:23

姓名:武芬 学号:2001 性别:女 年龄:23

姓名:朱雪莲 学号:674322 性别:女 年龄:24

回滚数据后的数据是:

姓名:王鹏 学号:2001 性别:男 年龄:23

姓名:宋江 学号:2001 性别:男 年龄:23

姓名:李丽 学号:2001 性别:女 年龄:23

姓名:钱敏 学号:2001 性别:女 年龄:23

姓名:朱庭 学号:2001 性别:男 年龄:23

姓名:祖海 学号:2001 性别:女 年龄:23

姓名:周浩 学号:2001 性别:男 年龄:23

姓名:张平 学号:2001 性别:男 年龄:23

姓名:孙军 学号:2001 性别:男 年龄:23

姓名:王俊 学号:2001 性别:男 年龄:23

姓名:李鹏 学号:2001 性别:男 年龄:23

姓名:孙鹏 学号:2001 性别:男 年龄:23

姓名:王海 学号:2001 性别:男 年龄:23

姓名:周洁 学号:2001 性别:女 年龄:23

姓名:宋平 学号:2001 性别:女 年龄:23

姓名:吴浩 学号:2001 性别:男 年龄:23

姓名:武芬 学号:2001 性别:女 年龄:23


经过回滚后,原先插入的最后一条数据已经没有了。这是为了保证数据的完整性和一致性,而进行的数据库的回滚操作。