/**异常:程序在运行过程中的特殊情况
* 1)受检异常:(要求程序必须捕获或者声明抛出异常。)
* 放在方法和参数的后面,用throws声明,
* 2)运行时异常:(默认情况下会得到自动处理,所以不用通常捕获。)
* 算术异常、类型转换异常、数组下标越界、空指针异常、输入不匹配异常
* 当语句可能存在异常时,try{异常语句} catch(){隔离异常}
* 多重catch:需要考虑异常的子父类关系 子类在上 父类在下
* 执行顺序:try语句块->相应的catch语句块-->finally语句块-->执行到最后
*/
1 public class UnusualTest {
2 private static ThreadLocal<Connection> tl = new ThreadLocal<>();
3 private static DataSource dataSource;
4 //连接数据库
5 public static Connection getConnection(){
6 Connection conn = null;
7 //当语句可能存在异常时,try{异常语句} catch(){隔离异常}
8 try {
9 conn = tl.get();
10 if(conn==null){
11 conn = dataSource.getConnection();
12 tl.set(conn);
13 }
14 } catch (SQLException e) {
15 e.printStackTrace();
16 }
17 return conn;
18 }
19 //断开数据库
20 public static void closeAll(AutoCloseable... cs){
21 for(AutoCloseable c : cs){
22 if(c!=null){
23 try {
24 c.close();
25 } catch (Exception e) {
26 e.printStackTrace();
27 }
28 }
29 }
30 }
31 //开启事务
32 public static void begin(){
33 Connection conn = getConnection();
34 try {
35 conn.setAutoCommit(false);
36 } catch (SQLException e) {
37 e.printStackTrace();
38 }
39 }
40 //提交事务
41 public static void commit(){
42 Connection conn = getConnection();
43 try {
44 conn.commit();
45 } catch (SQLException e) {
46 e.printStackTrace();
47 }
48 closeAll(conn);
49 tl.remove();
50 }
51 //事务回滚
52 public static void rollback(){
53 Connection conn = getConnection();
54 try {
55 conn.rollback();
56 } catch (SQLException e) {
57 e.printStackTrace();
58 }
59 closeAll(conn);
60 tl.remove();
61 }
62 }