开发中常见问题与特殊问题记录

1.常见问题

1.1 使用spring遇到的问题

1.1.1 使用spring JDBCTemplate + spring-boot-web遇到的问题

  1. 使用jdbcTemplate的queryForObject方法的时候,如果查询的结果大于一就会报错,最好使用queryForList方法查询,查询出来的数据结构为List<Map<String,String>>的形式
  2. 在Controller层使用自定义Modle(如:user)接收前端传过来的参数的时候,如果使用jdbcTemplate的update方法更新数据(更行全部的属性,其中存在null属性)的话,参数为null会报错,不知道是不是c3po连接池的问题(该问题现在没有遇到好的解决方案)
  3. 当相同类的对象的值需要覆盖的情况下,如:
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());
    }
}
一看这个代码就是存在很大的问题的

2.特殊问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值