【问题标题】:Error in mybatis with spring when try to insert nulls尝试插入空值时,mybatis with spring 出错
【发布时间】:2014-10-12 22:49:30
【问题描述】:

我正在尝试执行此插入:

@Insert("" +
            "insert into EXTRANET.EX_ENTIDAD (ENT_REFNUM, ENT_TIPO, REG_PUB_ID, OFIC_REG_ID, AREA_REG_ID, " +
            "COD_LIBRO, NUM_PARTIDA, ANO_TITU, NUM_TITU, ENT_TRIGGER, TMSTMP_CREA, PRIORIDAD) " +
            " values (EXTRANET.EX_ENTIDAD_SEQ.nextval, #{entTipo}, " +
            "#{regPubId}, #{oficRegId}, #{areaRegId}, #{codLibro}, #{numPartida}, #{anoTitu}, " +
            " #{numTitu}, 'SYNC', SYSDATE, #{prioridad})")
    public int insertEntidades(Map map);

但如果某些 #{param} 为 NULL,我得到它的错误:

原因:org.apache.ibatis.type.TypeException:使用 JdbcType NULL 为参数 #1 设置 null 时出错。尝试为此参数设置不同的 JdbcType 或不同的 jdbcTypeForNull

我正在寻找一些解决方案,并读到我必须配置一个属性:jdbcTypeForNull

然后我在 Spring 中更新我的配置:

@Bean
public SqlSessionFactoryBean sqlSessionFactory() throws Exception,Throwable  {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(getDataSource());
    //sessionFactory.setConfigLocation( new ClassPathResource("gob.pe.sunarp.extranet.config.config.xml"));
    sessionFactory.setTypeAliasesPackage("gob.pe.sunarp.extranet.dao.beans");
    final Properties sqlSessionFactoryProperties = new Properties();
    sqlSessionFactoryProperties.put("jdbcTypeForNull", "NULL");
    sessionFactory.setConfigurationProperties(sqlSessionFactoryProperties );

    return sessionFactory;
}

但错误仍在继续。

我找到了许多 xml 的解决方案,但我只使用 java 接口。
关于这个错误的一些想法?

【问题讨论】:

    标签: java spring oracle11g mybatis


    【解决方案1】:

    根据MyBatis documentation

    如果 null 作为值传递,则 JDBC 要求所有可空列的 JDBC 类型。您可以通过阅读 PreparedStatement.setNull() 方法的 JavaDocs 自行调查。

    您是否为参数设置了 jdbcType?例如:

    #{property,javaType=int,jdbcType=NUMERIC}
    

    documentation 所示,设置 jdbcTypeForNull 可能不适用于您的驱动程序。

    当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。一些驱动程序需要指定列 JDBC 类型,但其他驱动程序使用 NULL、VARCHAR 或 OTHER 等通用值。

    【讨论】:

    • 嗨@Centinul,我做了一个测试:@Insert("INSERT INTO JOEWEB.PRUEBA (ID, TEXTO) VALUES(#{id}, #{texto,jdbcType=VARCHAR})") public int insertPrueba(地图地图);并且插入成功完成。但是我在项目中有很多陈述。是否存在用于解决此问题的全局配置?如果不存在。这周有什么问题!! :(
    • @JoseDiazDiaz,您使用的是什么 JDBC 驱动程序?
    • 我正在使用 ojdbc6.jar。我的 Oracle 是 11.2.0.2。 mybatis的版本是3.2.7,mybatis-spring 1.2.2,spring 4.0.6一般。我有 500 条语句。出于这个原因,我很担心。
    • @JoseDiazDiaz 我看到你已经注释掉了你的 XML 配置。您是否偶然尝试过使用 XML 配置并在那里设置该属性?
    • 是的,@Centinul。两种选择都没有。
    【解决方案2】:

    试试类似的方法

    Map<String, Object> map = new HashMap<>();
    map.put("entTipo", (Long) null);
    
    insertEntidades(map);
    

    【讨论】:

    • 我做了测试@eddú-meléndez,但什么也没做。目前仅使用 #{texto,jdbcType=VARCHAR} 运行。
    【解决方案3】:

    如果你想要一个全局设置..试试这样的

    在 Java 代码中

    sqlSessionFactoryProperties.put("jdbcTypeForNull", JdbcType.DATE);
    

    或者在mybatis-config.xml中

    <configuration>
        <settings>
            <setting name="jdbcTypeForNull" value="DATE" />             
        </settings>    
    </configuration>
    

    这样您就可以对任何 DATE 列进行插入/更新。

    我建议使用 mybatis-config.xml 解决方案来避免单元测试出现问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多