目录
1.存储过程参数
2.IN,OUT,IN OUT演示
3.游标
总结
存储过程:它是数据库预先编译好的一个sql,可以重复调用,无需二次编译,如果不太清楚可以试着理解为在Java中写的一个方法。
1.存储过程参数
存储过程定义了三个参数:
- IN:输入参数,即外界传入的参数
- OUT:输出参数,即经过计算返回的参数
- INOUT:输入输出参数,即外界传入的参数,经过计算又返回的参数
2.IN,OUT,IN OUT演示
这里使用Oracle数据库进行编写存储过程
假如我们要求输入一个名字查询条数和目前时间,根据输入id返回其note
2.1创建储存过程
create or replace procedure count_role(p_role_name in varchar,count_totai out int,
p_id IN OUT varchar,exec_date out date) is
begin
select count(*) into count_totai from t_role where role_name like '%'||p_role_name||'%';
select a.note into p_id from t_role a where a.id like '%'||p_id||'%';
select sysdate into exec_date from dual;
end count_role;
2.2创建POJO
@Data
public class PdCountRoleParams {
private String roleName;
private int total;
private String p_id;
private Date execDate;
}
2.3创建Mapper接口
public interface PdRoleMapper {
public void countRole(PdCountRoleParams pdCountRoleParams);
public void findRole(PdFindRoleParams pdFindRoleParams);
}
2.4创建Mapper.xml文件
<select id="countRole" parameterType="mybatis04.param.PdCountRoleParams"
statementType="CALLABLE">
{call count_role(
#{roleName, mode=IN, jdbcType=VARCHAR},
#{total, mode=OUT, jdbcType=INTEGER},
#{p_id, mode=INOUT, jdbcType=VARCHAR},
#{execDate, mode=OUT, jdbcType=DATE}
)}
</select>
指定statemetType为CALLABLE,声明调用储存过程
call是调用储存过程,mode需要指定类型,传入参数时需声明是输出还是输出或者输入输出以及jdbc类型,注意大写
返回值为PdCountRoleParams对象
2.5测试
//测试存储过程
public static void testPdCountRole(){
Logger logger=Logger.getLogger(Mybatis04Test.class);
PdCountRoleParams params=new PdCountRoleParams();
SqlSession sqlSession=null;
sqlSession=SqlSessionFactoryUtils.openSqlSession();
PdRoleMapper roleMapper=sqlSession.getMapper(PdRoleMapper.class);
params.setRoleName("109");
params.setP_id("2");
roleMapper.countRole(params);
logger.debug(params);
logger.debug("返回"+params.getTotal());
logger.debug("返回"+params.getRoleName());
}
在执行之前先看下表内数据
执行查看日志
从日志中可以看到输出的是我们想要的结果,证明执行没有问题,需要注意的是输入输出参数如果为null和select into 返回多条都会报错,
3.游标
除了输入输出参数之外,Mybatis同样支持使用游标,只需要将jdbc设置为CURSOR类型,就会使用ResultSet来处理,我们只需要在xml文件映射即可
游标是被查询语句查询出来的结果集,如数据量大会消耗大量内存资源 ,使用需注意
我们假设根据角色名来模糊查询并进行分页,我们需要start和end参数,为了知道有没有下一页所以需要知道总数
3.1创建使用游标的储存过程
create or replace procedure find_role(p_role_name in varchar,p_statr in varchar,p_end in varchar,r_count out int,ref_cur out sys_refcursor) is
begin
select count(*) into r_count from t_role where role_name like '%'||p_role_name||'%';
open ref_cur for
select id,role_name,note from
(select id,role_name,note,rownum as row1 from t_role where role_name like '%'||p_role_name||'%' and rownum>p_statr and rownum<=p_end)
where row1>p_statr;
end find_role;
ref_cur为游标参数
3.2创建POJO
@Data
public class PdFindRoleParams {
private String roleName;
private int start;
private int end;
private int total;
private List<Role> roleList;
}
3.3创建xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN"
"http://mybatis/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis04.mapper.PdRoleMapper">
<resultMap type="role" id="roleMap">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
<result property="note" column="note" />
</resultMap>
<select id="countRole" parameterType="mybatis04.param.PdCountRoleParams"
statementType="CALLABLE">
{call count_role(
#{roleName, mode=IN, jdbcType=VARCHAR},
#{total, mode=OUT, jdbcType=INTEGER},
#{p_id, mode=INOUT, jdbcType=VARCHAR},
#{execDate, mode=OUT, jdbcType=DATE}
)}
</select><!--这是演示输入输出的xml-->
<select id="findRole" parameterType="mybatis04.param.PdFindRoleParams"
statementType="CALLABLE">
{call find_role(
#{roleName, mode=IN, jdbcType=VARCHAR},
#{start, mode=IN,jdbcType=INTEGER},
#{end, mode=IN, jdbcType=INTEGER},
#{total, mode=OUT,jdbcType=INTEGER},
#{roleList,mode=OUT,jdbcType=CURSOR,
javaType=ResultSet,resultMap=roleMap}
)}
</select>
</mapper>
CURSOR需要ResultSet来处理,并使用resultMap映射到roleMap上,
3.4测试
//在存储过程中使用游标
public static void PdFindRoleParams(){
Logger logger=Logger.getLogger(Mybatis04Test.class);
PdFindRoleParams params=new PdFindRoleParams();
SqlSession sqlSession=null;
sqlSession=SqlSessionFactoryUtils.openSqlSession();
PdRoleMapper roleMapper=sqlSession.getMapper(PdRoleMapper.class);
params.setRoleName("name");
params.setStart(0);
params.setEnd(100);
roleMapper.findRole(params);
logger.debug(params);
logger.debug("返回"+params.getTotal());
logger.debug("返回"+params.getRoleList().size());
}
查看日志
总结:
java调用储存过程主要xml文件的配置
更多推荐
Java使用Mybatis调用存储过程以及简单使用游标—重点都在XML文件中
发布评论