我是靠谱客的博主 高高啤酒,这篇文章主要介绍jdbc 学习总结四之事物控制,现在分享给大家,希望可以做个参考。

事物是用户定义的一个操作序列,这些操作要不不做,要不全做。jdbc默认设置为自动提交事物,即每个语句执行完毕之后自动提交。每个语句都隐含一个commit。

我们知道 JDBC中 connection提供了auto-commit这个属性来控制事物,但是必须建立在使用一个connection的情况下,这样我们的逻辑层代码和数据层代码只能写在一起,代码会有很多冗余,为了解决这个问题,我们可以在工具类中使用ThreadLocal 来控制保持同一个connection ,ThreadLocal是Thread的一个局部变量,将connection创建变量副本,大致原理 是将connection作为value将当前线程作为key,存放在HashMap中。

复制代码
1
<pre name="code" class="java">private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();

复制代码
1
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static Connection getConnection(){ String url = prop.getProperty("url"); String username = prop.getProperty("username"); String password = prop.getProperty("password"); Connection connection = threadLocal.get(); if(connection == null){ try { connection = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } threadLocal.set(connection); } return connection; }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/** * 模拟 业务逻辑层 * <p>方法名称:</p> * <p>方法说明:</p> * @throws SQLException * @autho zx */ @Test public void test1() throws SQLException{ Connection cn = JDBCUtils.getConnection(); System.out.println("test1 -- connection :"+cn); cn.setAutoCommit(false); try { test2(); if(1==1){ /*throw new RuntimeException();*/ } test3(); cn.commit(); } catch (Exception e) { cn.rollback(); e.printStackTrace(); } cn.close(); } /** * 模拟 数据层 * <p>方法名称:</p> * <p>方法说明:</p> * @throws SQLException * @autho zx */ public void test2() throws SQLException{ String sql = "insert into t_user values(?,?,?,?)"; Connection cn = JDBCUtils.getConnection(); System.out.println("test2 -- connection :"+cn); PreparedStatement ps = cn.prepareStatement(sql); ps.setInt(1, 1); ps.setString(2, "zs"); ps.setString(3, "123456"); ps.setInt(4, 20); ps.executeUpdate(); ps.close(); } /** * 模拟数据层 * <p>方法名称:</p> * <p>方法说明:</p> * @throws SQLException * @autho zx */ public void test3() throws SQLException{ String sql = "insert into t_user values(?,?,?,?)"; Connection cn = JDBCUtils.getConnection(); System.out.println("test3 -- connection :"+cn); PreparedStatement ps = cn.prepareStatement(sql); ps.setInt(1, 2); ps.setString(2, "lisi"); ps.setString(3, "123456"); ps.setInt(4, 22); ps.executeUpdate(); ps.close(); }
复制代码
1
2
3
test1 -- connectioncom.mysql.jdbc.JDBC4Connection@55c9be00 test2 -- connection :com.mysql.jdbc.JDBC4Connection@55c9be00 test3 -- connection :com.mysql.jdbc.JDBC4Connection@55c9be00

最后

以上就是高高啤酒最近收集整理的关于jdbc 学习总结四之事物控制的全部内容,更多相关jdbc内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部