首页 > 编程语言 >【Mybatis】【基础设施】【一】Mybatis源码解析-属性分词器PropertyTokenizer

【Mybatis】【基础设施】【一】Mybatis源码解析-属性分词器PropertyTokenizer

时间:2023-02-25 20:13:41浏览次数:53  
标签:name children 源码 Mybatis fullname PropertyTokenizer public String

1  前言

上一节我们在解析settings的时候,说到了分词器PropertyTokenizer,这种东西我理解为框架背后默默付出的辛勤工作者。Mybatis本身可以看作一个舞台,我们可能会看到舞台的表演者比如Mapper、比如SqlSessionFactory等,那么PropertyTokenizer这些东西就像是舞台后的工作者,他们不出面但是他们帮Mybatis管理着后台的每一小部分。那么我们本节就讲一下PropertyTokenizer。

2  源码分析

PropertyTokenizer类定义通读:

/**
 * @author Clinton Begin
 * 分词的符号就是 .
 */
public class PropertyTokenizer implements Iterator<PropertyTokenizer> {
  /**
   * 当前属性的第一块名字
   * 比如jdbc.name 那么name就是jdbc
   * 但是如果属性就是name没有儿子 那么name就是name
   *
   * 还有比如 fullname 是 arr[1]
   * 那么 name 就是 arr
   */
  private String name;
  /**
   * 假如 fullname 没有 [
   * 那么 indexedName 就等于 name
   * 但是有的话
   * 比如 fullname 是 arr[1]
   * indexedName 就等于 arr[1]
   * 而name 是等于 arr
   */
  private final String indexedName;
  /**
   * 这个就是 比如 fullname 是 arr[1] 的话 index = 1
   */
  private String index;
  /**
   * children 就是儿子  可能为空
   * 比如 jdbc.name 那么 children 就是 name
   * 没儿子的话 children 就是 null
   */
  private final String children;

  // 属性分词器
  public PropertyTokenizer(String fullname) {
    int delim = fullname.indexOf('.');
    // 根据 点 进行分割
    if (delim > -1) {
      /**
       * 比如jdbc.username
       * name = jdbc
       * children = username
        */
      name = fullname.substring(0, delim);
      children = fullname.substring(delim + 1);
    } else {
      name = fullname;
      children = null;
    }
    indexedName = name;
    /**
     * 这个是对包含[的属性名字 再次以 [ 进行解析
     * 解析 解析出index
     * 比如 arr[0]
     * index = 0
     * name = arr
     */
    delim = name.indexOf('[');
    if (delim > -1) {
      index = name.substring(delim + 1, name.length() - 1);
      name = name.substring(0, delim);
    }
  }

  public String getName() {
    return name;
  }

  public String getIndex() {
    return index;
  }

  public String getIndexedName() {
    return indexedName;
  }

  public String getChildren() {
    return children;
  }

  @Override
  public boolean hasNext() {
    // 当 children 不为空,就表示当前属性还有儿子
    return children != null;
  }

  @Override
  public PropertyTokenizer next() {
    // 类似进行递归解析
    return new PropertyTokenizer(children);
  }

  @Override
  public void remove() {
    throw new UnsupportedOperationException("Remove is not supported, as it has no meaning in the context of properties.");
  }
}

本身还是好理解的吧,就是对字符串的一个解析,大概的解析过程:

  1. 先根据 . 进行分割,解析出 name 和 children 的值;
  2. 这时将 name 的值赋值给 indexedName;
  3. 继续以 [ 进行分割,确定出 index 和 name 的值。

3  示例

4  小结

本节关于PropertyTokenizer的分析就到这里了,有理解不对的地方欢迎指正哈。

标签:name,children,源码,Mybatis,fullname,PropertyTokenizer,public,String
From: https://www.cnblogs.com/kukuxjx/p/17155177.html

相关文章

  • mybatis核心配置文件—mappers标签设置映射文件
    <!--加载映射文件--><mappers><!--<mapperresource="mappers/UserMapper.xml"></mapper>--><!--以包的方式引入映射文件,但是必......
  • mybatis核心配置文件—设置别名typeAliases
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dt......
  • SpringCloud 源码学习笔记2——Feign声明式http客户端源码分析
    系列文章目录和关于我一丶Feign是什么Feign是一种声明式、模板化的HTTP客户端。在SpringCloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一一样的......
  • MyBatis_06(自定义映射resultMap)
    主题:自定义映射resultMap"自定义映射resultMap",可以解决什么问题:1-"属性"和"字段名"不一致的情况2-"多对一"的情况3-"一对多"的情况一、若"字段名"和"......
  • mybatis的缓存
    publicvoidselectById(){SqlSessionsqlSession=build.openSession();SysuserMappermapper=sqlSession.getMapper(SysuserMapper.class);......
  • ThreadLocal基本使用和源码解读
    1基本使用ThreadLocal的作用是保存线程本地变量,在多线程在CPU时间分片交替执行过程中,每个线程只能获取到它自己的数据。ThreadLocal的使用非常简单:创建ThreadLocal。......
  • 9_MyBatis注解开发
    ​  publicinterfaceDeptMapper{DeptfindDeptByDeptno(intdeptno);@Select("select*fromdeptwheredeptno=#{deptno}")DeptfindByDeptno(i......
  • 9_MyBatis注解开发
    ​  publicinterfaceDeptMapper{DeptfindDeptByDeptno(intdeptno);@Select("select*fromdeptwheredeptno=#{deptno}")DeptfindByDeptno(i......
  • Java负载均衡简介及快速入门并实战(有源码)
    Java负载均衡是什么?将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上执行服务端:服务提供端,比如nginx负载均衡客户端:服务请求方,在发送请求之前已经选好了由哪个......
  • MyBatis 优秀的轻量级持久层框架从入门到应用实战
    课程简介和目标学习过JDBC的同学都会有所感受,原生JDBC技术实现对持久层数据操作有着诸多问题.1编码繁琐,步骤多2手动处理结果集和实体类映射关系比较麻烦,尤其是多表查询......