• 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);----查询某条记录的某个字段

       

  • 相关阅读:
    Linux命令学习Day1
    谈谈VAssitX Snippet
    Visual Studio sort函数出现“invalid operator<”原因分析
    网络打印机共享设置
    Notepad++使用总结
    Leetcode顺时钟旋转90度
    搭建Docker版gitlab私有云
    获取安卓APP设备上报信息
    中间件服务测试点整理
    Jenkins主从模式添加节点机
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/6718203.html
Copyright © 2020-2023  润新知