Mybatis学习总结(七)——调用存储过程
一、返回select结果集
1、创建存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS proc_queryUser;
CREATE PROCEDURE proc_queryUser(
IN user_name VARCHAR(50) CHARACTER SET utf8
)
BEGIN
SET @exeSql = CONCAT('SELECT id,username,sex,birthday,address ',
'from t_user where username like \'',user_name,'%\' order by id');
-- 打印sql
-- SELECT @exeSql;
-- 预定义一个语句,并将它赋给stmtsql
PREPARE stmtsql FROM @exeSql;
EXECUTE stmtsql;
-- 释放一个预定义语句的资源
DEALLOCATE PREPARE stmtsql; END //
DELIMITER ;
2、存储过程调用
SET @user_name='小';
CALL proc_queryUser(@user_name);

3、在UserMapper.java中添加接口方法
/**调用存储过程查询用户**/
public List findUserByProc(String user_name); /**调用存储过程查询用户**/
public List findUserByProc1(Map map);
4、在UserMapper.xml中添加如下配置项:
<!-- 调用存储过程 -->
<!-- 第一种方式,参数使用parameterType -->
<select id="findUserByProc" parameterType="java.lang.String" statementType="CALLABLE"
resultType="com.mybatis.entity.User">
{call proc_queryUser(#{user_name,jdbcType=VARCHAR,mode=IN})}
</select> <parameterMap type="java.util.Map" id="userMap">
<parameter property="user_name" mode="IN" jdbcType="VARCHAR"/>
</parameterMap> <!-- 调用存储过程 -->
<!-- 第二种方式,参数使用parameterMap -->
<select id="findUserByProc1" parameterMap="userMap" statementType="CALLABLE"
resultType="com.mybatis.entity.User">
{call proc_queryUser(?)}
</select>
说明:这里使用两种方式调用存储过程,两种方式的区别主要在于参数的使用方式上,第一种方式使用parameterType,第二种方式使用parameterMap。
5、测试代码:
package com.mybatis.test; import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import com.mybatis.entity.User;
import com.mybatis.mapper.UserMapper; public class TestMybatisProceduce { private SqlSessionFactory sqlSessionFactory; // 此方法是在执行@Test方法之前执行
@Before
public void setUp() throws Exception {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建SqlSessionFcatory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void TestProceduce(){
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建Usermapper对象,mybatis自动生成mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List userList = mapper.findUserByProc("小");
System.out.println(userList);
sqlSession.close();
} @Test
public void TestProceduce1(){
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建Usermapper对象,mybatis自动生成mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map map = new HashMap();
map.put("user_name", "小");
List userList = mapper.findUserByProc1(map);
System.out.println(userList);
sqlSession.close();
}
}
6、运行结果:
[User [id=8, username=小A, sex=2, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015],
User [id=9, username=小B, sex=2, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015],
User [id=10, username=小C, sex=1, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015],
User [id=11, username=小D, sex=2, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015]] [User [id=8, username=小A, sex=2, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015],
User [id=9, username=小B, sex=2, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015],
User [id=10, username=小C, sex=1, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015],
User [id=11, username=小D, sex=2, address=北京, birthday=Sat Jun 27 00:00:00 CST 2015]]
二、带输入输出参数的存储过程
1、创建存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS proc_queryUserCount;
CREATE PROCEDURE proc_queryUserCount(
IN user_name VARCHAR(50) CHARACTER SET utf8,
OUT count INT
)
BEGIN
SET @exeSql = CONCAT('SELECT count(*) into @rowsCount from t_user where username like \'',user_name,'%\'');
-- 打印sql
-- SELECT @exeSql;
-- 预定义一个语句,并将它赋给stmtsql
PREPARE stmtsql FROM @exeSql;
EXECUTE stmtsql;
-- 释放一个预定义语句的资源
DEALLOCATE PREPARE stmtsql;
SET count = @rowsCount; END //
DELIMITER ;
2、存储过程调用:
SET @user_name='小';
CALL proc_queryUserCount(@user_name,@count);
SELECT @count;

3、在UserMapper.java中添加接口方法
/**调用存储过程(带输入输出参数的存储过程)**/
public void findUserCountByProc(Map map);
4、在UserMapper.xml中添加如下配置项:
<parameterMap type="java.util.HashMap" id="userMap1">
<parameter property="user_name" jdbcType="VARCHAR" mode="IN"/>
<parameter property="count" jdbcType="INTEGER" mode="OUT"/>
</parameterMap> <!-- 调用存储过程 (带输入输出参数的存储过程)-->
<select id="findUserCountByProc" parameterMap="userMap1" statementType="CALLABLE">
{call proc_queryUserCount(?,?)}
</select>
5、测试代码:
@Test
public void TestProceduce2(){
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建Usermapper对象,mybatis自动生成mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map map = new HashMap();
map.put("user_name", "小");
mapper.findUserCountByProc(map);
System.out.println("userCount="+map.get("count"));
sqlSession.close();
}
6、运行结果:
userCount=4
三、返回多个结果集
1、创建存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS proc_query;
CREATE PROCEDURE proc_query(
IN user_id INT,
OUT order_count INT
)
BEGIN
SET @exeSql = CONCAT('SELECT id,username,sex,date_format(birthday,\'%Y-%m-%d\')birthday,address ',
'from t_user where id=\'',user_id,'\''); PREPARE stmtsql FROM @exeSql;
EXECUTE stmtsql;
DEALLOCATE PREPARE stmtsql; SET @exeSql1 = CONCAT('SELECT id,user_id,number,date_format(createtime,\'%Y-%m-%d %H:%i:%s\')createtime ',
'from orders where user_id=\'',user_id,'\''); PREPARE stmtsql1 FROM @exeSql1;
EXECUTE stmtsql1;
DEALLOCATE PREPARE stmtsql1; SET @exeSql2 = CONCAT('SELECT count(*) into @rowsCount from orders ',
'where user_id=\'',user_id,'\''); PREPARE stmtsql2 FROM @exeSql2;
EXECUTE stmtsql2;
DEALLOCATE PREPARE stmtsql2;
SET order_count = @rowsCount; END //
DELIMITER ;
2、存储过程调用:
SET @user_id=2;
CALL proc_query(@user_id,@order_count);
SELECT @order_count;

3、在UserMapper.java中添加接口方法
/**调用存储过程(返回多个结果集)**/
public List<List<?>> findUserOrdersByProc(Map map);
4、在UserMapper.xml中添加如下配置项:
<resultMap type="java.util.HashMap" id="userInfoMap">
<result column="id" property="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result column="username" property="username" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result column="birthday" property="birthday" javaType="java.lang.String" jdbcType="DATE"/>
<result column="sex" property="sex" javaType="java.lang.String" jdbcType="CHAR"/>
<result column="address" property="address" javaType="java.lang.String" jdbcType="VARCHAR"/>
</resultMap> <resultMap type="java.util.HashMap" id="ordersMap">
<result column="id" property="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result column="user_id" property="user_id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result column="number" property="number" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result column="createtime" property="createtime" javaType="java.lang.String" jdbcType="TIMESTAMP"/>
</resultMap> <!-- 调用存储过程 (返回多个结果集)-->
<select id="findUserOrdersByProc" parameterType="java.util.Map" resultMap="userInfoMap,ordersMap"
statementType="CALLABLE">
{call proc_query(#{user_id,jdbcType=INTEGER,mode=IN},
#{order_count,jdbcType=INTEGER,mode=OUT})}
</select>
5、测试代码:
@Test
public void TestProceduce3(){
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建Usermapper对象,mybatis自动生成mapper代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map map = new HashMap();
map.put("user_id", "2");
List<List<?>> resultList = mapper.findUserOrdersByProc(map);
List<Map> list1 = (List<Map>)resultList.get(0);
List<Map> list2 = (List<Map>)resultList.get(1);
System.out.println(list1);
System.out.println(list2);
System.out.println("orderCount="+map.get("order_count"));
sqlSession.close();
}
6、运行结果:
[{id=2, birthday=2014-07-10, sex=1, username=张三, address=北京市}]
[{createtime=2015-07-17 14:13:23, id=3, number=1000012, user_id=2}]
orderCount=1
四、总结:
如果sql中用的是select出结果,不需要配置out参数。多个结果集/结果集可以配置resultMap 来返回LIST,主要是调用selectList方法会自动把结果集加入到list中去的。
Mybatis学习总结(七)——调用存储过程的更多相关文章
- MyBatis学习总结(六)——调用存储过程(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013518.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存 ...
- MyBatis学习总结(六)——调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_ ...
- MyBatis学习总结(六)——调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...
- MyBatis学习总结_06_调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_ ...
- MyBatis学习笔记(六)——调用存储过程
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据 ...
- 六:MyBatis学习总结(六)——调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的.最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁 ...
- MySQL学习笔记:调用存储过程或函数报1418错误
问题 MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误: ERROR 1418 (HY000): This function has none of DE ...
随机推荐
- IBM沃森会成为第一个被抛弃的AI技术吗?
作者|William Vorhies 译者|姚佳灵 编辑|Debra 导读:IBM 的沃森问答机(Question Answering Machine,简称 QAM),因 2011 年参加综艺节目&l ...
- SSH密钥对登录的原理和实践
1.ssh密钥对登录的基本思路是:要登录谁,就把公钥放到谁身上,就可以授权登录谁. 2.本地登录设备称为ssh客户端,被登录的设备称为ssh服务器. 3.原理图描述如下: 4.SSH的公钥分为open ...
- 如何获取view的大小
很多初学者都会犯一个错误 ,就是在onCreate或者onStart里面去获取view的大小,然而这样获取到的宽高通常都是0,为什么呢?因为view的测量过程和activity的生命周期不是同步的,因 ...
- Python3.6 下 安装MySql
https://pypi.python.org/pypi/mysqlclient/1.3.10 该网页下下载 Python-3.5及上版本的扩展的mysql驱动. 下载的是一个.whl文件,下载目录为 ...
- 打包错误--Error:A problem was found with the configuration of task ':app:packageRelease'.
解决办法: app目录下的build.gradle文件 将 shrinkResources 的值改为 false 或者直接去掉 shrinkResources true 表示 :打包的时候会去删除一 ...
- react-fetch数据发送请求
在一个项目中,数据的请求发送数据是最为重要的,不可能我们的数据都是自己进行编写的 在react中官方推荐使用的方法是fetch.当然它里面也可以使用vue中的axios请求数据,jQuery的$.aj ...
- leetcode-53.最大子序和
leetcode-53.最大子序和 题意 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,- ...
- 产品经理说| AIOps 让告警变得更智能 (下)
AIOps 人工智能和IT运营支撑 Ops 之间的故事,愈演愈烈,已经成为当今运维圈的热门话题,我打算从2篇文档分享我们在 AIOps 上一些探索和实践.(上篇)主要介绍了为什么事件(告警)处理需要 ...
- virtualbox+ievms:还你一个原装IE8
在web开发中,不可避免的一件事是浏览器兼容性问题,你永远无法想象项目正式上线后,坐在电脑前操作这套系统的人用的是什么版本的浏览器,IE(7,8,...),360,Chrome,火狐等,后面几个还好说 ...
- 【C编程基础】多线程编程
基础知识 1.基本概念 (1)线程,即轻量级进程(LWP:LightWeight Process),是程序执行流的最小单元. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位. (2)线程同步 ...