ibatis sql 서버 저장 프로세스 실행

8535 단어 jdbcibatis

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에서 스토리지 프로세스를 실행하는 방법 1:
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();

문제 없습니다.registerOutParameter(8,java.sql.Types.INTEGER);
콜로 변경.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에서 저장 프로세스를 실행하는 방법 2:
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));

콜을 설정하면registerOutParameter(1,-99999);콜을 추가합니다.setObject(1, 1);정확하게 집행할 수 있다.
Ibatis 는 스토리지 프로세스 1 을 수행합니다.
구성 파일:
    <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>


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 자바 코드에call을 설정합니다.registerOutParameter(1,-99999);나중에 틀린 대로.
Ibatis 는 스토리지 프로시저 2 를 수행합니다.
    <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>

현재 jdbcType="int"mode="INOUT"/>
jdbcType = "int"mode = "INOUT"를 통과할 수 있지만, 전제는 들어오는 대상인NormalUser의userId 속성을 비울 수 없다는 것입니다.
위 jdbc 자바 코드에call을 설정하는 것을 연상합니다.registerOutParameter(1,-99999);다음에 코드콜이 추가되었습니다.setObject(1, 1);
인용하다
ibatis parameterMap의 하위 요소 parameter의 속성 jdbcType은 이 속성(property)에 값을 부여하는 데이터베이스 필드의 데이터 형식을 명시적으로 지정하는 데 사용됩니다.
특정 작업의 경우 필드의 데이터 유형을 지정하지 않으면 일부 JDBC 드라이브에서 필드의 데이터 유형을 인식할 수 없습니다.좋은 예는요.
PreparedStatement.setNull (int parameterIndex, int sqlType) 방법으로 데이터 형식을 지정해야 합니다.데이터 형식을 지정하지 않으면,
일부 드라이브는 Types로 지정될 수 있습니다.Other 또는 Types.Null.하지만 모든 드라이브가 일치한다는 보장은 없다.이런 상황에 대해
SQL Map API에서는 parameterMap 하위 요소인 parameter의 jdbcType 속성을 사용하여 데이터 유형을 지정할 수 있습니다.
일반적으로 필드가 NULL일 수 있는 경우에만 jdbcType 속성이 필요합니다.또 다른 jdbcType 속성을 지정해야 하는 경우는 필드 형식이 날짜, 시간 형식인 경우입니다.
자바에는 Date 형식 (자바.util.Date) 이 하나뿐이고, 대부분의 SQL 데이터베이스는 적어도 세 가지가 있기 때문이다.그래서
필드 유형이 DATE인지 DATETIME인지 지정해야 합니다.속성 jdbcType은 JDBC Types 클래스에 정의된 매개 변수의 문자열 값일 수 있습니다.
그래도 일부 유형은 지원되지 않습니다(BLOB).이 절의 뒷부분은 구조가 지원하는 데이터 유형을 설명할 것이다.
주의!대부분의 JDBC 드라이브는 필드가 NULL일 때만 jdbcType 속성을 지정해야 합니다.따라서 이러한 드라이브의 경우
type 속성은 필드가 NULL일 수 있는 경우에만 지정해야 합니다.주의!Oracle Driver를 사용할 때 NULL의 필드에 jdbcType 속성을 지정하지 않으면
이러한 필드에 NULL 값을 지정하려고 하면 Invalid column type 오류가 발생합니다.
Ibatis parameterMap의 하위 요소 parameter의 속성 jdbcType에 대한 설명을 첨부합니다.
저는 식은 죽 먹기로 문필이 좋지 않으니 양해해 주십시오!

좋은 웹페이지 즐겨찾기