首先弄清四种隔离级别的和三种数据并发 之间的关系
通用查询函数
//使用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; }
关于聚合函数的查询
//用来处理聚合函数等只返回一个值的sql语句 public <E>E getValue(Connection con,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(); if(res.next()) return (E)res.getObject(1); } catch(Exception ex) { ex.printStackTrace(); } finally { JDBCUtils.closeResource(null, ps, res); } return null; }