栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通过反射来设置实体类的属性

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过反射来设置实体类的属性

此工具类作用

通过反射来调用各个实体类的set方法,设置实体类的属性。
传入包名和数据库结果集,即可得到设置好属性的实体类对象。

方法源码
// 通过反射来设置各个实体类的属性
public class SetPojo {

    public static Object setPojo(String classname, ResultSet rs){
        Object o = null;
        try {
            Class c1 = Class.forName(classname);
            Method[] methods = c1.getMethods();
            o = c1.newInstance();

            for (Method method : methods) {
                // 如果是set方法
                if (method.getName().contains("set")) {
                    String s = method.getName().substring(3);
                    // 将方法的首字母转小写
                    String param = Character.toLowerCase(s.charAt(0)) + s.substring(1);
                    try {
                        // 如果resultSet中没有User里set方法所需的属性,getObject就会报SQLException!
                    	// 例如当我们的sql语句仅查询部分User属性时,就会产生该异常
                        // e.printStackTrace();
                        o1 = rs.getObject(param);
                        if(o1!=null){
                            method.invoke(o, o1);
                        }
                    } catch (SQLException e) {
                        // e.printStackTrace();
                    }
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
        return o;
    }
}
方法使用

User为实体类,包名为com.com.ming.pojo.User,rs为数据库返回的结果集

...    
ResultSet rs = prepareStatement.executeQuery();

    while(rs.next()){
        user = (User) SetPojo.setPojo("com.com.ming.pojo.User", rs);
        System.out.println(user);
    }
注意事项

注意:MySQL里的bigint用jdbc获取后的resultSet里是Long类型,如果如果把该属性在实体类的声明设为Integer,由于Long无法自动转换为Integer,会出现java.lang.IllegalArgumentException: argument type mismatch异常,

解决方法有两个

  1. 将MySQL表中的bigint类型的属性声明在实体类里更改为Integer(如果项目庞大,会牵一发而动全身)

  2. 在setPojo里调用method.invoke(o,o1)时,针对bigint类型的属性做类型转换

    if(o1!=null){
        if(o1.getClass().toString.contain("Long")){
        	method.invoke(o,Integer.parse(o1.toString));
        }else{
        	method.invoke(o, o1);
        }
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/888111.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号