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