1.常见问题
1.1 使用spring遇到的问题
1.1.1 使用spring JDBCTemplate + spring-boot-web遇到的问题
- 使用jdbcTemplate的queryForObject方法的时候,如果查询的结果大于一就会报错,最好使用queryForList方法查询,查询出来的数据结构为
List<Map<String,String>>
的形式 - 在Controller层使用自定义Modle(如:user)接收前端传过来的参数的时候,如果使用jdbcTemplate的update方法更新数据(更行全部的属性,其中存在null属性)的话,参数为null会报错,不知道是不是c3po连接池的问题(该问题现在没有遇到好的解决方案)
- 当相同类的对象的值需要覆盖的情况下,如:
User user1 = new User();
user1.setName("tom")
user1.setPassword("000");
...
User user2 = new User();
user2.setName("tom11111")
user2.setPassword("00000000");
user2.setLove("fengjie");
....
现在想使用user2的值覆盖user1的值,由于java中没有JavaScript中的merge方法,所以需要自己实现,现在想到的是使用反射的方式来实现,不过觉得代码存在很大的问题,现在只是记录这个问题,将来技术牛比了再寻找更好的解决方案,实现的代码如下:
/**
*
*/
package com.tools;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
/**
* @author lcl
* @createDate 2016年11月3日上午11:42:11
* 用来合并同类对象的属性的工具类
*/
public class MergeObjectUtils {
public static Object merge(Object formerObject, Object updateObject) {
try {
Field[] o1Fields = formerObject.getClass().getDeclaredFields();
for (Field o1Field : o1Fields) {
if (!o1Field.getName().equals("serialVersionUID")) {//因为serialVersionUID没有get 和 set 方法,去除该属性
String fName = o1Field.getName();
Method m = formerObject.getClass().getMethod("get" + toUpperCaseFirstOne(fName));
Object value1 = m.invoke(formerObject);
Object value2 = m.invoke(updateObject);
if (value2 != null && value1 != value2) {
if (value2 instanceof String) {//属性为字符串的形式
m = formerObject.getClass().getMethod("set" + toUpperCaseFirstOne(fName), String.class);
m.invoke(formerObject, value2);
}
if (value2 instanceof Integer) {
m = formerObject.getClass().getMethod("set" + toUpperCaseFirstOne(fName), Integer.class);
m.invoke(formerObject, value2);
}
if (value2 instanceof Long) {
m = formerObject.getClass().getMethod("set" + toUpperCaseFirstOne(fName), Long.class);
m.invoke(formerObject, value2);
}
if (value2 instanceof List) {
m = formerObject.getClass().getMethod("set" + toUpperCaseFirstOne(fName), List.class);
m.invoke(formerObject, value2);
}
if (value2 instanceof Map) {
m = formerObject.getClass().getMethod("set" + toUpperCaseFirstOne(fName), Map.class);
m.invoke(formerObject, value2);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return formerObject;
}
private static String toUpperCaseFirstOne(String fName) {
return fName.replaceFirst(fName.charAt(0) + "", (fName.charAt(0) + "").toUpperCase());
}
}
一看这个代码就是存在很大的问题的