jdbc 可处理事物的通用增删查改函数

时间:2022-03-23 04:01:23

首先弄清四种隔离级别的和三种数据并发 之间的关系

通用查询函数

//使用PreparedStatement实现对不同表的通用的返回一个对象的查询操作
    //使用泛型机制,参数里先传入一个类的类型
    public static <T> T getInstance(Connection con,Class<T> clazz,String sql,Object...args) {
        PreparedStatement ps = null;
        ResultSet res = null;
        try {
            ps=con.prepareStatement(sql);
            for(int i=0;i<args.length;i  ) {
                ps.setObject(i 1, args[i]);
            }
                        
            //获得数据集和元数据集
            res = ps.executeQuery();
            ResultSetMetaData rsmd = res.getMetaData();
            int col = rsmd.getColumnCount();
            
            if(res.next()) {
                T t = clazz.newInstance();
                for(int i=0;i<col;i  ) {
                    Object value = res.getObject(i 1);          //要获得的数据值
                    String colLabel = rsmd.getColumnLabel(i 1);    //要获得的元数据名称
                    
                    //通过反射给t对象指定的colName属性赋值为value
                    Field field = clazz.getDeclaredField(colLabel);
                    
                    field.setAccessible(true);
                    field.set(t,value);
                }
                
                System.out.println("执行成功");
                return t;
            }
            
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
        finally {
            JDBCUtils.closeResource(null, ps, res);
        }
        
        return null;
    }
    
    //返回对不同表的通用的返回多个对象的查询操作 --考虑上事物的版本
    public static <T> ArrayList<T> getForList(Connection con,Class<T> clazz,String sql,Object...args){
        PreparedStatement ps = null;
        ResultSet res = null;
        try {
            con=JDBCUtils.getConnection();
            ps=con.prepareStatement(sql);
            for(int i=0;i<args.length;i  ) {
                ps.setObject(i 1, args[i]);
            }
            
            //获得数据集和元数据集
            res = ps.executeQuery();
            ResultSetMetaData rsmd = res.getMetaData();
            int col = rsmd.getColumnCount();
            
            ArrayList<T> list = new ArrayList<T>();
            while(res.next()) {
                T t = clazz.newInstance();
                for(int i=0;i<col;i  ) {
                    Object value = res.getObject(i 1);          //要获得的数据值
                    String colLabel = rsmd.getColumnLabel(i 1);    //要获得的元数据名称
                    
                    //通过反射给t对象指定的colName属性赋值为value
                    Field field = clazz.getDeclaredField(colLabel);
                    field.setAccessible(true);
                    field.set(t,value);
                }
                
                list.add(t);
            }
            System.out.println("执行成功");
            return list;
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
        finally {
            JDBCUtils.closeResource(null, ps, res);
        }

        return null;
    }

通用修改函数

//通用增删改,参数为预编译的sql,和可变形参args用来充当占位符 --可处理事物版本
    public static int update(Connection con,String sql,Object ...args) {
        PreparedStatement ps=null;
        try {
            //1.获取连接
            con=JDBCUtils.getConnection();
            //2.预编译sql,返回ps实例
            ps=con.prepareStatement(sql);
            //填充占位符,sql中的占位符个数=args数组长度
            for(int i=0;i<args.length;i  ) {
                ps.setObject(i 1, args[i]);
            }
            //4.执行, excute()方法如果执行查询操作,则此方法返回true,如果执行增删改,则返回false
            //ps.execute();
            return ps.executeUpdate();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        finally {
            //5.关闭资源
            JDBCUtils.closeResource(null, ps);
        }
        return 0;
    }