通过反射来调用各个实体类的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
异常,
解决方法有两个
-
将MySQL表中的
bigint
类型的属性声明在实体类里更改为Integer
(如果项目庞大,会牵一发而动全身) -
在
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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)