8

我将 MyBatis 与 Oracle 11g R2 数据库一起使用。我正在使用 MyBatis 3.3 和 ojdbc6 12.1.0.2。我的问题是每当我尝试插入一个为空的对象时,我都会得到以下信息。

org.springframework.jdbc.UncategorizedSQLException:使用 JdbcType OTHER 为参数 #8 设置 null 时出错。尝试为此参数设置不同的 JdbcType 或不同的 jdbcTypeForNull 配置属性。原因:java.sql.SQLException:无效的列类型:1111

我的理解是在最新版本的 JDBC 中 null 被映射到 JdbcType.OTHERS 不是所有驱动程序都可以处理的,显然 Oracle 就是其中之一。

我在 MyBatis 配置中尝试了以下方法,但仍然没有运气。

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("org.ohtech.innovationexchange.core.domain");
        sessionFactory.setTransactionFactory(springManagedTransactionFactory());
        sessionFactory.setConfigurationProperties(getProperties());
        return sessionFactory.getObject();
    }

    @Bean(name = "transactionManager")
    public DataSourceTransactionManager dataSourceTransactionManager() throws PropertyVetoException{
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SpringManagedTransactionFactory springManagedTransactionFactory() {
        return new SpringManagedTransactionFactory();
    }

    private Properties getProperties() {
        final Properties myBatisProperties = new Properties();
        myBatisProperties.put("jdbcTypeForNull", "NULL");
        return myBatisProperties;
    }

我可以通过在我的映射器文件中执行以下操作来使其工作,但它看起来确实重复且丑陋。不知道为什么 MyBatis 不使用我的属性我正在传递 SqlSessionFactory bean。

4

5 回答 5

8

“jdbcTypeForNull”不是“属性”而是“设置”。我猜目前无法通过 java config 设置。您需要这样的 config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="jdbcTypeForNull" value="NULL" />
    </settings>
</configuration>

并使用 sessionFactory.setConfigLocation(...)。

设置和属性的区别请参考文档: https ://mybatis.github.io/mybatis-3/configuration.html

于 2015-09-23T14:28:16.720 回答
3

对于使用mybatis Spring Boot starter的用户,您可以添加以下属性application.properties来纠正此问题:

mybatis.configuration.jdbc-type-for-null=NULL
于 2019-05-02T15:51:28.340 回答
3

也许为时已晚,但这是解决方案:

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

    sessionFactory.setDataSource(dataSource);

    sessionFactory.setTypeAliasesPackage("com.xxx.mapper");

    SqlSessionFactory sqlSessionFactory = sessionFactory.getObject();

    sqlSessionFactory.getConfiguration().setJdbcTypeForNull(JdbcType.NULL);

    return sqlSessionFactory;
}
于 2016-11-03T23:10:17.333 回答
0

如果你使用的是spring mybatis组合,参考新的spring config文件如下:

<bean id="myAppSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" name="myAppSqlSessionFactory">
    <property name="dataSource" ref="myAppDataSource" />
    <property name="typeAliasesPackage" value="com.myapp.model" />
    <property name="configLocation" value="mybatis-config.xml"/>
</bean>
于 2018-04-16T17:54:30.110 回答
0

如果你使用的是 mybatis spring boot starter 并且有 application.yml 那么你需要添加这个属性。

mybatis:
  configuration:
    jdbc-type-for-null: "NULL"
于 2021-10-19T10:12:20.623 回答