Sybase·调用存储过程并返回结果
最近项目要用Sybase数据库实现分页,第一次使用Sybase数据库,也是第一次使用他的存储过程。2个多小时才调用成功,在此记录:
项目架构:SSM
1、Sybase本身不支持分页操作,需要写存储过程来调用,这是很坑的。存储过程的内容暂且放下,
存储过程名:query_xxx_record_detail
输入输出参数如下:9个输入,5个输出
--input @terminal_no varchar(16), @account_no varchar(16), @begin_time char(14), @end_time char(14), @query_type varchar(1), ---0:query all 1:paging @count_per_page Integer = 10, @start_page_num Integer = 1, @page_count Integer = 1, @timestamp char(19), --output @total_pages integer output, @total_records varchar(8) output, @total_amount varchar(14) output, @return_code char(4) output, @error_msg varchar(255) output as
2、在业务层整理参数:
注意:在使用map携带参数时,只需要传入input参数。。9个
Map<String,Object> queryMap = new HashMap<String, Object>(); //调用存储过程: queryMap.put("terminal_no",terminalNo); queryMap.put("account_no", accountNo); queryMap.put("begin_time", beginTime); queryMap.put("end_time", endTime); queryMap.put("query_type", type); queryMap.put("count_per_page", pageRecordCountNo); queryMap.put("start_page_num", beginPageNo); queryMap.put("page_count",pageCountNo);
//使用list得到返回值,是存储过程中的sql决定的。这个跟其他的select一样可以封装
List<MposRecord> queryResult = mapper.queryPospMposRecordDetail(queryMap);
3、在mapper中方法:
/** * 调用存储过程返回分页结果 * @param queryMap * @return */ List<MposRecord> queryPospMposRecordDetail(Map<String, Object> queryMap);
4、在xml文件中:
<select id="queryPospMposRecordDetail" statementType="CALLABLE" parameterMap="queryDetailMap" resultType="java.util.Map"> <![CDATA[{call query_xxx_record_detail (?,?,?,?,?,?,?,?,?, ?,?,?,?)}]]> </select> <parameterMap type="java.util.Map" id="queryDetailMap"> <parameter property="terminal_no" mode="IN" jdbcType="VARCHAR"/> <parameter property="account_no" mode="IN" jdbcType="VARCHAR"/> <parameter property="begin_time" mode="IN" jdbcType="CHAR"/> <parameter property="end_time" mode="IN" jdbcType="CHAR"/> <parameter property="query_type" mode="IN" jdbcType="VARCHAR"/> <parameter property="count_per_page" mode="IN" jdbcType="INTEGER"/> <parameter property="start_page_num" mode="IN" jdbcType="INTEGER"/> <parameter property="page_count" mode="IN" jdbcType="INTEGER"/> <parameter property="total_pages" mode="OUT" jdbcType="INTEGER"/> <parameter property="total_records" mode="OUT" jdbcType="VARCHAR"/> <parameter property="total_amount" mode="OUT" jdbcType="VARCHAR"/> <parameter property="return_code" mode="OUT" jdbcType="CHAR"/> <parameter property="error_msg" mode="OUT" jdbcType="VARCHAR"/> </parameterMap> <parameter property="total_pages" mode="OUT" jdbcType="INTEGER"/> <parameter property="total_records" mode="OUT" jdbcType="VARCHAR"/> <parameter property="total_amount" mode="OUT" jdbcType="VARCHAR"/> <parameter property="return_code" mode="OUT" jdbcType="CHAR"/> <parameter property="error_msg" mode="OUT" jdbcType="VARCHAR"/> </parameterMap>
注意:
1.statementType="CALLABLE"
2.占位符:9个传入参数,5个返回参数都需要占位符
3.参数列表:传入参数和返回参数:用mode属性分开。
总结:调用存储过程基本没啥区别,包括返回值跟其他select语句也基本一致,可以返回用来封装的bean或者list,可以返回string或者map。这是在写xml文件的时候要注意有些不一样的。
主要还是最后的xml文件写法,跟一般的数据库sql语句很像
凡你能说的,你说清楚。凡你不能说的,留给沉默!