DAO---反射
Posted 上后谈爱情
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAO---反射相关的知识,希望对你有一定的参考价值。
1.DAO--访问数据信息的类,对数据进行增删改查的操作,不包含任何的相关信息
其他如何使用DAO,定义DAOImplement类直接继承DAO父类 在DAO中进行如下的操作
1)void update(String sql,Object args);----Insert,Select,DELETE
1 public void update(String sql,Object... args) 2 { 3 Connection conn=null; 4 PreparedStatement ps=null; 5 try { 6 conn=JDBCUtils.getmysqlConn(); 7 ps=conn.prepareStatement(sql); 8 9 // args 填补占位符 10 for(int i=0;i<args.length;i++) 11 { 12 ps.setObject(i+1, args[i]); 13 } 14 ps.executeUpdate(); 15 } catch (Exception e) { 16 // TODO Auto-generated catch block 17 e.printStackTrace(); 18 }finally{ 19 JDBCUtils.closeMysql(ps, conn); 20 } 21 }
2)<T> T get(Class<T>clazz,String sql,Object args);----查询一条记录返回对应的对象
返回查询对象的实例: 当我们使用 ResultSet rs=ps.executeQuery(); 得到一个属于ResultSet集合从中得到ResultSetMeta,事实上我们不知道从SQL查询所能够得到一些什么样的东西只能通过反射动态的建立一个对象,将对象封装到JavaBean中,再从JavaBean取得查询的结果
1 Connection conn=null; 2 PreparedStatement ps=null; 3 ResultSet rs=null; 4 T object=null; 5 try { 6 conn=JDBCUtils.getMysqlConn(); 7 ps=conn.prepareStatement(sql); 8 9 // args 填补占位符 10 for(int i=0;i<args.length;i++) 11 { 12 ps.setObject(i+1, args[i]); 13 } 14 // rs 包含的查询填充占位符对应的值 15 rs=ps.executeQuery(); 16 while(rs.next()) 17 { 18 // 得到SQL数据库列的别名,与类的属性名进行反射重建对象 19 ResultSetMetaData rsmd=rs.getMetaData(); 20 21 // Map 将别名与值建立映射的关系 22 Map<String,Object> map=new HashMap<>(); 23 for(int i=0;i<rsmd.getColumnCount();i++) 24 { 25 String Label=rsmd.getColumnLabel(i+1); 26 Object value=rs.getObject(i+1); 27 map.put(Label, value); 28 } 29 30 if(map.size()>0) 31 { 32 //调用反射每一条记录生成新的的对象 33 object=clazz.newInstance(); 34 35 for(Map.Entry<String, Object>entiry:map.entrySet()) 36 { 37 String prop=entiry.getKey(); 38 Object value=entiry.getValue(); 39 40 // 直接进行反射 41 ReflectionUtils.setFieldValue(object, prop, value); 42 } 43 } 44 45 } 46 47 } catch (Exception e) { 48 // TODO Auto-generated catch block 49 e.printStackTrace(); 50 }finally{ 51 JDBCUtils.closeMysql(ps, conn); 52 } 53 return object; 54 }
对于此Test的案例:sql 中 flow_id flowId 只是为了将sql中别名另起一个别名 为了与类的属性名称对应。
3) <T> List<T> getForList(Class<T> clazz,String sql,Object args)----查询多条信息返回对象的集合
1 public <T> List<T> getForList(Class<T> clazz,String sql,Object ...args) 2 { 3 Connection conn=null; 4 PreparedStatement ps=null; 5 ResultSet rs=null; 6 List<T> list=new ArrayList<>(); 7 try { 8 conn=JDBCUtils.getMysqlConn(); 9 ps=conn.prepareStatement(sql); 10 11 // args 填补占位符 12 for(int i=0;i<args.length;i++) 13 { 14 ps.setObject(i+1, args[i]); 15 } 16 // rs 包含的查询填充占位符对应的值 17 rs=ps.executeQuery(); 18 List< Map<String,Object>> Listmap=new ArrayList(); 19 while(rs.next()) 20 { 21 // 得到SQL数据库列的别名,与类的属性名进行反射重建对象 22 ResultSetMetaData rsmd=rs.getMetaData(); 23 24 // Map 将别名与值建立映射的关系 25 Map<String,Object>map=new HashMap<>(); 26 for(int i=0;i<rsmd.getColumnCount();i++) 27 { 28 String Label=rsmd.getColumnLabel(i+1); 29 Object value=rs.getObject(i+1); 30 map.put(Label, value); 31 } 32 Listmap.add(map); 33 34 } 35 T bean=null; 36 if(Listmap.size()>0) 37 { 38 39 for(Map<String,Object> m:Listmap) 40 { 41 for(Map.Entry<String, Object>entiry:m.entrySet()) 42 { 43 String prop=entiry.getKey(); 44 Object value=entiry.getValue(); 45 46 bean=clazz.newInstance(); 47 // java.beanUtils 48 BeanUtils.setProperty(bean, prop, value); 49 } 50 list.add(bean); 51 } 52 } 53 54 55 56 } catch (Exception e) { 57 // TODO Auto-generated catch block 58 e.printStackTrace(); 59 }finally{ 60 JDBCUtils.closeMysql(ps, conn); 61 } 62 return list; 63 }
4)<E> E getForValue(Class<T>clazz,String sql,Object args);----查询某条记录的某个字段
以上是关于DAO---反射的主要内容,如果未能解决你的问题,请参考以下文章