事务的ACID属性

image.png

image.png

image.png

image.png

image.png
        //隔离级别  
        @Test
        public void testTransactionSelect() throws Exception {
            Connection conn = JDBCUtils.getConnection();
//          //设置数据库的隔离级别
//          conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
            //获取当前连接的隔离级别
            System.out.println(conn.getTransactionIsolation());

            //取消自动提交数据
            conn.setAutoCommit(false);
            String sql = "select id,user,password,balance from user where user = ?";
            User user = getInstance(conn, User.class, sql, "admin");
            System.out.println(user);
        }
        @Test
        public void testTransactionUpdate() throws Exception {
            Connection conn = JDBCUtils.getConnection();
            //取消自动提交数据
            conn.setAutoCommit(false);
            String sql = "update user set balance = ? where user = ? ";
            int i = update(conn, sql, 4000,"admin");
            
            Thread.sleep(15000);
            System.out.println("修改结束");
        }
        
        
        
        //通用的查询操作,返回数据表中一条记录(version 2.0 考虑上事务)
        public <T> T getInstance(Connection conn,Class<T> clazz,String sql, Object... args) {
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                // 预编译sql语句
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < args.length; i++) {
                    ps.setObject(i + 1, args[i]);
                }
                // 执行
                rs = ps.executeQuery();
                // 获取结果集的原数据
                ResultSetMetaData rsmd = rs.getMetaData();
                // 通过ResultSetMetaData获取结果集中的列数
                int columnCount = rsmd.getColumnCount();

                if (rs.next()) {
                    T t = clazz.newInstance();
                    
                    // 处理结果集一行数据的每一列
                    for (int i = 0; i < columnCount; i++) {
                        // 获取列值
                        Object columnvalue = rs.getObject(i + 1);
                        // 获取每个列的列名
                        String columnLabel = rsmd.getColumnLabel(i + 1);

                        // 给t对象指定的某个属性赋值为value:通过反射
                        Field field = clazz.getDeclaredField(columnLabel);
                        field.setAccessible(true);
                        field.set(t, columnvalue);
                        
                    }
                    return t;
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                JDBCUtils.closeResource(null, ps, rs);
            }
            return null;
        }

    //通用的增删改操作---version 2.0版本(考虑事务)
        public static int update(Connection conn,String sql,Object ...args) {//sql中占位符的个数与可变形参的长度相同
            PreparedStatement ps=null;
            try {
                //1.预编译sql语句,返回PreparedStatement一个实例
                ps = conn.prepareStatement(sql);
                //2.填充占位符
                for(int i=0;i<args.length;i++) {
                    ps.setObject(i+1, args[i]);//小心参数声明错误
                }
                //3.执行sql
                return ps.executeUpdate();
            }catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                //4.资源的关闭
                JDBCUtils.closeResource(null, ps);
            }
            return 0;
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容