求助大神 mybatis 使用Mysql 的存储过程 怎么返回多个结果集
int i ok了。= 0;如果对select
mybatis调用存储过程 mybatis调用存储过程变慢
mybatis调用存储过程 mybatis调用存储过程变慢
返回的结果行都需要处理,使用游标。
如果public Object getResult(CallableStatement cs, int arg1)throws SQLException {只想取得返回多行中的一行,使用limit。
mybatis 连oracle 为什么返回了row
// 此处是excel y方向数据比如统计一个单位不同职务级别女人数量、少数民族数量、30岁以上人员数量,40以上人员数量等。如:
:0 0 0 1
中层:2 2 3 8
职员:20 40 80 200
刚开始想办法拼成了一个超级长的sql来做,但是长度超过vachar2的长度了,虽然有其他办法解决,虽然sql看起来很美好,但是想想后期的优化和维护,还是决定重新来规划。中间的过程就不说了,最终确定先定义一行数据存number型object(类似一维数组),形式如(0,0,1)。然后放到二维数组里。闲言少叙,如下定义:
[html] view plain copy 在CODE上查看代码片派生到我的代码片create or replace
TYPE C_ROW IS OBJECT(
COUNT_SEX NUMBER, --性别女统计
COUNT_NATION NUMBER, --少数民族统计
COUNT_30AGE NUMBER --30岁统计
);
[html] view plain copy 在CODE上查看代码片派生到我的代码片create or replace
TYPE C_ROW_CLM IS TABLE OF C_ROW;
一个简单的存储过程如下:就是往二维数组放了三列。
[html] view plain copy 在CODE上查看代码片派生到我的代码片PROCEDURE COUNT_TEST(C_VALUE OU每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。T C_ROW_CLM) ASBEGIN
--初始化二维数组,存放格式如:(0,1,2,3),(0,0,2,3)C_VALUE:=C_ROW_CLM();
C_VALUE(1) := C_ROW(0,0,0);
C_VALUE(2) := C_ROW(1,2,3);
C_VALUE(3) := C_ROW(7,8,9);
以上存储过程生成而为数据已经有了,我们有一个out输出。现在就看mybatis如何实现了。
目前能查到的文章大部分是关于Ja如何自定义类型到数据库的举例,文档也是,找到一篇文章很不容易,不过最终还是找到了。现在回头看很简单,由于我们自己定义的二维数组ja不认识,需要我们自定义类型做数据转换,mybatis提供了TypeHandler接口,只要实现它就可以。里面有几个方法,例子主要介绍了setParameter、getResult(ResultSet arg0, int arg1)两个方法,这两个方法共同完成的是ja对数据库的作以及数据类型转换,而我们的存储过程调用是不用他们的,我们用的是getResult(CallableStatement cs, int arg1)这个方法,在这里实现数据类型转换即可。具体事例如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片package com.broadengate.handler;
import ja.sql.CallableStatement;
import ja.sql.PreparedStatement;
import ja.sql.ResultSet;
import ja.sql.SQLException;
import ja.util.ArrayList;
import ja.util.List;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import org.apache.ibatis.type.JdbcType;
/
自定义Handler
}public Object getResult(ResultSet arg0, int arg1) throws SQLException {// TODO Auto-generated mod stub
}/
调用存储过程实现该方法即可。
@param cs 返回结果
@param arg1 返回索引
String names[] ={"","中层","职员"};// 遍历y方向数据
List< XXDTO > dtos = new ArrayList< XXDTO >();ResultSet rs = cs.getArray(arg1).getResultSet();while (rs.next()) {
// key_value赋值
dto.setDataValue(names[i]);
i ++;
// 以下作取得数据库中数据值赋给相应的3、基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。bean。
dto.setSex(data[0].intValue());
dto.setDegreeCodeDoctor(data[2].intValue());// 获得list
dtos.add(dto);
}return dtos;
}public void setParameter(PreparedStatement ps, int arg1, Object arg2,JdbcType arg3) throws SQLException {
}}
[html] view plain copy 在CODE上查看代码片派生到我的代码片package com.xx.bean;
public class CountRefMgrPerson extends BaseBean {private Integer id;// null
private String dataValue;// 纵列数值( {"","中层","职员"};等值 )private Integer countNation;// 民族(少数民族)数量private Integer countSex;// 性别(女)数量[html] view plain copy 在CODE上查看代码片派生到我的代码片
private Integer count30;// age数量get、set方法略}
这样我们就完成了数据转换的作,剩下的工作就是配置mybatis了。为了找到这个方法,憋屈了一天,国内几乎没啥资料,老外的帖子也几乎翻遍了,后来终于在一个老外的回复中找到了。不啰嗦了,直接上:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
[html] view plain copy 在CODE上查看代码片派生到我的代码片
{call TEST.COUNT_TEST(
相信上面的配置,用mybatis的人都知道,这里我只强调两点,一是typeHandler=com.xx.handler.CRMPTypeHandler需要指定我们自己的自定义类型,而是必须加jdbcTypeName,这个name坑爹啊,让我找了很长时间,其实就是我们out的那个类型C_ROW_CLM。值得一提的是,不要把一维数组和二维数组定义在包体内,调用存储过程是找不到的。
对了顺便放一下,我接受out参数的类。
[html] view plain copy 在CODE上查看代码片派生到我的代码片import ja.util.List;
import com.xx.bean.XXDTO;
public class XXModel {
private List< XXDTO > result; // 调用存储过程返回的结果集public List< XXDTO > getResult() {
return result;
}}
类里的result与mybatis配置里的返回结果result对应。
mybatis pageer 怎么求出总页数
re/turn null;PageHelper是MyBatis的分页查询的插件;他与使用的页面无关,只要你在调用分页查询语句之前调用相应的方法,即可实现分页查询功能;如//获取第1页,20条内容PageHelper.startPage(1,20)
public class CRMPTypeHandler implements TypeHandler