mybatis插件开发之 下画线键值转小写驼峰形式插件

在使用mybatis时,为了方便拓展而使用Map类型的返回值。使用Map作为返回值时,Map中的键值就是查询结果中的列名,而列名一般都是大小写字母或者下画线,和java中使用的驼峰形式不一致。而且由于不同数据库查询结果列名的大小写也并不一致,因此为了保证在使用Map时的属性一致。可以对Map类型的结果进行特殊处理,即将不同格式的列名转换为Java中的驼峰形式。

配置:在mybaits-config.xml中配置

<plugins>

    <plugin interceptor=".....CameHumpInterceptor"/>
</plugins>
代码:

import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.*;

/**
 * Mybatis Map类型下划线key转小写驼峰形式
 */
@Intercepts(
        @Signature(
                type = ResultSetHandler.class,
                method = "handleResultSets",
                args = {Statement.class}
        )
)
@SuppressWarnings({"unchecked","rawtypes"})
public class CameHumpInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {

        List<Object> list = (List<Object>) invocation.proceed();

        for(Object object:list){
            if(object instanceof Map){
                processMap((Map<String, Object>) object);
            }else{
                break;
            }
        }
        return list;
    }

    /**
     * 处理Map类型
     * @param map
     */
    private void processMap(Map<String,Object> map){
        Set<String> keySet = new HashSet<String>(map.keySet());
        for(String key: keySet){

            if((key.charAt(0)>='A'
                    && key.charAt(0)<='Z')
                   ||key.indexOf("_")>=0){
                Object value = map.get(key);
                map.remove(key);
                map.put(underlineToCamelhump(key),value);
            }
        }
    }

    /**
     * 将下划线风格替换为驼峰风格
     * @param inputString
     * @return
     */
    private String underlineToCamelhump(String inputString) {
        StringBuilder sb = new StringBuilder();
        boolean nextUpperCase = false;
        for(int i = 0 ; i<inputString.length();i++){
            char c = inputString.charAt(i);
            if(c=='_'){
                if(sb.length()>0){
                    nextUpperCase = true;
                }
            }else{
                if(nextUpperCase){
                    sb.append(Character.toUpperCase(c));
                    nextUpperCase = false;
                }else{
                    sb.append(Character.toLowerCase(c));
                }
            }
        }
        return sb.toString();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target,this);
    }

    @Override
    public void setProperties(Properties properties) {

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值