Configuration--properties(三-1)

上一篇文章我们看到了parseConfiguration方法,这个方法逐个解析configuration下面的子标签.本篇文章我们我们来看properties标签的作用.

首先我们来看一下properties标签的作用,properties主要的作用就是动态的配置一些key-value的属性值,可以直接在properties的子标签property中配置,也可以从.properties文件中获取.

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="root"/>
  <property name="password" value="password"/>
</properties>

现在就让我们来看看propertiesElement(root.evalNode(“properties”));方法里到底做了什么:

  private void propertiesElement(XNode context) throws Exception {
    if (context != null) {
      // 将properties标签下所有property标签定义的值转换成一个Properties(该类继承Hashtable)对象
      Properties defaults = context.getChildrenAsProperties();

      String resource = context.getStringAttribute("resource");
      String url = context.getStringAttribute("url");
      // properties标签的resource和url属性只能定义一个
      if (resource != null && url != null) {
        throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");

      // 将.properties文件中定义的各中值,加入到defaults.从这里我们可以看出,.properties文件中若定义了和property标签中key值一样的参数,最终会以.properties文件中的值为准,因为这里会覆盖之前的值
      if (resource != null) {
        defaults.putAll(Resources.getResourceAsProperties(resource));
      } else if (url != null) {
        defaults.putAll(Resources.getUrlAsProperties(url));
      }

      // 这里的值,是Configuration类中本身的参数,大家可以去上一章XMLConfigBuilder的构造方法,其中调用了this.configuration.setVariables(props),而这个里面的props参数其实是SqlSessionFactoryBuilder的build方法中传来的.
      // 从这里我们得知,我们在代码中构造SqlSessionFactory时调用SqlSessionFactoryBuilder.build方法时,也可以传入一个Properties,并且在这里传入的参数,优先级最高,可以覆盖property标签和.properties文件中key相同的参数.
      // 不过如果在代码中传入Properties就失去了配置文件的灵活性,不过也可以用这种方法来限制一些不可以被修改的参数值.
      Properties vars = configuration.getVariables();
      if (vars != null) {
        defaults.putAll(vars);
      }

      // parser是XMLConfigBuilder中真正去解析xml文件的类XPathParser,这里将这些参数设置进去,我猜测应该是之后解析其他标签时会用上,因为在environments标签下的dataSource中,我们还会使用${}这种形式来定义一个值的value
      parser.setVariables(defaults);

      // 将最终的key-value参数值设置进Configuration的variables属性中
      configuration.setVariables(defaults);
    }
  }

XNode类:

  public Properties getChildrenAsProperties() {
    Properties properties = new Properties();
    for (XNode child : getChildren()) {
      String name = child.getStringAttribute("name");
      String value = child.getStringAttribute("value");
      if (name != null && value != null) {
        properties.setProperty(name, value);
      }
    }
    return properties;
  }
<think>好的,我现在需要帮助用户解决关于MyBatis-Plus中configuration-properties的YAML配置详解的问题。用户之前已经询问过MyBatis-Plus的YAML配置,现在进一步想了解configuration-properties的具体配置项,特别是结合他们提供的站内引用内容。 首先,我需要回顾之前的对话历史。用户之前得到了关于基础配置、进阶配置、代码生成器依赖和注意事项的回答。现在用户提到参考引用[1]中的错误信息,可能与配置绑定问题有关,而引用[2]则是关于application.yml的配置大全,但用户现在需要更详细的configuration-properties内容。 接下来,我需要确定用户的具体需求。用户想查找MyBatis-Plus中configuration-properties的相关配置项,并希望得到详细的YAML配置说明。这可能包括MyBatis-Plus和原生MyBatis的配置项,特别是那些可以通过YAML文件设置的属性。 我需要确保回答结构清晰,分点说明,并正确使用YAML示例。同时,用户提到的引用[1]中的错误可能与配置错误有关,因此需要注意配置的正确性和常见问题。比如,参数映射错误可能涉及parameterMap的配置,或者在YAML中缩进不正确导致的问题。 还要检查之前的回答是否已经覆盖了configuration下的配置,比如map-underscore-to-camel-case、log-impl等,但用户现在可能需要更全面的列表,包括可能的高级配置项。此外,用户可能对如何解决配置绑定错误感兴趣,因此需要包含注意事项,例如缩进、版本兼容性等。 需要区分MyBatis-Plus特有的配置和原生MyBatis的配置,同时指出哪些配置项在YAML中属于configuration-properties。例如,global-config是MyBatis-Plus特有的,而configuration下的许多配置是原生MyBatis的,但通过MyBatis-Plus的配置进行扩展。 还需要考虑用户可能的后续问题,比如如何调试配置错误,或者如何自定义某些配置,因此在相关问题中可以提前准备这些问题,帮助用户进一步探索。 最后,确保回答符合用户要求的格式,使用中文,正确应用LaTeX格式,引用标记,并生成相关问题。同时,注意用户提供的示例中的代码块格式,确保语法正确,特别是YAML的缩进和注释。</think>以下是为您整理的MyBatis-Plus中`configuration-properties`相关的YAML配置详解,结合官方文档和常见实践整理: --- ### 一、核心配置层级关系 ```yaml mybatis-plus: configuration: # 对应MyBatis原生Configuration对象 property-name: value # 可配置项列表见下文 ``` --- ### 二、MyBatis原生配置项(通过`configuration`节点) | 配置项名称 | 类型 | 默认值 | 说明 | |-----------------------------------|--------|-------|--------------------------------------------------------------------| | `map-underscore-to-camel-case` | boolean| false | 开启数据库字段下划线转Java属性驼峰命名,如:$user\_name \rightarrow userName$ [^1] | | `log-impl` | String | - | 指定MyBatis日志实现,如:`org.apache.ibatis.logging.stdout.StdOutImpl` | | `cache-enabled` | boolean| true | 是否启用二级缓存 | | `lazy-loading-enabled` | boolean| false | 是否启用延迟加载 | | `aggressive-lazy-loading` | boolean| true | 当开启时,任何方法调用都会加载所有延迟加载属性 | | `default-statement-timeout` | int | - | 数据库操作超时时间(秒) | | `jdbc-type-for-null` | String | OTHER | 指定JDBC类型处理空值,常用值:`NULL`, `VARCHAR`, `OTHER` | --- ### MyBatis-Plus增强配置项 ```yaml mybatis-plus: configuration: # MyBatis-Plus 3.5+ 新增配置 banner: false # 关闭启动Banner打印 default-scripting-language: freemarker # 动态SQL生成引擎(可选freemarker/mybatis) global-config: db-config: column-format: "%s" # 字段格式化模板(例:`column-format: "`%s`"`防SQL注入) table-underline: true # 表名是否自动转下划线 ``` --- ### 四、典型配置示例 ```yaml mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl lazy-loading-enabled: true aggressive-lazy-loading: false default-statement-timeout: 30 jdbc-type-for-null: 'NULL' global-config: banner: false db-config: id-type: assign_id logic-delete-field: is_deleted column-format: "`%s`" ``` --- ### 五、配置注意事项 1. **版本兼容性**:部分配置项需特定MyBatis-Plus版本支持(如`banner`配置需3.5+) 2. **缩进规范**:YAML必须使用空格缩进(建议2空格为单位),错误缩进会导致`Failed to bind properties`错误[^1] 3. **参数映射**:若出现`parameter-mappings`相关错误,需检查: - SQL参数占位符`#{param}`与Java参数名是否一致 - 实体类字段与数据库字段映射关系 - 复杂参数是否缺少`@Param`注解 --- ### 六、调试技巧 在应用启动参数添加`--debug`可查看完整配置加载过程: ```bash java -jar your-app.jar --debug ``` 观察控制台输出的`MyBatis configuration`部分验证配置生效情况[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值