存储过程主要包括如下元素:1.变量的声明和初始化;2.SQL语句;3.流程控制关键字(if.....else....);4.关键字。java
一个简单的例子:sql
use [test] GO create procedure us_test @num INT AS select * from test where nameId =@num
@num,为int类型,须要用户在执行该存储过程时输入。数据库
1.存储过程的引入使得T-SQL编程更加的模块化和组件化。apache
2.存储过程的引入增长了用户和SQL 脚本的交互。编程
3.存储过程的引入能够提升T-SQL 语句的执行效率,减小系统反应时间。网络
4.存储过程的引入能够减小没必要要的网络流量,优化数据库的性能。session
1.在数据库中的使用。mybatis
a.在图形界面中执行存储过程。(这个最简单了)app
b.使用EXEC语句执行存储过程。dom
好比前面的存储,只须要: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;
<!-- 查询获得男性或女性的数量, 若是传入的是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.csdn.net/u013074999/article/details/52334305