sqlserver 存储过程:
create procedure insert_normal_user
@userId int output,
@loginName nvarchar(80),
@password nvarchar(80),
@company nvarchar(80),
@roleId int,
@isEnable tinyint,
@hasCoInfo tinyint,
@financeToolType tinyint
as
begin
--不生成影响行数
SET NOCOUNT ON;
insert into CN_NORMAL_USER
(LOGIN_NAME,PASSWORD,COMPANY,ROLE_ID,IS_ENABLE,
CREATE_TIME,UPDATE_TIME,HAS_CO_INFO,FINANCE_TOOL_TYPE)
values
(@loginName,@password,@company,@roleId,@isEnable,
getDate(),getDate(),@hasCoInfo,@financeToolType);
select @userId=SCOPE_IDENTITY() ;
end
JDBC执行存储过程方法一:
Connection conn=getConnection();
Connection conn=getConnection();
CallableStatement call=conn.prepareCall("{call insert_normal_user(?,?,?,?,?,?,?,?)}");
call.registerOutParameter(1,java.sql.Types.INTEGER);
call.setObject(2, "这是测试插入----");
call.setObject(3, "123");
call.setObject(4, "12");
call.setObject(5, 1);
call.setObject(6, 4);
call.setObject(7, 0);
call.setObject(8, 1);
call.executeUpdate();
System.out.println(call.getInt(1));
conn.close();
没有问题,如果将call.registerOutParameter(8,java.sql.Types.INTEGER);
改为call.registerOutParameter(1,-99999);会报错
Exception in thread "main" java.lang.NullPointerException
at com.microsoft.sqlserver.jdbc.AppDTVImpl$SetValueOp.executeDefault(Unknown Source)
at com.microsoft.sqlserver.jdbc.DTV.executeOp(Unknown Source)
at com.microsoft.sqlserver.jdbc.AppDTVImpl.setValue(Unknown Source)
at com.microsoft.sqlserver.jdbc.DTV.setValue(Unknown Source)
at com.microsoft.sqlserver.jdbc.Parameter.getTypeDefinition(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.buildParamTypeDefinitions(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.buildPreparedStrings(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doPrepExec(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PreparedStatementExecutionRequest.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
at com.caineng.util.ibatis.JDBC.main(JDBC.java:115)
JDBC执行存储过程方法二:
Connection conn=getConnection();
CallableStatement call=conn.prepareCall("{call insert_normal_user(?,?,?,?,?,?,?,?)}");
call.registerOutParameter(1,-99999);
call.setObject(1, 1);// 新添加的语句
call.setObject(2, "这是测试插入----");
call.setObject(3, "123");
call.setObject(4, "12");
call.setObject(5, 1);
call.setObject(6, 4);
call.setObject(7, 0);
call.setObject(8, 1);
call.executeUpdate();
System.out.println(call.getInt(1));
如果设置call.registerOutParameter(1,-99999);再添加call.setObject(1, 1);则可以执行正确。
Ibatis执行存储过程一:
配置文件:
<parameterMap class="NormalUser" id="normalUserParameterMap">
<parameter property="userId" javaType="Integer" jdbcType="INTEGER" mode="OUT" />
<parameter property="loginName" mode="IN"/>
<parameter property="password" mode="IN"/>
<parameter property="company" mode="IN"/>
<parameter property="roleId" mode="IN" />
<parameter property="isEnable" mode="IN" />
<parameter property="hasCoInfo" mode="IN" />
<parameter property="financeToolType" mode="IN"/>
</parameterMap>
<procedure id="insertNormalUserByProcedure" parameterMap="normalUserParameterMap">
{call insert_normal_user(?,?,?,?,?,?,?,?)}
</procedure>
可以通过,如果将<parameter property="userId" javaType="Integer" jdbcType="INTEGER" mode="OUT" />
改为<parameter property="userId" javaType="Integer"
jdbcType="int" mode="OUT" />则报错:
org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];
--- The error occurred in sqlmaps/mssql/account/NormalUser.ibatis.xml.
--- The error occurred while applying a parameter map.
--- Check the CN_NORMAL_USER.normalUserParameterMap.
--- Check the statement (update procedure failed).
--- Cause: java.lang.NullPointerException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in sqlmaps/mssql/account/NormalUser.ibatis.xml.
--- The error occurred while applying a parameter map.
--- Check the CN_NORMAL_USER.normalUserParameterMap.
--- Check the statement (update procedure failed).
--- Cause: java.lang.NullPointerException
--- Cause: java.lang.NullPointerException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
空指针和上面jdbc java代码中设置call.registerOutParameter(1,-99999);之后报的错一样。
Ibatis执行存储过程二:
<parameterMap class="NormalUser" id="normalUserParameterMap">
<parameter property="userId" javaType="Integer" jdbcType="int" mode="INOUT" />
<parameter property="loginName" mode="IN"/>
<parameter property="password" mode="IN"/>
<parameter property="company" mode="IN"/>
<parameter property="roleId" mode="IN" />
<parameter property="isEnable" mode="IN" />
<parameter property="hasCoInfo" mode="IN" />
<parameter property="financeToolType" mode="IN"/>
</parameterMap>
<procedure id="insertNormalUserByProcedure" parameterMap="normalUserParameterMap">
{call insert_normal_user(?,?,?,?,?,?,?,?)}
</procedure>
现在<parameter property="userId" javaType="Integer"
jdbcType="int" mode="INOUT" />
将jdbcType="int" mode="INOUT" 可以通过,但是前提是传进来的对象NormalUser的userId属性不能为空。
联想到上面jdbc java代码中设置call.registerOutParameter(1,-99999);之后有加入代码call.setObject(1, 1);
引用
ibatis parameterMap的子元素parameter的属性jdbcType用于显式地指定给本属性(property)赋值的数据库字段的数据类型。
对于某些特定的操作,如果不指定字段的数据类型,某些JDBC Driver无法识别字段的数据类型。一个很好的例子是
PreparedStatement.setNull(int parameterIndex, int sqlType)方法,要求指定数据类型。如果不指定数据类型,
某些Driver可能指定为Types.Other或Types.Null。但是,不能保证所有的Driver都表现一致。对于这种情况,
SQL Map API允许使用parameterMap子元素parameter的jdbcType属性指定数据类型。
正常情况下,只有当字段可以为NULL时才需要jdbcType属性。另一需要指定jdbcType属性的情况是字段类型为日期时间类型的情况。
因为Java只有一个Date类型(java.util.Date),而大多数SQL数据库有多个-通常至少有3种。因此,
需要指定字段类型是DATE还是DATETIME。属性jdbcType可以是JDBC Types类中定义的任意参数的字符串值。
虽然如此,还是有某些类型不支持(即BLOB)。本节的稍后部分会说明架构支持的数据类型。
注意!大多数JDBC Driver只有在字段可以为NULL时需要指定jdbcType属性。因此,对于这些Driver,
只是在字段可以为NULL时才需要指定type属性。注意!当使用Oracle Driver时,如果没有给可以为NULL的字段指定jdbcType属性,
当试图给这些字段赋值NULL时,会出现“Invalid column type”错误。
附上Ibatis parameterMap的子元素parameter的属性jdbcType的解释
本人小菜,文笔欠佳,请见谅!
分享到:
相关推荐
本文将详细探讨如何使用iBATIS调用Oracle存储过程,并处理返回的Cursor结果集。 首先,理解iBATIS调用存储过程的基本原理。iBATIS允许开发者在映射文件中定义存储过程调用,通过`<procedure>`标签来实现。在这个...
同时,SQLServer提供的存储过程和函数也可以通过Ibatis调用,提升数据库操作性能。 总的来说,通过理解Ibatis和SQLServer的结合,以及掌握代码自动生成的工具和方法,开发者可以大大提高工作效率,减少重复劳动,更...
在这个项目中,iBatis 被用来处理与SQL Server 2005数据库的交互,执行增删查改操作。 SQL Server 2005 是 Microsoft 提供的关系型数据库管理系统,广泛应用于企业级数据存储。它支持T-SQL语言,提供强大的数据处理...
创建一个测试类,如`TestIbatis.java`,并使用Ibatis API执行SQL查询: ```java import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis....
在IT行业中,数据库操作是应用程序开发的关键环节,而Ibatis作为一个优秀的持久层框架,与Microsoft SQL Server(MSSQL)数据库结合,可以高效地实现数据的增、删、改、查(CRUD)操作,并且支持存储过程的调用。...
Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让你直接编写原生态SQL,可以严格控制SQL执行性能,灵活度极高,尤其适合对SQL有特殊需求的项目。 ### SQL语句详解 #### 1. 删除...
这个过程涉及到多个技术组件,包括Java的JXL库、iBatis持久层框架、SQL Server存储过程以及Struts MVC框架。下面我们将详细探讨这些知识点。 1. **JXL库**:JXL是Java中用于读写Excel文件的一个流行库。它允许...
在本实例中,我们将探讨如何在IBatis中使用存储过程,特别是针对SQL Server数据库。 首先,我们需要创建一个存储过程。在本例中,我们有一个名为`P_UpdateUserName`的存储过程,它接受两个输入参数`@UserName`和`@...
SQL Server 2005则是微软公司推出的一种关系型数据库管理系统,提供了高性能、安全的数据存储和管理功能。 【ibatis知识点】 1. **配置文件**:在iBATIS中,核心配置文件(通常为`SqlMapConfig.xml`)定义了数据源...
在这个过程中,`access2sqlserver2005`可能是执行此任务的工具或脚本文件。 5. **应用程序适配**:更新应用程序的配置,使其能够连接到新的SQL Server 2005数据库,并使用Ibatis2进行数据操作。 6. **测试验证**:...
在源码中,iBatis通过JDBC驱动与数据库交互,因此,理解SQL Server的数据类型、事务管理和存储过程对于使用iBatis至关重要。例如,你可以看到iBatis如何通过ParameterHandler和ResultSetHandler处理SQL Server的参数...
综上所述,这个压缩包提供的是一套针对iBATIS与SQL Server 2000集成的解决方案,尤其适用于那些希望避免使用存储过程处理动态参数的开发者。它包含了分页查询的完整实现,以及一个名为“SSI_SimpleTest”的测试模块...
SQLServer在JavaEE应用中的角色是存储和管理应用程序所需的数据,通过JDBC(Java Database Connectivity)接口,Java代码可以与数据库进行交互,执行查询、插入、更新和删除操作。 设计报告中应该详细阐述了系统的...
总结来说,这个例子展示了如何使用Struts2作为前端控制器,Spring进行依赖管理和事务控制,iBatis处理数据库操作,SQL Server 2005存储数据,而Tomcat作为服务器环境,共同构建一个完整的Web应用系统。这个系统能够...
此外,iBatis支持存储过程的调用,只需在XML配置文件中定义相应的SQL映射,即可轻松执行存储过程。 在实际开发中,iBatis的映射文件和Java对象之间的映射关系是关键。我们可以通过`@Select`、`@Insert`、`@Update`...
在MySQL、Oracle、SQL Server等数据库中编写存储过程。例如,一个简单的存储过程可能是用于增删改查操作的。 3. **数据访问层(DAO)**: 在Struts2中,通常会创建一个DAO(数据访问对象)类来处理与数据库的交互...
在压缩包子文件的文件名"execution"可能是iBATIS执行器的相关内容,执行器是iBATIS的核心部分,负责解析SQL映射文件,生成相应的PreparedStatement对象,并执行SQL语句。在分页场景下,执行器需要处理如何正确地拼接...
IbatisNet还支持存储过程的调用,动态SQL,事务管理等高级功能。在实际开发中,你可以根据需求进行选择和配置,实现高效、灵活的数据访问。 综上所述,IbatisNet连接SQL Server 2008的过程包括配置SqlMapConfig.xml...
3. 实现数据访问层(DAL):创建接口和实现,接口定义数据库操作方法,实现则利用Ibatis的SqlMapClient执行SQL。 4. 控制器(Controller)操作:在MVC控制器中,通过依赖注入或直接实例化数据访问层对象,调用相关...
在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL的存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久层框架,它允许开发者编写SQL语句,并与Java对象进行...