问题如下:
    当我的ibatis调用了存储过程以后,程序运行了此存储过程,也同样返回了id值,但是,实际情况是:数据库内并没有生成词条记录,但是,在数据库中执行此sql时候,没有问题,但是,程序中的那个id号则已经跳过了。
首先是配置的xml <resultMap class="server.dbTO.UserTable" id="result">
<result property="id"  column="iId" />
</resultMap>
<procedure id="registerUser" parameterClass="server.dbTO.UserTable" resultMap="result" >
exec getId @iId=null,@name=#username#,@pass=#password#
</procedure>
接着是java代码:package test;
import server.IbatisDAO;
import server.dbTO.UserTable;
public class test {
public static void main(String []args){
UserTable table=new UserTable();
IbatisDAO dao=new IbatisDAO();
table.setUsername("ibatistest");
table.setPassword("123123");
UserTable result=dao.insert(table);
System.out.println("得到的结果: "+result.getId());
}
}
public UserTable insert(UserTable p){//作注册帐号
UserTable table=null;
try {
Reader reader= Resources.getResourceAsReader("server/SqlMapConfig.xml");
SqlMapClient sqlmap=SqlMapClientBuilder.buildSqlMapClient(reader);
table=(UserTable)sqlmap.queryForObject("Contact.registerUser",p);
System.out.println(table.getId()+"id");
return table;

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return table;
}最后是sql的存储过程
USE [graduatedesign]
GO
/****** Object:  StoredProcedure [dbo].[getId]    Script Date: 05/13/2012 14:11:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getId] 
@iID int out  ,@name varchar(40),@pass varchar(40)
AS
insert into usertable (username,password) values(@name,@pass)
/*Select SCOPE_IDENTITY() as iId*/
set @iID = SCOPE_IDENTITY() 
select @iID as iId
return
程序运行结果如下(我用p6spy全程跟踪数据库执行的句子):01:20:41,077|1|0|rollback||
01:20:41,589|347|0|statement|exec getId @iId=null,@name=?,@pass=?|exec getId @iId=null,@name='ibatistest',@pass='123123'
01:20:41,671|-1||resultset|exec getId @iId=null,@name='ibatistest',@pass='123123'|iId = 31
01:20:41,686|12|0|rollback||
31id
得到的结果: 31
实际数据库中的记录如下:27 tewst 123123 NULL NULL
28 ibatistest 123123 NULL NULL
29 ibatistest 123123 NULL NULL
32 mytest 123123 NULL NULL

解决方案 »

  1.   

    01:20:41,671|-1||resultset|exec getId @iId=null,@name='ibatistest',@pass='123123'|iId = 31
    01:20:41,686|12|0|rollback||LZ 没有看到吗?rollback说明没有执行成功。
      

  2.   

    但是这句 exec getId @iId=null,@name=#username#,@pass=#password#在数据库中执行的时候,没有出现问题,说明这个应该不是sql的问题,觉得应该是ibatis中操作的句子有问题但具体哪里出问题不知道
      

  3.   

    但是这句 exec getId @iId=null,@name=#username#,@pass=#password#在数据库中执行的时候,没有出现问题,说明这个应该不是sql的问题,觉得应该是ibatis中操作的句子有问题但具体哪里出问题不知道
      

  4.   

    我升级了Mybatis的,应该是: <parameterMap id="getIdParam" type="java.util.Map">
             <parameter property="iId
    " jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
             <parameter property="username" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
            <parameter property="password" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>           
    </parameterMap>然后
     <procedure id="registerUser" parameterMap="getIdParam"  statementType="CALLABLE" >
            {call getId (?,?,?)}
        </procedure>ibatis可能稍有不同
      

  5.   

    存储过程应该没问题,当我用:
    table=(UserTable)sqlmap.queryForObject("Contact.registerUser",p);
    时,有返回的id,但是数据库中没有插入值,当我用:
    table=(UserTable)sqlmap.insert("Contact.registerUser",p);
    数据库中值被插入,但是无返回id,控制台报错。
      

  6.   

    这种做法是将其映射成map返回,而我的做法是直接映射成映射类返回。需求不同,还有call getId (?,?,?)这个应该是mysql的写法还是oralce的写法?我用的是sqlserver。