我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          Spring jdbc 對(duì)象Mapper的簡(jiǎn)單封裝

          一般查詢實(shí)體的時(shí)候,都需要這么使用:
          /**
               * 根據(jù)id查詢
               * 
               * 
          @return
               
          */

              
          public Emp queryEmpById(Integer id)
              
          {
                  String sql 
          = "select * from emp where empno = ?";
                  ParameterizedRowMapper
          <Emp> mapper = new ParameterizedRowMapper<Emp>()
                  
          {

                      
          public Emp mapRow(ResultSet rs, int rowNum) throws SQLException
                      
          {
                          Emp emp 
          = new Emp();
                          System.out.println(
          "row:" + rowNum);
                          emp.setEmpno(rs.getInt(
          "empno"));
                          emp.setEname(rs.getString(
          "ename"));
                          
          return emp;
                      }

                  }
          ;

                  
          return this.getSimpleJdbcTemplate().queryForObject(sql, mapper, id);
              }

          能不能像Hibernate那樣自動(dòng)set這些值呢,用反射可以實(shí)現(xiàn).

          package orm;

          import java.lang.reflect.Field;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import org.springframework.jdbc.core.simple.ParameterizedRowMapper;

          /**
           * 通用的Object包裝類(類型問題,依然是個(gè)瓶頸,如果有好的解決方案請(qǐng)pm我)
           * 
           * 功能:查詢對(duì)象類型或?qū)ο蠹蠒r(shí)的通用包裝類
           * 
           * 
          @author zdw
           * 
           
          */

          @SuppressWarnings(
          "unchecked")
          public class ObjectMapper implements ParameterizedRowMapper
          {
              
          private Class clazz;

              
          public ObjectMapper(Class clazz)
              
          {
                  
          this.clazz = clazz;
              }


              
          /**
               * 重寫mapRow方法
               
          */

              @Override
              
          public Object mapRow(ResultSet rs, int rowNum) throws SQLException
              
          {
                  
          try
                  
          {
                      Object obj 
          = clazz.newInstance();
                      Field fields[] 
          = obj.getClass().getDeclaredFields();
                      
          for (int i = 0; i < fields.length; i++)
                      
          {
                          Field field 
          = fields[i];
                          
          // 暴力訪問
                          field.setAccessible(true);
                          
          this.typeMapper(field, obj, rs);
                          
          // 恢復(fù)默認(rèn)
                          field.setAccessible(false);
                      }

                      
          return obj;
                  }

                  
          catch (Exception e)
                  
          {
                      e.printStackTrace();
                  }

                  
          return null;
              }


              
          /**
               * 數(shù)據(jù)類型包裝器
               * 
               * 
          @param field
               *            目標(biāo)屬性
               * 
          @param obj
               *            目標(biāo)對(duì)象
               * 
          @param rs
               *            結(jié)果集
               * 
          @throws Exception
               
          */

              
          private void typeMapper(Field field, Object obj, ResultSet rs)
                      
          throws Exception
              
          {
                  String type 
          = field.getType().getName();
                  
          if (type.equals("java.lang.String"))
                  
          {
                      field.set(obj, rs.getString(field.getName()));
                  }

                  
          else if (type.equals("int"|| type.equals("java.lang.Integer"))
                  
          {
                      field.set(obj, rs.getInt(field.getName()));
                  }

                  
          else if (type.equals("long"|| type.equals("java.lang.Long"))
                  
          {
                      field.set(obj, rs.getLong(field.getName()));
                  }

                  
          else if (type.equals("boolean"|| type.equals("java.lang.Boolean"))
                  
          {
                      field.set(obj, rs.getBoolean(field.getName()));
                  }

                  
          else if (type.equals("java.util.Date"))
                  
          {
                      field.set(obj, rs.getDate(field.getName()));
                  }

              }

          }



          dao:
          /**
               * 查詢操作 (自動(dòng)setEmp類型所有值)
               * 
               * 
          @return
               
          */

              
          public List queryList()
              
          {
                  
          return this.getJdbcTemplate().query("select * from emp",
                          
          new ObjectMapper(Emp.class));
              }

          單個(gè)查詢:
          public Emp queryEmpById2(Integer id)
              
          {
                  String sql 
          = "select * from emp where empno = ?";
                  ObjectMapper om 
          = new ObjectMapper(Emp.class);
                  
          return (Emp) this.getSimpleJdbcTemplate().queryForObject(sql, om, id);
              }
          測(cè)試通過:
          7369
          7499
          7521
          7566
          7654
          7698
          7782
          7788
          7839
          7844

          上面是我的一個(gè)簡(jiǎn)單封裝,在Spring2.5中及以后版本,已經(jīng)提供了便捷方法:
          /**
               * 查詢操作 (自動(dòng)setEmp類型所有值)
               * 
               * 
          @return
               
          */

              
          public List queryList()
              
          {
                  
          return this.getSimpleJdbcTemplate().query(   
                          
          "SELECT * from emp",   
                          ParameterizedBeanPropertyRowMapper.newInstance(Emp.
          class));  
              }

              
              
          /**
               * 根據(jù)id查詢
               * 
               * 
          @return
               
          */

              
          public Emp queryById(Integer id)
              
          {
                  
          return this.getSimpleJdbcTemplate().queryForObject(   
                          
          "SELECT * from emp where id = ?",   
                          ParameterizedBeanPropertyRowMapper.newInstance(Emp.
          class),7369);  
              }

          這樣就簡(jiǎn)單多了,也是用反射實(shí)現(xiàn)的.


          posted on 2009-03-30 16:28 々上善若水々 閱讀(4351) 評(píng)論(1)  編輯  收藏

          評(píng)論

          # re: Spring jdbc 對(duì)象Mapper的簡(jiǎn)單封裝  回復(fù)  更多評(píng)論   

          樓上說(shuō)話請(qǐng)自重。我這是自己寫的。
          2009-04-13 08:34 | 々上善若水々

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 汤阴县| 鹤庆县| 延边| 永胜县| 元氏县| 洪洞县| 金川县| 景宁| 宿州市| 开封县| 定结县| 互助| 九江市| 醴陵市| 博白县| 泸州市| 叶城县| 马公市| 太原市| 行唐县| 易门县| 屯昌县| 安康市| 南木林县| 威信县| 会理县| 泸溪县| 公主岭市| 巴彦县| 杭锦旗| 瓮安县| 丰城市| 类乌齐县| 伊吾县| 宣城市| 彭山县| 化德县| 江西省| 福贡县| 繁峙县| 高淳县|