【问题标题】:How do I set MyBatis configuration properties in an application.properties file in a Spring Boot application?如何在 Spring Boot 应用程序的 application.properties 文件中设置 MyBatis 配置属性?
【发布时间】:2016-08-24 15:58:48
【问题描述】:

MyBatis Spring Boot Starter documentation 列出了可以在 application.properties 文件中设置的属性,该列表包括:

configuration:一个 MyBatis 配置 bean。关于可用属性见 MyBatis 参考页

从那里不是很明显,但我认为它的建议是你可以添加这样的东西:

mybatis.configuration.jdbcTypeForNull=VARCHAR

这似乎有效;当然,如果我将 VARCHAR 更改为不是枚举 JdbcType 的有效值,我会收到错误消息。但是,它似乎也没有选择我的设置。

当我使用调试器时,我可以看到MybatisProperties.setConfiguration()被调用,之前Configuration.setJdbcTypeForNull(),这意味着使用默认值(JdbcType.OTHER)而不是我的值'我正在尝试设置。

我是否误解了应该如何使用此功能,或者这是一个错误?有没有人像这样设置配置值?在其他地方,我只能看到使用 XML 文件的示例,如果可能的话,我宁愿避免这样做。

嗯,这很尴尬

我放弃了尝试使用application.properties 中的configuration 属性,并使用了我试图避免的XML 配置,但是刚才在这里看到了一些有用的建议,我回到了我的代码,将其从 XML 配置更改回 mybatis.configuration.jdbcTypeForNull=NULL 并重新运行我的测试,在之前的相同条件下肯定失败了,但现在它通过了。

我不知道与以前有什么不同 - 调试我看到与上述相同的行为 - 配置 bean 似乎 在启动期间将 jdbcTypeForNull 参数设置回 OTHER,但是当它在查询期间访问它再次为 NULL。我将把这个问题留在这里,以防它是一个竞争条件并且它稍后再次开始失败,但现在我的问题似乎已经神秘地消失了。

【问题讨论】:

  • 您是否尝试过将此<setting name="callSettersOnNulls" value="true"/> 添加到您的mybatis-config.xml 中,这将允许您获得空值或空值而不会出错。
  • 当您从数据库中获取空值时,此设置不是吗?我正在查看的情况是在插入中将列设置为空。
  • 我的错误我很困惑。您是否使用 bean 作为参数类型。

标签: java spring spring-boot mybatis spring-mybatis


【解决方案1】:

如果您要使用mybatis.configuration.jdbcTypeForNull,请记住不要同时指定configLocation 属性。否则您的设置将被删除为默认值。

正如 spring boot 所做的那样,MybatisProperties.setConfiguration()Configuration.setJdbcTypeForNull() 之前被调用是正确的。因为spring boot尝试将configuration设置为MybatisProperties但发现其成员configuration为null,所以spring boot会实例化一个新的Configuration并立即赋值给MybatisProperties。之后,spring boot 会尝试将所有mybatis.configuration.* 分配给MybatisProperties 的这个成员。

如果要使用XML配置mybatis,需要在<settings/>元素下指定<setting name="jdbcTypeForNull" value="VARCHAR"/>example

这肯定行得通。

【讨论】:

  • 这是你见过的工作吗?我收到一条错误消息:“字段'configuration.jdbcTypeForNull'上的对象'mybatis'中的字段错误:拒绝值[12] ...嵌套异常是java.lang.IllegalArgumentException:没有枚举常量org.apache.ibatis.type。 JdbcType.12]".
  • 请查看JdbcType,找到您想要的真正价值。
  • 不,不是这样。您可以在错误消息中看到它正在尝试使用 ...ibatis.type.JdbcType。正如我在问题中所说,使用 VARCHAR 确实设置了正确的值,但是在设置后会使用默认值重新设置。
  • 好的。我得到了它。我在火车上用我的电话回复你,而且阅读源代码并不容易。如果可以的话,我会留下任何信息。
  • Configuration#setJdbcTypeForNull()MybatisProperties#setConfiguration() 正确后被调用。因为稍后应该映射到您在需要时配置的内容。 Spring 将创建一个默认的Configuration 并将其分配给MybatisProperties,然后正确设置JdbcTypeForNull。您确定该值不是您配置的值吗?
【解决方案2】:

将此<setting name="jdbcTypeForNull" value="OTHER"/> 添加到您的mybatis-config.xml 应该可以正常工作。否则对你的查询试试这个,这对我来说非常好用 oracle/mysql as db

   insert into students 
     (id,name,class,date_of_joining)
     values 
     (#{id,jdbcType=INTEGER},#{class,jdbcType=TIMESTAMP},
     #{class,jdbcType=NVARCHAR},#{date_of_joining,jdbcType=TIMESTAMP})

这里是mybatis提供的list of jdbcTypes。如果您觉得约束有时可能为空/null,则需要将其添加到每个约束中。

【讨论】:

  • OTHER 是默认值,这就是不起作用的(使用 Oracle)。我目前正在使用它,但将其设置为 ...value="NULL",它可以工作。问题的重点是尽可能不使用 XML 配置。不过,我的问题现在似乎已经消失了 - 请参阅我的帖子的编辑。
  • 你在映射器 xml 中使用 bean 作为 parameterType。
【解决方案3】:

如果你使用的是 application.yml 试试

mybatis:
  configuration:
    jdbc-type-for-null: 'NULL'

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 2017-06-17
    • 2020-09-15
    • 2020-05-05
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多