存储过程有如下几个优点
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();
}
}