mybatis支持使用存储过程的配置。当使用存储过程时,需要设置一个参数“mode”,其值有in(输入参数)、out(输出参数)和inout(输入/输出参数)。
mybatis定义存储过程如下:
<!-- 存储过程 --><lect id="lectsomething" statementtype="callable" parametertype="hashmap" resulttype="com.pjb.mybatis.po.ur"> {call proc_for_input(#{in英语语法口诀formation,mode=in,jdbctype=varchar})}</lect>
【示例】创建存储过程,实现分页查询用户列表,并返回数据总数和总页数,通过mybatis调用该存储过程。
(1)在mysql数据库中创建用户信息表(tb_ur)。
-- 创建“用户信息”数据表create table if not exists tb_ur( id int auto_increment primary key comment '用户编号',ur_name varchar(50) not null comment '用户姓名',x char(2) default '男' comment '性别') comment = '用户信息表';
(2)创建存储过程,实现分页查询用户列表,并返回数据总数和总页数。
-- 将结束标志符更改为$$delimiter $$ /* -- 存储过程:分页查询用户列表,并返回数据总数和总页数 -- 输入参数:page_index:当前页码 -- 输入参数:page_size:分页大小 -- 输出参数:total_count:数据总数 -- 输出参数:total_page:总页数*/create procedure proc_arch_ur(in page_index int,in page_size int, out total_count int, out total_page int)begindeclare begin_no int;t begin_no = (page_index-1)*page_size; -- 分页查询列表lect * from tb_urwhere id >= (lect id from tb_urorder by id asclimit begin_no,1)order by id asclimit page_size; -- 计算数据总数lect count(1) into total_count from tb_ur; -- 计算总页数t total_page = floor((total_count + page_size - 1) / page_size);end$$ -- 将结束标志符更改回分号delimiter ;
(3)创建用户信息持久化类(ur.java)。
package com.pjb.mybatis.po; /** * 用户信息的持久化类 * @author pan_junbiao **/public class ur{ private int id; //用户编号 private string urname; //用户姓名 private string x; //性别 //省略getter与tter方法...}
(4)编写sql映射配置。
<!-- 存储过程:分页查询用户列表,并返回数据总数和总页数 --><lect id="proc_arch_ur" statementtype="callable" parametertype="hashmap" resulttype="com.pjb.mybatis.po.ur"> {call proc_arch_ur(#{page_index,mode=in,jdbctype=integer}, #人物写真摄影{page_size,mode=in,jdbctype=integer}, #{total_count,mode=out,jdbctype=integer}, #{total_page,mode=out,jdbctype=integer})}</lect>
(5)编写执行方法。
/** * 使用mybatis调用存储过程:分页查询用户列表,并返为什么长斑回数据总数和总页数 * @author pan_junbiao */@testpublic void procarchur(){ dataconnection dataconnection = new dataconnection(); sqlssion sqlssion = dataconnection.getsqlssion(); //封装查询参数 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<ur> urlist = sqlssion.lectlist("test.proc_arch_ur",params); system.out.println("查询第"+ params.get("page_index") +"页的数据,每页共"+params.get("page_size")+"条数据"); //遍历用户列表 for (ur ur : urlist) { system.out.println("编号:" + ur.getid() +" 姓名:" + ur.geturname() + " 性别:" + ur.getx()); } //获取输出参数 system.out.println("数据总数:" + params.get("total_count")); system.out.println("总页数:" + params.get("total_page")); sqlssion.clo();}
执行结果:
【示例】创建存储过程,实现新增用户信息,并返回自增主键,通过mybatis调用该存储过程。
(1)创建存储过程。
-- 将结束标志符更改为$$delimiter $$ /* -- 存储过程:新增用户信息,返回自增主键 -- 输入参数:ur_name:用户姓名 -- 输入参数:x:性别 -- 输出参数:ur_id:自增主键*/create procedure proc_add_ur(in ur_name varchar(50),in x char(2), out ur_id int)begin-- 新增用户inrt into tb_ur(ur_name,x) value (ur_name,x);-- 获取自增主键lect last_inrt_id() into ur_id;end$$ -- 将结束标志符更改回分号delimiter ;
(2)编写sql映射配置。
<!-- 存储过程:新增用户信息,返回自增主键 --><inrt id="proc_add_ur" statementtype="callable" parametertype="com.pjb.mybatis.po.ur"> {call proc_add_ur(#{urname,mode=in,jdbctype=varchar}, #{x,mode=in,jdbctype=char}, #{id,mode=out,jdbctype=integer})}</inrt>
(3)编写执行方法。
/** * 使用mybatis调用存储过程:新增用户信息,返回自增主键 * @author pan_junbiao */@testpublic void procaddur(){ dataconnection dataconnection = new dataconnection(); sqlssion sqlssion = dataconnection.getsqlssion(); //新增的用户对象 ur ur = new ur(); ur.turname("pan_junbiao的博客"); ur.tx("男"); //调用存储过程执行新增 int reuslt = sqlssion.inrt("test.proc_add_ur",ur); sqlssion.commit(); //打印结果 system.out.println("执行结果:"+reuslt); system.out.println("自增主键:"+ur.getid()); sqlssion.clo();}
执行结果:
其实,新增数据后,获取自增主键是可以使用mybatis提供的<lectkey>标签,sql映射配置如下:
<!-- 存储过程:新增用户信息,返回自增主键 --><inrt id="proc_add_ur" statementtype="callable" parametertype="com.pjb.mybatis.po.ur"> <lectkey keyproperty="id" order="after" resulttype="java.lang.integer"> lect last_inrt_id() </lectkey> {call proc_add_ur(#{urname,mode=in,jdbctype=varchar}, #{x,mode=in,jdbctype=char})}</inrt>
但上述示例是为了能让该存储过程拥有一个返回的参数。
【示例】创建存储函数,根据用户编号,获取用户名称,通过mybatis调用该存储函数。
(1)创建存储函数,根据用户编号,获取用户名称。
-- 将结束标志符更改为$$delimiter $$ /* -- 存储函数:根据用户编号,获取用户名称 -- 输入参数:in_id:用户编号 -- 返回结果:用户名称*/create function func_get_ur_name(in_id int)re金堂公众信息网turns varchar(50)begin-- 定义返回变量declare out_name varchar(50); -- 查询用户信息,获取用户名称lect ur_name into out_name from tb_ur where id = in_id; -- 返回结果return out_name;end$$ -- 将结束标志符更改回分号delimiter ;
(2)编写sql映射配置。
<!-- 存储函数:根据用户编号,获取用户名称 --><lect id="func_get_ur_name" statementtype="callable" parametertype="hashmap" > {#{urname,mode=out,jdbctype=varchar} = call func_get_ur_name(#{urid,mode=in,jdbctype=integer})}</lect>
(3)编写执行方法。
/** * 使用mybatis调用存储函数:根据用户编号,获取用户名称 * @author pan_junbiao */@testpublic void禁用usb funcgeturname(){ dataconnection dataconnection = new dataconnection(); sqlssion sqlssion = dataconnection.getsqlssion(); //封装参数 map urmap = new hashmap(); urmap.put("urname",""); urmap.put("urid",8); sqlssion.lectone("test.func_get_ur_name",urmap); system.out.println("用户名称:" + urmap.get("urname")); sqlssion.clo();}
执行结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-03 23:21:06,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/7600a1e18f01054be91f4b80103a611b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:MyBatis如何调用存储过程与存储函数.doc
本文 PDF 下载地址:MyBatis如何调用存储过程与存储函数.pdf
留言与评论(共有 0 条评论) |