`
aa8945163
  • 浏览: 270777 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

泛型BaseDAO

阅读更多
对于属性比较多的bean,如果不使用hibernate 或者ibatis等持久化解决方案,写查询函数时,单单将ResultSet 转换成Object就是一件很痛苦的事情,因此可以采用java反射机制做一个BaseDao,把ResultSet 映射到Object 的操作封装起来,简化了DAO的开发,
本文参照了[url]http://blog.csdn.net/cping1982/archive/2007/10/01/1808647.aspx
[/url]并且做了一点改进


public static String[][] proterty2Column =
    {{"member_id","memberId"},
{"name", "name"}};
/**
* change the first char to upper case
* @param s
* @return
*/
private static String upperFirstChar(String s){
char [] chars = s.toCharArray();
chars[0] = Character.toUpperCase(chars[0]);
return new String(chars);
}
/**
* ResultSet 映射成 Object
* @param clzz
* @param rs
* @param obj
* @param fieldName
* @param varibleName
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws SQLException
* @throws NoSuchFieldException
* @throws SecurityException
*/
    private void  mapResultSet2Object(ResultSet rs, Object obj, String propertyName,
String columName)
throws NoSuchMethodException, IllegalAccessException,
InvocationTargetException, SQLException,
SecurityException, NoSuchFieldException {
    Class < ? extends Object >clazz = obj.getClass();
         Class < ? extends Object >propertyType = clazz.getDeclaredField(propertyName).
getType();
       Method method = clazz.getDeclaredMethod("set"+
     upperFirstChar( propertyName ), new Class[] { propertyType });
       if (propertyType == String.class)
           method.invoke(obj, (Object [])new String[]
{rs.getString( columName ) });
       else if (propertyType == int.class)
           method.invoke(obj, (Object [])new Integer[]
{new Integer( rs.getInt( columName )) });
       else if (propertyType == float.class)
           method.invoke(obj, (Object [])new Float[]
{new Float( rs.getFloat( columName )) });
       else if (propertyType == long.class)
           method.invoke(obj, (Object [])new Long[]
{new Long( rs.getLong( columName )) });
       else if (propertyType == double.class)
           method.invoke(obj, (Object [])new Double[]
{new Double( rs.getDouble( columName )) });
       else if(propertyType == Date.class){
       method.invoke(obj, (Object [])new Date[]
{rs.getDate(columName)});
       }
   }
    /**
     * 单行查询
     * @param
     * @param conn
     * @param sql
     * @param clazz
     * @param params
     * @return
     * @throws Exception
     */
    public  <T> T getItem(Connection conn, String sql, Class<T> clazz,
  String params[])throws Exception{
    PreparedStatement pstmt = null;
    ResultSet rset = null;
    T t  = null;
    try {
    pstmt = conn.prepareStatement(sql);
    //set parameter
               for(int i=0; i<params.length; i++){
    pstmt.setString(i+1, (String)params[i]);
    }
              rset = pstmt.executeQuery();
            if (rset.next()) {
                t =  clazz.newInstance();
    for(int i=0; i< proterty2Column.length; i++) {
                String propertyName = proterty2Column[i][1].trim();
                    String ColumnName = proterty2Column[i][0].trim();
                    mapResultSet2Object(rset, t, propertyName, ColumnName);
                }
            }
        } catch (Exception e) {
        e.printStackTrace();
    } finally {
        DBUtil.closeAll(conn, pstmt, rset);
    }
     return t;
    }

   /**
     * 多行查询
     * @param
     * @param conn
     * @param sql
     * @param proterty2Column
     * @param clazz
     * @return
     * @throws Exception
     */
    public   <T> List <T> getItems(Connection conn, String sql, Class<T> clazz, 
String[] params) throws Exception{
    if (proterty2Column.length == 0)
            return null;
    PreparedStatement pstmt = null;
    ResultSet rset = null;
    List<T> list = new ArrayList<T>();
    try {
    pstmt = conn.prepareStatement(sql);
               for(int i=0; i<params.length; i++){
    pstmt.setString(i+1, (String)params[i]);
    }
    rset = pstmt.executeQuery();
            while (rset.next()) {
    for(int i=0; i< proterty2Column.length; i++) {
                String propertyName = proterty2Column[i][1].trim();
                    String ColumnName = proterty2Column[i][0].trim();
                    fetchResult2Object(rset, obj, propertyName, ColumnName);
                }
                if( null == obj ) continue;
                list.add(obj);
            }
        } catch (Exception e) {
        e.printStackTrace();
    } finally {
        DBUtil.closeAll(conn, pstmt, rset);
    }
     return list;
    }

分享到:
评论

相关推荐

    java泛型BaseDao与BaseService

    java泛型BaseDao与BaseService

    hibernate basedao(泛型版本)

    利用泛型编写的hibernate basedao,涵盖几乎所有数据库操作方法,需导入spring相关jar包

    SpringBoot_BaseDao.zip

    尊重原创——SpringBoot_BaseDao.zip,内部含有反射,获取泛型类类型,如何使用等,自己下载查看

    basedao的封装

    //获得当前类型的带有泛型类型的父类 ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass(); //获得运行期的泛型类型 clazz = (Class) ptClass.getActualTypeArguments()[0]...

    basic-common2h3:基于hibernate3的BaseDao,完成增删改查、分页操作

    #basic-common2h3 实现一个基于hibernate3的基本的dao,实现CRUD;...3、定义UserDao并实现IUserDao接口,且要实现BaseDao类还需要传入泛型。 BaseDao完成了具体的CRUD的方法。 示例: @Repository(valu

    baseDao及baseDaoImpl将hibernate里面的方法进行合理的封装,使用到java的反射技术

    对hibernate里面的方法进行合理的封装,使用到java的泛型及java的反射技术;有利于减少代码,加快开发速度!

    基于Java web SSH框架的电影后台管理系统(源码+数据库).zip

    # 电影后台管理系统 ...- [x] baseDao定义泛型抽象出基本dao操作 ## 导入项目 ### 导入SQL文件 进入到db文件夹,将ssh.sql文件导入到数据库中 ### 修改数据库密码 修改hibernate.cfg.xml文件 ```xml ...

    Java反射技术的一般应用

    该示例没有使用泛型技术,所以不是很完美。不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单--&gt;...

    Java反射技术的一般应用(放低分数供大家学习)

    该示例没有使用泛型技术,所以不是很完美。不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单--&gt;...

    SSH项目1

    否则只能查看 11) Dao 操作优化 BaseDao.java 所有dao的通用方法,dao都必须继承此类 (反射泛型)实现步骤代码:1) 设计数据库:

    spring mvc4 security3 hibernate4 kapctha实现的登录系统,比较粗糙。

    用spring4 mvc、spring security3、hibernate4、kapctha实现的用户登录系统。baseDao被放在了另外的项目中。因为对泛型不熟悉,多数方法放在Dao里面。简单说,很粗糙啦。

    spring4.1.6-mybatis3.2.8

    整合了spring 4.1.6+mybatis3.2.8的组合算是最新的稳定版本了,而且附带了一个basedao操作接口,泛型的通用写法,下载即可运行,我用的是idea项目最好用idea来开发。不会的有问题随时拍砖:308444582,我的扣扣,准您...

    整合spring3-hibernate的小项目(二)

    博客文章 【SSH学习笔记】整合spring3-hibernate的小项目(二) ...2、使用BaseDao获取注入SessionFactory并返回Session 3、用generic接口及其实现类,实现泛型化的查询所有和按字符串查询的方法 4、使用JUNIT测试

Global site tag (gtag.js) - Google Analytics