`

ibatis 执行sqlserver存储过程

阅读更多
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的解释

本人小菜,文笔欠佳,请见谅!



















分享到:
评论
2 楼 antlove 2014-03-15  
DXL_xiaoli 写道
java代码如何获取返回的值,需要特殊处理吗,利用对应类型接收之类的?
返回一个标识如何处理?
返回一个CData类型又如何处理?
初学请多指教

没明白你要问什么问题。
如果是问java如何操纵数据库。一下是一个jdbc的简单例子。希望对你有所帮助。
至于如何处理返回值为CData类型的数据,目前暂时暂时没有接触到。
package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTest {
	private static String user="";
	private static String password="";
	private static String url="";
	private static String driverClass="";
	static {
		try {
			Class.forName(driverClass);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	private Connection getDefaultConnection() {
		try {
			return DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	private void close(Statement statement){
		if(statement==null){
			return;
		}
		try {
			statement.close();
			statement.getConnection().close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
	}
	
	public  void test(){
		Connection connection = getDefaultConnection();
		String sql ="select ID,USERNAME from student";
		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while(rs.next()){
				int id = rs.getInt("ID");
				String username = rs.getString("USERNAME");
				System.out.println("id : "+id+",username : "+username);
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}finally{
			close(ps);
		}
	}
}
1 楼 DXL_xiaoli 2014-03-15  
java代码如何获取返回的值,需要特殊处理吗,利用对应类型接收之类的?
返回一个标识如何处理?
返回一个CData类型又如何处理?
初学请多指教

相关推荐

    ibatis sqlserver代码自动生成

    同时,SQLServer提供的存储过程和函数也可以通过Ibatis调用,提升数据库操作性能。 总的来说,通过理解Ibatis和SQLServer的结合,以及掌握代码自动生成的工具和方法,开发者可以大大提高工作效率,减少重复劳动,更...

    Struts2,Spring2,Ibatis,SQL Server2005做的项目

    在这个项目中,iBatis 被用来处理与SQL Server 2005数据库的交互,执行增删查改操作。 SQL Server 2005 是 Microsoft 提供的关系型数据库管理系统,广泛应用于企业级数据存储。它支持T-SQL语言,提供强大的数据处理...

    ibatis2.0+sqlserver2005环境搭建

    创建一个测试类,如`TestIbatis.java`,并使用Ibatis API执行SQL查询: ```java import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis....

    ibatis +mssql 执行增删改查 +存储过程

    在IT行业中,数据库操作是应用程序开发的关键环节,而Ibatis作为一个优秀的持久层框架,与Microsoft SQL Server(MSSQL)数据库结合,可以高效地实现数据的增、删、改、查(CRUD)操作,并且支持存储过程的调用。...

    Ibatis常用sql语句

    Ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。Ibatis可以让你直接编写原生态SQL,可以严格控制SQL执行性能,灵活度极高,尤其适合对SQL有特殊需求的项目。 ### SQL语句详解 #### 1. 删除...

    excel数据导入到sqlserver2005

    这个过程涉及到多个技术组件,包括Java的JXL库、iBatis持久层框架、SQL Server存储过程以及Struts MVC框架。下面我们将详细探讨这些知识点。 1. **JXL库**:JXL是Java中用于读写Excel文件的一个流行库。它允许...

    IBatis中的存储过程应用实例

    在本实例中,我们将探讨如何在IBatis中使用存储过程,特别是针对SQL Server数据库。 首先,我们需要创建一个存储过程。在本例中,我们有一个名为`P_UpdateUserName`的存储过程,它接受两个输入参数`@UserName`和`@...

    ibatis +sql2005 一个小项目

    SQL Server 2005则是微软公司推出的一种关系型数据库管理系统,提供了高性能、安全的数据存储和管理功能。 【ibatis知识点】 1. **配置文件**:在iBATIS中,核心配置文件(通常为`SqlMapConfig.xml`)定义了数据源...

    数据库移植处理程序(SQLSERVER2005) 采用ibatis2

    在这个过程中,`access2sqlserver2005`可能是执行此任务的工具或脚本文件。 5. **应用程序适配**:更新应用程序的配置,使其能够连接到新的SQL Server 2005数据库,并使用Ibatis2进行数据操作。 6. **测试验证**:...

    ibatis源码

    在源码中,iBatis通过JDBC驱动与数据库交互,因此,理解SQL Server的数据类型、事务管理和存储过程对于使用iBatis至关重要。例如,你可以看到iBatis如何通过ParameterHandler和ResultSetHandler处理SQL Server的参数...

    ibatis-2000数据库

    综上所述,这个压缩包提供的是一套针对iBATIS与SQL Server 2000集成的解决方案,尤其适用于那些希望避免使用存储过程处理动态参数的开发者。它包含了分页查询的完整实现,以及一个名为“SSI_SimpleTest”的测试模块...

    JavaEE(J2EE)课程设计,MyEclipse工程,内附SQLServer数据库及设计报告

    SQLServer在JavaEE应用中的角色是存储和管理应用程序所需的数据,通过JDBC(Java Database Connectivity)接口,Java代码可以与数据库进行交互,执行查询、插入、更新和删除操作。 设计报告中应该详细阐述了系统的...

    struts2 和 spring +ibatis+sql2005

    总结来说,这个例子展示了如何使用Struts2作为前端控制器,Spring进行依赖管理和事务控制,iBatis处理数据库操作,SQL Server 2005存储数据,而Tomcat作为服务器环境,共同构建一个完整的Web应用系统。这个系统能够...

    iBatis学习总结

    此外,iBatis支持存储过程的调用,只需在XML配置文件中定义相应的SQL映射,即可轻松执行存储过程。 在实际开发中,iBatis的映射文件和Java对象之间的映射关系是关键。我们可以通过`@Select`、`@Insert`、`@Update`...

    struts2 存储过程

    在MySQL、Oracle、SQL Server等数据库中编写存储过程。例如,一个简单的存储过程可能是用于增删改查操作的。 3. **数据访问层(DAO)**: 在Struts2中,通常会创建一个DAO(数据访问对象)类来处理与数据库的交互...

    ibatis分页

    在压缩包子文件的文件名"execution"可能是iBATIS执行器的相关内容,执行器是iBATIS的核心部分,负责解析SQL映射文件,生成相应的PreparedStatement对象,并执行SQL语句。在分页场景下,执行器需要处理如何正确地拼接...

    ibatisnet連接sql server 2008連接方法

    IbatisNet还支持存储过程的调用,动态SQL,事务管理等高级功能。在实际开发中,你可以根据需求进行选择和配置,实现高效、灵活的数据访问。 综上所述,IbatisNet连接SQL Server 2008的过程包括配置SqlMapConfig.xml...

    asp.net MVC和IBatis.net整合demo数据库部分

    3. 实现数据访问层(DAL):创建接口和实现,接口定义数据库操作方法,实现则利用Ibatis的SqlMapClient执行SQL。 4. 控制器(Controller)操作:在MVC控制器中,通过依赖注入或直接实例化数据访问层对象,调用相关...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL的存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久层框架,它允许开发者编写SQL语句,并与Java对象进行...

Global site tag (gtag.js) - Google Analytics