• mybatis会自动把字段名中的下划线转为驼峰命名法?


     

    先看一下转化的调用堆栈:
    代码如下:
    上面代码只是去掉了下划线,并没有首字母小写变大写的代码。再跟进findProperty方法可以找到获取驼峰结果的代码如下:
    可以看出通过reflector.findPropertyName方法把去掉下划线的变量转成了驼峰的变量。再跟过去看到这样的代码:

    那么caseInsensitivePropertyMap这个集合又是什么时候初始化的呢?原来是系统启动时,spring加载上下文的时候:
    而它的key其实是实体类的set与get方法后面的字符(org.apache.ibatis.reflection.Reflector.addGetMethods,org.apache.ibatis.reflection.property.PropertyNamer.methodToProperty),而这个方法一般都是标准的驼峰格式。所以当get(大写字段)名时,可以得到标准的驼峰字段名。
     PropertyTokenizer类

       这个类是property包中的重量级类,该类会被reflection包中其他的类频繁的引用到。这个类实现了Iterable和Iterator这两个接口,但在使用时经常被用到的是Iterator接口中的hasNext这个函数。我们着重了解这个类的属性和构造函数:

    复制代码
    //包含四个属性,比较简单
        private String name;
        private String index;
        private String indexedName;
        private String children;
    
        public PropertyTokenizer(String propertyName) {
            // 对参数进行第一次处理,通过“.”分隔符将propertyName分作两部分
            int delimiter = propertyName.indexOf(".");
            if (delimiter > -1) {
                name = propertyName.substring(0, delimiter);
                children = propertyName.substring(delimiter + 1);
            } else {
                name = propertyName;
                children = null;
            }
            indexedName = name;
            // 对name进行二次处理,去除“[...]”,并将方括号内的内容赋给index属性,如果name属性中包含“[]”的话
            delimiter = propertyName.indexOf("[");
            if (delimiter > -1) {
                // 先取index内容再截取name更为方便些,要不然还需要一个临时变量,需要三步才能实现
                // 这里包含了一个前提:传入的参数如果有有[,则必然存在],并且是属性的最后一个字符
                index = name.substring(delimiter + 1, name.length() - 1);
                name = name.substring(0, delimiter);
            }
        }
    复制代码

    经常使用的hasNext函数实现比较简单,就是判断children属性是不是为空:

    public boolean hasNext() {
            // TODO Auto-generated method stub
            return children != null;
        }


    Mybatis 之mapUnderscoreToCamelCase

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/jueyue/article/details/43617383

    之前用spring jdbc的时候发下spring可以驼峰转换,所以一直希望mybatis也有,之前还以为mybatis这个是个bug,后来发现原来也是有的,用起来也是很简单的,setting设置下就可以了,这里就不说了,下面说下是怎么实现的

     

     

    1.  
      public String findProperty(String name) {
    2.  
      StringBuilder prop = buildProperty(name,new StringBuilder());
    3.  
      return prop.length() > 0 ?prop.toString() : null;
    4.  
      }
    5.  
       
    6.  
      public String findProperty(String name,boolean useCamelCaseMapping) {
    7.  
      if (useCamelCaseMapping) {
    8.  
      name = name.replace("_","");
    9.  
      }
    10.  
      return findProperty(name);
    11.  
      }


     

    如果我们设置了,useCamelCaseMapping=ture,那么mybatis就把_给干掉了,看到这里我也很疑惑,还以为是坑爹呢,

    我们接着往下看,buildProperty

     

    1.  
      private StringBuilderbuildProperty(String name, StringBuilder builder) {
    2.  
      PropertyTokenizer prop = newPropertyTokenizer(name);
    3.  
      if (prop.hasNext()) {
    4.  
      String propertyName =reflector.findPropertyName(prop.getName());
    5.  
      if (propertyName != null) {
    6.  
      builder.append(propertyName);
    7.  
      builder.append(".");
    8.  
      MetaClass metaProp =metaClassForProperty(propertyName);
    9.  
      metaProp.buildProperty(prop.getChildren(), builder);
    10.  
      }
    11.  
      } else {
    12.  
      String propertyName =reflector.findPropertyName(name);
    13.  
      if (propertyName != null) {
    14.  
      builder.append(propertyName);
    15.  
      }
    16.  
      }
    17.  
      return builder;
    18.  
      }


    其实是从reflector获取的数据,做个reflector是干嘛的呢,其实就是mybatis来存储class信息的,也可以说是mybatis的反射工具类

     

    Reflector里面

    public StringfindPropertyName(String name) {

        returncaseInsensitivePropertyMap.get(name.toUpperCase(Locale.ENGLISH));

      }

    做个toUpperCase是个关键,他忽略了我们类里面的属性值,也就是说我们一个id和一个ID属性,对于mybatis来说可能是一直的呦

     

    private Map<String, String>caseInsensitivePropertyMap = new HashMap<String, String>();

    存储的就是field upperCaseName和真实的Name 也就是我们的驼峰转换,或者其实不对称的驼峰也是可以的,只要把_去掉,应该就可以拿到的

    再把整个流程整理一下:

    所以其实不是转换下划线,而是去掉下划线,再取驼峰的变量。不过最后的效果与转换的一样。

    Mybatis 之mapUnderscoreToCamelCase

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/jueyue/article/details/43617383

    之前用spring jdbc的时候发下spring可以驼峰转换,所以一直希望mybatis也有,之前还以为mybatis这个是个bug,后来发现原来也是有的,用起来也是很简单的,setting设置下就可以了,这里就不说了,下面说下是怎么实现的

     

     

    1.  
      public String findProperty(String name) {
    2.  
      StringBuilder prop = buildProperty(name,new StringBuilder());
    3.  
      return prop.length() > 0 ?prop.toString() : null;
    4.  
      }
    5.  
       
    6.  
      public String findProperty(String name,boolean useCamelCaseMapping) {
    7.  
      if (useCamelCaseMapping) {
    8.  
      name = name.replace("_","");
    9.  
      }
    10.  
      return findProperty(name);
    11.  
      }


     

    如果我们设置了,useCamelCaseMapping=ture,那么mybatis就把_给干掉了,看到这里我也很疑惑,还以为是坑爹呢,

    我们接着往下看,buildProperty

     

    1.  
      private StringBuilderbuildProperty(String name, StringBuilder builder) {
    2.  
      PropertyTokenizer prop = newPropertyTokenizer(name);
    3.  
      if (prop.hasNext()) {
    4.  
      String propertyName =reflector.findPropertyName(prop.getName());
    5.  
      if (propertyName != null) {
    6.  
      builder.append(propertyName);
    7.  
      builder.append(".");
    8.  
      MetaClass metaProp =metaClassForProperty(propertyName);
    9.  
      metaProp.buildProperty(prop.getChildren(), builder);
    10.  
      }
    11.  
      } else {
    12.  
      String propertyName =reflector.findPropertyName(name);
    13.  
      if (propertyName != null) {
    14.  
      builder.append(propertyName);
    15.  
      }
    16.  
      }
    17.  
      return builder;
    18.  
      }


    其实是从reflector获取的数据,做个reflector是干嘛的呢,其实就是mybatis来存储class信息的,也可以说是mybatis的反射工具类

     

    Reflector里面

    public StringfindPropertyName(String name) {

        returncaseInsensitivePropertyMap.get(name.toUpperCase(Locale.ENGLISH));

      }

    做个toUpperCase是个关键,他忽略了我们类里面的属性值,也就是说我们一个id和一个ID属性,对于mybatis来说可能是一直的呦

     

    private Map<String, String>caseInsensitivePropertyMap = new HashMap<String, String>();

    存储的就是field upperCaseName和真实的Name 也就是我们的驼峰转换,或者其实不对称的驼峰也是可以的,只要把_去掉,应该就可以拿到的

  • 相关阅读:
    为什么我要学习qt quick
    geometory Intersect
    删除kubernetes节点的正确姿势
    乞丐版docker私有仓库搭建
    kubernetes集群中由于某些原因导致etcd节点没有删干净,需要手动清理etcd节点
    k8s coredns设置上游name server
    虚拟机架设koolshare软路由
    文件类型特征码
    深入字节码 -- 计算方法执行时间
    启迪思维:二叉树
  • 原文地址:https://www.cnblogs.com/isme-zjh/p/11421407.html
Copyright © 2020-2023  润新知