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---反射的主要内容,如果未能解决你的问题,请参考以下文章

反射实现增删改查(DAO层)——修改数据

反射实现增删改查(DAO层)——插入数据

反射实现增删改查(DAO层)——删除数据

反射实现增删改查(DAO层)——查询数据

DAO---反射

利用反射搭建项目的dao层,从此可以告别被人的dao层框架了(spring+反射)