Mybatis学习笔记(四)调用存储过程

时间:2022-07-23
本文章向大家介绍Mybatis学习笔记(四)调用存储过程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

存储过程有如下几个优点 1.执行速度更快 – 在数据库中保存的存储过程语句都是编译过的

2.允许模块化程序设计 – 类似方法的复用

3.提高系统安全性 – 防止SQL注入

4.减少网络流通量 – 只要传输存储过程的名称 所以想要追求速度,可以使用存储过程。 先简单回顾一下存储过程的使用: 首先是创建存储过程procedure:

create procedure 存储过程name
(输入输出类型   变量名1   变量类型
。。。。。。
)
as 
sql语句

举个例子

create procedure  selectname (in id integer,out name vachar(20)
as 
select name from user where id=id;

之后就是调用存储过程 分两种一种是调用默认参数的

exec procedure selectname;

另一种是自己给变量赋值的

exec procedure selectname 20;

接下来在mybatis中实际运用 首先创建一个新的表p_user

create table p_user(  
    id int primary key auto_increment,  
    name varchar(10),
    sex char(2)
); 

insert into p_user(name,sex) values('A',"男");  
insert into p_user(name,sex) values('B',"女");  
insert into p_user(name,sex) values('C',"男");  

创建存储过程:

-- 创建存储过程(查询得到男性或女性的数量, 如果传入的是0就女性否则是男性)
DELIMITER $
CREATE PROCEDURE mybatis.ges_user_count(IN sex_id INT, OUT user_count INT)
BEGIN  
IF sex_id=0 THEN
SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.sex='女' INTO user_count;
ELSE
SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.sex='男' INTO user_count;
END IF;
END 
$

-- 调用存储过程
DELIMITER ;
SET @user_count = 0;
CALL mybatis.ges_user_count(1, @user_count);
SELECT @user_count;

之后还是在之前的userMapper中重新创建并调用存储过程的select标签

<select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
    call mybatis.ges_user_count(?,?)
    </select>
    <parameterMap type="java.util.Map" id="getUserCountMap">
    <parameter property="sexid" mode="IN" jdbcType="INTEGER"/>
    <parameter property="usercount" mode="OUT" jdbcType="INTEGER"/>
    </parameterMap>

这里我们可以看到之前我们碰到的都是parameter,这次的就是parameterMap,因为输入的数据不是单个的,所以我们采用Map来实现。 接下来定义Map中的各元素 之后便是测试类:

public class Test6 {
	public static void testGetUserCount()
	{
		SqlSession sqlSession=MyBatisUtil.getSqlSession();
		String statement="me.gacl.mapping.userMapper.getUserCount";
	    Map<String, Integer>parameterMap=new HashMap<String, Integer>();
	    parameterMap.put("sexid", 1); 
	    parameterMap.put("usercount", 0);
	    sqlSession.selectOne(statement, parameterMap);
	    Integer result=parameterMap.get("usercount");
	    System.out.println(result);
	    sqlSession.close();
	}
	public static void main(String[] args) {
		testGetUserCount();
	}
}