MyBatis如何调用存储过程与存储函数
程序员文章站
2022-03-04 10:32:33
目录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调用该存储过程。
(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提供的<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(); }
执行结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 从小我妈说我对巧克力严重过敏
下一篇: Linux里LVM磁盘扩容详细步骤