ibatis中配置存储过程,Java中用SqlMapClient调用什么方法得到结果集和返回参数

时间:2022-07-30 15:45:40
写了个sql2005的分页存储过程,返回结果集和记录总数
我的ibatis存储过程配置如下:
<parameterMap class="map" id="marketParameter">
      <parameter property="selectList" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
      <parameter property="tableName" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
      <parameter property="searchCondition" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
      <parameter property="orderBy" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
      <parameter property="pageIndex" javaType="java.lang.Integer" jdbcType="INT" mode="IN"/>
      <parameter property="pageSize" javaType="java.lang.Integer" jdbcType="INT" mode="IN"/>
      <parameter property="totalCount" javaType="java.lang.Integer" jdbcType="INT" mode="OUT"/>
    </parameterMap>
   <procedure id="selectAllProgram" parameterMap="marketParameter">
      <![CDATA[{call dbo.sp_GetPageRecord(?,?,?,?,?,?,?)}]]>
   </procedure>

我在JAVA中调用这个存储过程,我想正确的得到结果集和输出参数,我的java代码如下:
Map map = new HashMap();
String total = null;
map.put("selectList", null);
map.put("tableName", "m_program");
map.put("searchCondition", null);
map.put("orderBy", "id");
map.put("pageIndex", pageIndex);
map.put("pageSize", pageSize);
map.put("totalCount", total);
  try {
  System.out.println("*****========*****");
  proList = (ArrayList<MarketPro>) sqlMapClient.queryForList("selectAllProgram",map);
  total = (String)map.get("totalCount");
  System.out.println("**=====**"+total);
} catch (SQLException e) {
e.printStackTrace();
}

我的Java代码这样写了,但是运行时候报错
我的存储过程代码如下:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[sp_GetPageRecord] 
-- Add the parameters for the stored procedure here
@SelectList varchar(2000),--查询的字段列表
@TableName  varchar(100),--查询的表名或者视图名
@SearchCondition varchar(2000), --查询条件
@OrderCondition varchar(1000), --排序条件
@PageIndex int=1,  --页号从0开始
@PageSize int=50,  --每页显示数量
@RecordCount int output  --表的记录总数

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
IF @SelectList IS NULL OR LTRIM(RTRIM(@SelectList))=''
    BEGIN
        SET @SelectList = '*'
    END
    PRINT @SelectList

    SET @SearchCondition = ISNULL(@SearchCondition,'')
    SET @SearchCondition = LTRIM(RTRIM(@SearchCondition))
    IF @SearchCondition <> ''
    BEGIN
        IF UPPER(SUBSTRING(@SearchCondition,1,5)) <> 'WHERE'
        BEGIN
            SET @SearchCondition = 'WHERE ' + @SearchCondition
        END
    END
    PRINT @SearchCondition
    
    SET @OrderCondition = ISNULL(@OrderCondition,'')
    SET @OrderCondition = LTRIM(RTRIM(@OrderCondition))
    IF  @OrderCondition <> ''
    BEGIN
        IF UPPER(SUBSTRING(@OrderCondition,1,5)) <> 'WHERE'
        BEGIN
            SET @OrderCondition = 'ORDER BY ' + @OrderCondition
        END
    END
    PRINT @OrderCondition
    
    IF @PageIndex IS NULL OR @PageIndex < 1
    BEGIN
        SET @PageIndex = 0
    END
    PRINT @PageIndex
    IF @PageSize IS NULL OR @PageSize < 1
    BEGIN
        SET @PageSize = 50
    END
    PRINT  @PageSize

    DECLARE @SqlQuery varchar(4000)
    -- Insert statements for procedure here
    SET @SqlQuery='SELECT '+@SelectList+' 
    FROM 
    (SELECT ' + @SelectList + ',ROW_NUMBER() OVER( '+ @OrderCondition +') AS RowNumber 
    FROM '+@TableName+' '+ @SearchCondition +') AS RowNumberTableName 
    WHERE RowNumber BETWEEN ' + CAST((@PageIndex+1) AS VARCHAR) 
    + ' AND ' + CAST ((@PageIndex + @PageSize) AS VARCHAR) 
    PRINT @SqlQuery
    SET NOCOUNT ON
    EXECUTE(@SqlQuery)
    SET @RecordCount=@@ROWCOUNT
    select @RecordCount as TotalCount
    SET NOCOUNT OFF 
    END





7 个解决方案

#1


用ibatis的人很少啊,没人帮我解决嘛!!!

#2


<parameter property="totalCount" javaType="java.lang.Integer" jdbcType="INT" mode="OUT"/>
String total = null;
total = (String)map.get("totalCount");
@RecordCount int output  --表的记录总数

没有看到错误信息。。。猜猜。。。你传入的是String,返回的是int...

#3


String total = null;

 map.put("totalCount", total);

@RecordCount int output  --表的记录总数

就是这里的问题,castexception

你把map.get("totalCount")拿出对象看看,应该不是string对象。

#4


proList = (ArrayList<MarketPro>) sqlMapClient. queryForList("selectAllProgram",map);
这里好像有问题,把标红的改成insert或者update试试看。

#5


帮顶。
我也遇到同样的问题

#6


终于搞定了,楼主试试以下的:


<procedure id="selectAllProgram" parameterMap="marketParameter" resultMap="xxxxx">
      <![CDATA[{call dbo.sp_GetPageRecord(?,?,?,?,?,?,?)}]]>
</procedure>

#7



<procedure id="selectAllProgram" parameterMap="marketParameter" resultMap="xxxxx">
      <![CDATA[{call dbo.sp_GetPageRecord(?,?,?,?,?,?,?)}]]>
</procedure>

#1


用ibatis的人很少啊,没人帮我解决嘛!!!

#2


<parameter property="totalCount" javaType="java.lang.Integer" jdbcType="INT" mode="OUT"/>
String total = null;
total = (String)map.get("totalCount");
@RecordCount int output  --表的记录总数

没有看到错误信息。。。猜猜。。。你传入的是String,返回的是int...

#3


String total = null;

 map.put("totalCount", total);

@RecordCount int output  --表的记录总数

就是这里的问题,castexception

你把map.get("totalCount")拿出对象看看,应该不是string对象。

#4


proList = (ArrayList<MarketPro>) sqlMapClient. queryForList("selectAllProgram",map);
这里好像有问题,把标红的改成insert或者update试试看。

#5


帮顶。
我也遇到同样的问题

#6


终于搞定了,楼主试试以下的:


<procedure id="selectAllProgram" parameterMap="marketParameter" resultMap="xxxxx">
      <![CDATA[{call dbo.sp_GetPageRecord(?,?,?,?,?,?,?)}]]>
</procedure>

#7



<procedure id="selectAllProgram" parameterMap="marketParameter" resultMap="xxxxx">
      <![CDATA[{call dbo.sp_GetPageRecord(?,?,?,?,?,?,?)}]]>
</procedure>