目录

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文件中