在网上找了很久的mybatis调用存储过程,并返回游标示例,例子很多,但是都描述不怎么清楚,通过多次探索,终于得出了得到完美的代码。希望对大家有一些帮助
存储过程示例:
create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_cursor out sys_refcursor) is
………………
---返回统计结果
open v_Cursor for
select s.plan_code,
s.plan_dept,
s.plan_amount,
s.exec_amount,
p.cname as plan_name,
d.cname as dept_name
from Snap_plan_checkprj s
left join v_plan p
on s.plan_code = p.plan_code
left join org_office d
on s.plan_dept = d.off_org_code
group by s.plan_code,
s.plan_dept,
s.plan_amount,
s.exec_amount,
p.cname,
d.cname;
end;
end Fsp_Plan_CheckPrj;
mybatis:(mybatis doc api: http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html#Result_Maps)
java层代码
Map<String, Object> params = new HashMap<String, Object>();
GrantSetting gs = this. grantSettingDao.get(grantCode);
params.put( "grantNo", StringUtils. substring(gs.getGrantNo(), 0, 2));
params.put( "offOrgCode", SecurityUtils.getPersonOffOrgCode());
params.put("v_cursor", new ArrayList<Map<String, Object>>());//传入一个jdbc游标,用于接收返回参数
this. batisDao. getSearchList("call_Fsp_Plan_CheckPrj", params);
return params;
mybatis xml配置
<resultMap type ="java.util.HashMap" id= "cursorMap"><!--配置返回游标中别名对应的resultMap -->
<result column ="plan_code" property="plan_code" />
<result column ="plan_dept" property="plan_dept" />
<result column ="plan_amount" property="plan_amount" />
<result column ="exec_amount" property="exec_amount" />
<result column ="plan_name" property="plan_name" />
<result column ="dept_name" property="dept_name" />
</resultMap >
<select id ="call_Fsp_Plan_CheckPrj" parameterType= "map" statementType="CALLABLE" >
<!--注明statementType="CALLABLE"表示调用存储过程-->
{call Fsp_Plan_CheckPrj(#{grantNo, jdbcType=VARCHAR, mode=IN},
#{offOrgCode, jdbcType=INTEGER, mode=IN},
#{v_cursor, mode=OUT, jdbcType=CURSOR, resultMap=cursorMap})}
<!--传入传出参数要注明mode=IN/OUT 并要注明jdbcType(在网上可以查询mybatis支持哪些jdbcType类型),返回参数要注明对应的resultMap-->
</select >
最后,在jsp页面只需遍历
params.put( "v_cursor", OracleTypes. CURSOR);中的v_cursor。本身就是一个可遍历的list结果集
hibernate
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Connection con = this.getSession().connection();
CallableStatement sp;
try {
sp = con.prepareCall("{call Fsp_Plan_CheckPrj(?,?,?)}");
sp.setString(1, ObjectUtils.toString(params.get("grantNo")));
sp.setLong(2, NumberUtils.toLong(ObjectUtils.toString(params.get("offOrgCode"))));
sp.registerOutParameter(3, OracleTypes.CURSOR);
sp.execute(); // 执行存储过程
ResultSet rs = (ResultSet) sp.getObject(3); // 获取返回的对象,再将对象转为记录集 3代表哪个参数
while (rs.next()) {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("plan_code", ObjectUtils.toString(rs.getObject(1)));
resultMap.put("plan_dept", ObjectUtils.toString(rs.getObject(2)));
resultMap.put("plan_amount", IrisStringUtils.FormatMoney(ObjectUtils.toString(rs.getObject(3))));
resultMap.put("exec_amount", IrisStringUtils.FormatMoney(ObjectUtils.toString(rs.getObject(4))));
resultMap.put("plan_name", ObjectUtils.toString(rs.getObject(5)));
resultMap.put("dept_name", ObjectUtils.toString(rs.getObject(6)));
list.add(resultMap);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
分享到:
相关推荐
- **CallableStatement**:对于存储过程或函数,可以使用`CallableStatement`,它允许调用数据库的存储过程并处理其输出参数。 - **PreparedStatement**:为了提高性能和防止SQL注入,通常推荐使用`...
Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种...在实际项目中,还可以使用连接池(如C3P0、HikariCP等)来提高性能和资源利用率,以及ORM框架(如Hibernate、MyBatis)来进一步简化数据库操作。
2. **CallableStatement**:用于调用存储过程,可以处理带有IN、OUT或IN/OUT参数的存储过程。 3. **连接池**:通过第三方库如C3P0、Apache DBCP或HikariCP实现,提高数据库连接的复用性和性能。 4. **结果集元数据...
3. **存储过程的调用**:如何在JDBC中执行存储过程并获取返回值。 4. **游标的使用**:理解不同类型的游标,如只读、可滚动和可更新游标。 5. **数据库连接的自动重连策略**:当数据库连接因网络问题中断时,如何...
在实际开发中,开发者通常会使用ORM(对象关系映射)框架如Hibernate或MyBatis,它们简化了JDBC的使用,提高了开发效率。然而,理解JDBC的基本原理和操作对于解决问题和优化代码仍然是至关重要的。提供的代码实例...
在实际应用中,我们通常会使用DataSource(数据源)来管理连接池,如Apache的Commons DBCP或C3P0,以及ORM框架如Hibernate和MyBatis,它们提供了更高级别的抽象和便利性,简化了JDBC的使用。 JDBC教程中还会涉及...
Java JDBC(Java Database Connectivity)是Java平台中用于与各种...此外,随着业务复杂度增加,你可能需要进一步学习ORM(Object-Relational Mapping)框架,如Hibernate或MyBatis,以减少手动SQL编写,提高开发效率。
- **T-SQL**:是SQL Server的扩展,提供丰富的编程功能,如存储过程、触发器、游标等。 - **安全性**:通过角色、权限、审计等功能,确保数据的安全访问。 - **备份与恢复**:支持完整备份、差异备份、日志备份...
同时,随着对JDBC的深入理解和经验积累,可以进一步探索更高级的主题,如连接池管理(如C3P0、HikariCP)、JNDI查找、JPA、Hibernate等ORM框架,以及Spring JDBC和MyBatis等工具的使用,提升数据库操作的效率和便捷...
- 虽然JDBC提供了基础的数据库访问能力,但在大型项目中,通常会使用ORM(Object-Relational Mapping)框架,如Hibernate,MyBatis,它们简化了数据库操作,提高了开发效率。 本教程可能涵盖了这些主题,并提供了...