一、存储过程
存储过程主要包括以下元素:1.变量的声明和初始化;2.SQL语句;3.流程控制关键字(if.....else....);4.关键字。
一个简单的例子:
use [test]
GO
create procedure us_test
@num INT
AS
select * from test where nameId =@num
@num,为int类型,需要用户在执行该存储过程时输入。
二、存储过程的作用
1.存储过程的引入使得T-SQL编程更加的模块化和组件化。
2.存储过程的引入增加了用户和SQL 脚本的交互。
3.存储过程的引入可以提高T-SQL 语句的执行效率,减少系统反应时间。
4.存储过程的引入可以减少不必要的网络流量,优化数据库的性能。
三、存储过程的使用
1.在数据库中的使用。
a.在图形界面中执行存储过程。(这个最简单了)
b.使用EXEC语句执行存储过程。
比如前面的存储,只需要:EXEC us_test 122
2.在mybatis中的使用,因为我项目中使用的是mybatis。
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;
testMapper.xml中的配置
<!-- 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 -->
<select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
CALL mybatis.ges_user_count(?,?)
</select>
<!--
parameterMap.put("sexid", 0);
parameterMap.put("usercount", -1);
-->
<parameterMap type="java.util.Map" id="getUserCountMap">
<parameter property="sexid" mode="IN" jdbcType="INTEGER"/>
<parameter property="usercount" mode="OUT" jdbcType="INTEGER"/>
</parameterMap>
注意两个关键字:statementType="CALLABLE"和CALL mybatis.ges_user_count,同时还需注意参数是map结果。
单元测试:
package me.gacl.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.gacl.custom.model.ConditionUser;
import me.gacl.domain.User;
import me.gacl.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
/**
* @author gacl
* 测试调用存储过程
*/
public class Test6 {
@Test
public void testGetUserCount(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
/**
* 映射sql的标识字符串,
* me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
* getUserCount是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
String statement = "me.gacl.mapping.userMapper.getUserCount";//映射sql的标识字符串
Map<String, Integer> parameterMap = new HashMap<String, Integer>();
parameterMap.put("sexid", 1);
parameterMap.put("usercount", -1);
sqlSession.selectOne(statement, parameterMap);
Integer result = parameterMap.get("usercount");
System.out.println(result);
sqlSession.close();
}
}
存储过程使用的案列:http://blog.youkuaiyun.com/u013074999/article/details/52334305