欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis如何调用存储过程与存储函数

程序员文章站 2022-06-18 16:45:31
目录1、mybatis调用存储过程2、mybatis调用存储函数1、mybatis调用存储过程mybatis支持使用存储过程的配置。当使用存储过程时,需要设置一个参数“mode”,其值有in(输入参数...

1、mybatis调用存储过程

mybatis支持使用存储过程的配置。当使用存储过程时,需要设置一个参数“mode”,其值有in(输入参数)、out(输出参数)和inout(输入/输出参数)。

mybatis定义存储过程如下:

<!-- 存储过程 -->
<select id="selectsomething" statementtype="callable" parametertype="hashmap" resulttype="com.pjb.mybatis.po.user">
    {call proc_for_input(#{information,mode=in,jdbctype=varchar})}
</select>

【示例】创建存储过程,实现分页查询用户列表,并返回数据总数和总页数,通过mybatis调用该存储过程。

(1)在mysql数据库中创建用户信息表(tb_user)。

-- 创建“用户信息”数据表
create table if not exists tb_user
( 
	id int auto_increment primary key comment '用户编号',
	user_name varchar(50) not null comment '用户姓名',
	sex char(2) default '男' comment '性别'
) comment = '用户信息表';

(2)创建存储过程,实现分页查询用户列表,并返回数据总数和总页数。

-- 将结束标志符更改为$$
delimiter $$
 
/*
  -- 存储过程:分页查询用户列表,并返回数据总数和总页数
  -- 输入参数:page_index:当前页码
  -- 输入参数:page_size:分页大小
  -- 输出参数:total_count:数据总数
  -- 输出参数:total_page:总页数
*/
create procedure proc_search_user(in page_index int,in page_size int, out total_count int, out total_page int)
begin
	declare begin_no int;
	set begin_no = (page_index-1)*page_size;
 
	-- 分页查询列表
	select * from tb_user
	where id >= (
		select id from tb_user
		order by id asc
		limit begin_no,1
	)
	order by id asc
	limit page_size;
 
	-- 计算数据总数
	select count(1) into total_count from tb_user;
 
	-- 计算总页数
	set total_page = floor((total_count + page_size - 1) / page_size);
end$$
 
-- 将结束标志符更改回分号
delimiter ;

(3)创建用户信息持久化类(user.java)。

package com.pjb.mybatis.po;
 
/**
 * 用户信息的持久化类
 * @author pan_junbiao
 **/
public class user
{
    private int id; //用户编号
    private string username; //用户姓名
    private string sex; //性别
 
    //省略getter与setter方法...
}

(4)编写sql映射配置。

<!-- 存储过程:分页查询用户列表,并返回数据总数和总页数 -->
<select id="proc_search_user" statementtype="callable" parametertype="hashmap" resulttype="com.pjb.mybatis.po.user">
    {call proc_search_user(#{page_index,mode=in,jdbctype=integer},
      #{page_size,mode=in,jdbctype=integer},
      #{total_count,mode=out,jdbctype=integer},
      #{total_page,mode=out,jdbctype=integer})}
</select>

(5)编写执行方法。

/**
 * 使用mybatis调用存储过程:分页查询用户列表,并返回数据总数和总页数
 * @author pan_junbiao
 */
@test
public void procsearchuser()
{
    dataconnection dataconnection = new dataconnection();
    sqlsession sqlsession = dataconnection.getsqlsession();
    //封装查询参数
    map params = new hashmap();
    params.put("page_index",2);  //输入参数:当前页码
    params.put("page_size",10);  //输入参数:分页大小
    params.put("total_count",0); //输出参数:数据总数
    params.put("total_page",0);  //输出参数:总页数
    //调用存储过程
    list<user> userlist = sqlsession.selectlist("test.proc_search_user",params);
    system.out.println("查询第"+ params.get("page_index") +"页的数据,每页共"+params.get("page_size")+"条数据");
    //遍历用户列表
    for (user user : userlist)
    {
        system.out.println("编号:" + user.getid() +" 姓名:" + user.getusername() + " 性别:" + user.getsex());
    }
    //获取输出参数
    system.out.println("数据总数:" + params.get("total_count"));
    system.out.println("总页数:" + params.get("total_page"));
    sqlsession.close();
}

执行结果:

MyBatis如何调用存储过程与存储函数

【示例】创建存储过程,实现新增用户信息,并返回自增主键,通过mybatis调用该存储过程。

(1)创建存储过程。

-- 将结束标志符更改为$$
delimiter $$
 
/*
  -- 存储过程:新增用户信息,返回自增主键
  -- 输入参数:user_name:用户姓名
  -- 输入参数:sex:性别
  -- 输出参数:user_id:自增主键
*/
create procedure proc_add_user(in user_name varchar(50),in sex char(2), out user_id int)
begin
	-- 新增用户
	insert into tb_user(user_name,sex) value (user_name,sex);
	
	-- 获取自增主键
	select last_insert_id() into user_id;
end$$
 
-- 将结束标志符更改回分号
delimiter ;

(2)编写sql映射配置。

<!-- 存储过程:新增用户信息,返回自增主键 -->
<insert id="proc_add_user" statementtype="callable" parametertype="com.pjb.mybatis.po.user">
  {call proc_add_user(#{username,mode=in,jdbctype=varchar},
    #{sex,mode=in,jdbctype=char},
    #{id,mode=out,jdbctype=integer})}
</insert>

(3)编写执行方法。

/**
 * 使用mybatis调用存储过程:新增用户信息,返回自增主键
 * @author pan_junbiao
 */
@test
public void procadduser()
{
    dataconnection dataconnection = new dataconnection();
    sqlsession sqlsession = dataconnection.getsqlsession();
    //新增的用户对象
    user user = new user();
    user.setusername("pan_junbiao的博客");
    user.setsex("男");
    //调用存储过程执行新增
    int reuslt = sqlsession.insert("test.proc_add_user",user);
    sqlsession.commit();
    //打印结果
    system.out.println("执行结果:"+reuslt);
    system.out.println("自增主键:"+user.getid());
    sqlsession.close();
}

执行结果:

MyBatis如何调用存储过程与存储函数

其实,新增数据后,获取自增主键是可以使用mybatis提供的<selectkey>标签,sql映射配置如下:

<!-- 存储过程:新增用户信息,返回自增主键 -->
<insert id="proc_add_user" statementtype="callable" parametertype="com.pjb.mybatis.po.user">
  <selectkey keyproperty="id" order="after" resulttype="java.lang.integer">
      select last_insert_id()
  </selectkey>
  {call proc_add_user(#{username,mode=in,jdbctype=varchar},
    #{sex,mode=in,jdbctype=char})}
</insert>

但上述示例是为了能让该存储过程拥有一个返回的参数。

2、mybatis调用存储函数

【示例】创建存储函数,根据用户编号,获取用户名称,通过mybatis调用该存储函数。

(1)创建存储函数,根据用户编号,获取用户名称。

-- 将结束标志符更改为$$
delimiter $$
 
/*
  -- 存储函数:根据用户编号,获取用户名称
  -- 输入参数:in_id:用户编号
  -- 返回结果:用户名称
*/
create function func_get_user_name(in_id int)
returns varchar(50)
begin
	-- 定义返回变量
	declare out_name varchar(50);
 
	-- 查询用户信息,获取用户名称
	select user_name into out_name from tb_user where id = in_id;
 
	-- 返回结果
	return out_name;
end$$
 
-- 将结束标志符更改回分号
delimiter ;

(2)编写sql映射配置。

<!-- 存储函数:根据用户编号,获取用户名称 -->
<select id="func_get_user_name" statementtype="callable" parametertype="hashmap" >
    {#{username,mode=out,jdbctype=varchar} = call func_get_user_name(#{userid,mode=in,jdbctype=integer})}
</select>

(3)编写执行方法。

/**
 * 使用mybatis调用存储函数:根据用户编号,获取用户名称
 * @author pan_junbiao
 */
@test
public void funcgetusername()
{
    dataconnection dataconnection = new dataconnection();
    sqlsession sqlsession = dataconnection.getsqlsession();
    //封装参数
    map usermap = new hashmap();
    usermap.put("username","");
    usermap.put("userid",8);
    sqlsession.selectone("test.func_get_user_name",usermap);
    system.out.println("用户名称:" + usermap.get("username"));
    sqlsession.close();
}

执行结果:

MyBatis如何调用存储过程与存储函数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。