`

使用iBatis中报 java.sql.SQLException: 无效的列类型异常

 
阅读更多
<!--Content表 插入应的记录到数据库中 --> 
< insert id = "insertContent"   parameterClass = "com.unmi.content" > 
	INSERT INTO PERSON(ID,NAME,SERVICEID) VALUES(#id#,#name#,#serviceid#) 
</ insert > 
//三个子段允许为空(null)
SqlMapClient sqlMap = SqlMapConfig.getSqlMapInstance();  // as coded above 
Content content= new Content( 1 ); 
content.setName( "Unmi" ); 
// content.setServiceId("123456"); // 注意该行被注释,serviceid属性为NULL 
sqlMap.insert( "content" , content);

部分异常信息:
--- The error occurred in com/unmi/content.xml.  
--- The error occurred while applying a parameter map.  
--- Check the insertPerson-InlineParameterMap.  
--- Check the parameter mapping for the 'serviceid' property.  
--- Cause: java.sql.SQLException : 无效的列类型 
Caused by: java.sql.SQLException : 无效的列类型
     at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate( GeneralStatement.java:91 ) 
     at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert( SqlMapExecutorDelegate.java:442 ) 
     at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert( SqlMapSessionImpl.java:81 )
     at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.insert( SqlMapClientImpl.java:58 )
     at com.unmi.Client.main( Client.java:33 )
Caused by: java.sql.SQLException : 无效的列类型

//解决方案:
只要去掉 content.setServiceId("123456"); 前的注释,让content的三个字段都不为NULL,才能成功向数据库中插入记录。其实content表并没有任何约束,却是iBatis在此拦截下来,实是多此一举。那如果我确实让某个字段是NULL值,该怎么做呢?您只要修改一下映射文件中预置的SQL语句就行了,告诉iBatis当该字段出现NULL 值该用什么值来替代,连接Oracle即使是要求某字段传入NULL值时就是插入NULL值也必须要你累述一遍,好讨厌的事情。



<!-- 插入一条Person对应的记录到数据库中 -->   
< insert id = "content" parameterClass = "com.unmi.content" >  
    INSERT INTO PERSON(ID,NAME,PASSWD) VALUES(#id#,#name#,#SERVICEID:VARCHAR:NULL#)   
</ insert > 

支持的类型在 java.sql.Types 中列示出来了,我一开始还把上面的 VARCHAR 错写成了 VARCHAR2。再比如果你想传入的 id 为NULL时替换为 0, 你就可以写成 #id:INTEGER:0#。

原因是 iBatis 是根据参数的当前值的类型(而不是类属性) 来决定对于这个 PrepairedStatement 设置参数是应该调用哪一个版本的 setXxx() 方法(是 String 就调用,setString() ,是 int 就调用 setInt() 等)。而如果参数值为 null,iBatis 便不知道调用哪个 setXxx() 方法,于是在 Oracle 的驱动下就笼统的调用 setNull() 方法,然而 Oracle 在对字符串类型字段使用 setNull() 却是有问题的。因为在配置中就必须指明当前字段的类型,如 #SERVICEID:VARCHAR:NULL#,当 iBatis 在碰到参数为 null 难以决断时,但见到这里的 VARCHAR 选项,它也知道应该用 setString() 方法来给 PrepairedStatement 赋值。至于其中的 NULL,不过是指定参数为 null 时的默认值,显然,写成 #SERVICEID:VARCHAR# 就行了,后面的 NULL 是多余的。
不知你注意到没有,我们上面的insert标记配置了属性是 parameterClass, 那如果配置的是 parameterMap 该如何解决因字段为NULL值的问题呢?这就要求我们在配置 parameterMap标记中可能出现NULL值的参数一定要指定相应的 jdbcType属性就行。只要不指定nullValue属性就表示在该表这段中直接记下NULL值。

< parameterMap   id = "insert-person-paraMap" class = "com.unmi.content" > 
< parameter property = "id" /> 
< parameter property = "name" /> 
< parameter property = "SERVICEID"   jdbcType = "VARCHAR" /> 
</ parameterMap > 
<!-- 插入一条Person对应的记录到数据库中 --> 
< insert id = "insertPerson"   parameterMap = "insert-person-paraMap" > 
     INSERT INTO CONTENT(ID,NAME,SERVICEID) VALUES(?,?,?) 
</ insert >
分享到:
评论

相关推荐

    IBatis.DataMapper.1.6.2.bin.zip

    本篇文章将围绕"IBatis.DataMapper.1.6.2.bin.zip"和"IBatis.DataMapper.1.9"这两个开发包,深入探讨其核心概念、功能特性以及版本间的差异,帮助开发者更好地理解和应用这一框架。 1. **IBatis DataMapper简介** ...

    ibatis-2.3.4.726.jar,ibatis-2.3.0.677.jar,ibatis-2.3.3.720.jar下载

    iBATIS,全称为“Infrastructure for Binding Applications To SQL Maps”,是一个优秀的开源持久层框架,它允许Java开发者将SQL语句与Java代码分离,提供了一种简单但强大的在Java应用中映射SQL和结果集的方式。...

    Caused by: java.net.UnknownHostException: openapi.alipay.com

    Caused by: java.net.UnknownHostException: openapi.alipay.com

    IBATISJDBC包

    4. **编写Java代码**: 使用IBATIS提供的API,如SqlMapClient,来执行SQL映射文件中的查询、插入、更新和删除操作。 5. **测试和调试**: 编写测试用例,验证数据访问层的功能是否正确无误。 总之,"IBATISJDBC包"是...

    Mybatis报错: org.apache.ibatis.exceptions.PersistenceException解决办法

    在使用Mybatis框架时,你可能会遇到`org.apache.ibatis.exceptions.PersistenceException`这样的异常。这个异常通常表示在执行数据库查询操作时遇到了问题。本篇将详细分析这个问题并提供解决方法。 ### 问题概述 ...

    IBatisNet.Common.1.6.2、IBatis.DataAccess.1.9.2、IBatis.DataMapper.1.6.2

    标题和描述中提到的"IBatisNet.Common.1.6.2、IBatis.DataAccess.1.9.2、IBatis.DataMapper.1.6.2"是针对一个名为IBatisNet的框架的不同组件的版本号。IBatisNet是一个在.NET平台上实现的开源持久层框架,它源于Java...

    ibatis-2.3.2.715.jar

    2. 映射器接口:Ibatis支持使用Java接口来代表一个数据库操作的集合。接口方法的名称和参数类型对应着SQL映射文件中的SQL语句和参数,这样就可以通过简单的调用接口方法实现数据库操作。 3. 数据源配置:`ibatis-...

    ibatis2.3.4.8.jar 和 ibatis-2.3.4.726.jar两个版本的下载

    Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责简化数据库操作,将SQL语句与Java代码分离,使得开发人员能够更加专注于业务逻辑。在本主题中,我们将深入探讨Ibatis的两个特定版本:ibatis2.3.4.8....

    iBATIS开发教程.docx

    SQL Maps是iBATIS的核心组件,负责将Java对象与数据库表之间的映射。SQL Maps提供了一个灵活的方式来定义数据库表的结构和关系,从而实现数据的CRUD(Create、Read、Update、Delete)操作。 三、SQL Map如何工作? ...

    ibatis-2.3.4.726官方最新开发包

    Ibatis 是一款开源的、基于Java的持久层框架,它简化了数据库与应用程序之间的交互,提供了灵活的SQL映射机制,使得开发者可以将SQL语句直接写在配置文件中,从而避免了传统的JDBC代码编写。这个“ibatis-2.3.4.726...

    ibatis视频教程.rar

    3. 分离SQL和Java代码:Ibatis将SQL语句和Java代码分离,使得代码更易于管理和测试,同时也降低了SQL注入的风险。 4. 动态SQL:Ibatis提供了动态SQL的功能,可以在XML映射文件中直接编写条件语句,极大地简化了复杂...

    ibatis-core-3.0.jar org.apache.ibatis.annotations.Param

    `org.apache.ibatis.annotations.Param`是MyBatis中的一个重要注解,用于处理方法参数映射。 `@Param`注解主要用于SQL查询中的动态参数绑定,尤其是在动态SQL语句中。在MyBatis的映射文件或者Mapper接口中,当我们...

    ibatis-2.3.3.720.jar

    ibatis-2.3.3.720.jar

    IBatis.DataMapper.1.6.2

    标题 "IBatis.DataMapper.1.6.2" 指的是 IBatis 数据映射器的一个特定版本,即 1.6.2 版本。IBatis 是一个流行且广泛使用的开源持久层框架,它允许开发者将 SQL 查询与.NET 应用程序中的对象模型进行解耦,提供了一...

    ibatis-2.3.4.726.jar

    iBATIS的主要目标是简化数据库与应用程序之间的交互,通过提供一种声明式的方式,将SQL语句与Java代码解耦,使得开发者能够更高效、灵活地管理数据访问层。 在iBATIS 2.3.4.726这个版本中,我们可以看到该框架已经...

    ibatis-2.3.0.677.jar

    由于没有提供具体的压缩包子文件的文件名称列表,我们无法详细列出所有包含的文件,但通常一个 iBATIS 源码包会包含以下部分: 1. **src/main/java**:这里的目录结构反映了 iBATIS 框架的包结构,包含了所有的 ...

    ibatis 开发指南.pdf

    iBATIS,全称为“Infrastructure As A Business Logic Translation Service”,是一个优秀的开源持久层框架,它允许开发者将SQL语句直接写在配置文件中,解决了Java与数据库交互时的繁杂性,极大地提高了开发效率。...

    manning.ibatis.in.action.jan.2007.rar

    iBATIS作为一个轻量级的数据访问框架,它允许开发者将SQL语句直接嵌入到Java代码中,避免了传统的对象关系映射(ORM)框架带来的复杂性。 iBATIS的核心概念包括: 1. SQL Maps:这是iBATIS的主要组成部分,它是SQL...

    ibatis-common.jar包

    ParameterMap是参数集合,而ParameterMapping则是参数的具体映射,包括参数在SQL语句中的位置、Java类型和数据库类型等信息。 5. **ResultMap**:ResultMap定义了如何将数据库查询结果映射到Java对象。它可以处理一...

    ibatis-2.3.4.zip

    1. SQL映射:Ibatis通过XML配置文件或注解将SQL语句与Java对象映射,支持动态SQL,可以根据业务条件自由拼接SQL,提高了代码的可读性和可维护性。 2. 易于集成:Ibatis可以轻松地与Spring等其他框架集成,实现事务...

Global site tag (gtag.js) - Google Analytics