Java 尝试插入空值时,mybatis with spring中出现错误
我正在尝试执行此插入:Java 尝试插入空值时,mybatis with spring中出现错误,java,spring,oracle11g,mybatis,Java,Spring,Oracle11g,Mybatis,我正在尝试执行此插入: @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) " + " val
@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}为空,则我得到了错误:
原因:org.apache.ibatis.type.TypeException:将参数#1设置为null时出错,JdbcType为null。请尝试为此参数设置其他JdbcType或设置其他JdbcType FORNULL
我正在搜索一些解决方案,读到我必须配置一个属性: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接口。关于这个错误的一些想法?根据 如果null作为一个值传递,那么JDBC对于所有可为null的列都需要JDBC类型。您可以通过阅读PreparedStatement.setNull()方法的JavaDocs来自行研究这一点 您是否为参数设置了jdbcType?例如:
#{property,javaType=int,jdbcType=NUMERIC}
如中所示,将jdbcTypeForNull设置可能不适用于您的驱动程序
当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。一些驱动程序需要指定列JDBC类型,但其他驱动程序使用诸如NULL、VARCHAR或OTHER之类的通用值
试试那样的
Map<String, Object> map = new HashMap<>();
map.put("entTipo", (Long) null);
insertEntidades(map);
Map Map=newhashmap();
map.put(“entTipo”,(Long)null);
插入数据(map);
如果需要全局设置,请尝试以下方法
在Java代码中
sqlSessionFactoryProperties.put("jdbcTypeForNull", JdbcType.DATE);
或者在mybatis-config.xml中
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="DATE" />
</settings>
</configuration>
这样,您就可以对任何日期列进行插入/更新
我建议使用mybatis-config.xml解决方案来避免单元测试出现问题Hi@Centinul,我做了一个测试:@Insert(“Insert INTO JOEWEB.PRUEBA(ID,TEXTO)value(#{ID},#{TEXTO,jdbcType=VARCHAR})”)public int insertPrueba(Map Map);插入成功完成。但是我在这个项目中有很多陈述。是否存在解决此问题的全局配置?如果不存在。这周有什么问题!!:(@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 con配置并在那里设置该属性?是的,@Centinul。两个选项都有,什么都没有。我做了测试@eddú-meléndez,但什么都没有。目前只运行#{texto,jdbcType=VARCHAR}。