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

通过反射来设置实体类的属性,第1张

此工具类作用

通过反射来调用各个实体类的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);
        }
    }
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存