MyBatis - jdbcTypeForNull Oracle
Posted
技术标签:
【中文标题】MyBatis - jdbcTypeForNull Oracle【英文标题】: 【发布时间】:2015-11-11 21:53:13 【问题描述】:我将 MyBatis 与 Oracle 11g R2 数据库一起使用。我正在使用 MyBatis 3.3 和 ojdbc6 12.1.0.2。我的问题是每当我尝试插入一个空对象时,我都会得到以下结果。
org.springframework.jdbc.UncategorizedSQLException: 错误设置 null 对于带有 JdbcType OTHER 的参数#8。尝试设置不同的 此参数的 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。
【问题讨论】:
MyBatis ORA-01745: invalid host/bind variable name 的可能重复项 【参考方案1】:“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
【讨论】:
【参考方案2】:也许已经晚了,但这里是解决方案:
@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;
【讨论】:
【参考方案3】:如果你使用的是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>
【讨论】:
【参考方案4】:对于那些使用mybatis Spring Boot starter 的人,这是您可以添加到application.properties
以纠正此问题的属性:
mybatis.configuration.jdbc-type-for-null=NULL
【讨论】:
【参考方案5】:如果你使用的是mybatis spring boot starter并且有application.yml那么你需要添加这个属性。
mybatis:
configuration:
jdbc-type-for-null: "NULL"
【讨论】:
以上是关于MyBatis - jdbcTypeForNull Oracle的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis-Plus:了解Mybatis-Plus快速开始(Mybatis + Mybatis-Plus,Mybatis-Plus自动做了属性映射)