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

简介: 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();
  }
}
相关文章
|
8月前
|
SQL Java 数据库连接
|
2月前
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
106 0
|
6月前
|
存储 XML Java
Mybatis中使用存储过程实践
Mybatis中使用存储过程实践
88 0
|
7月前
|
存储 Java 数据库连接
MyBatis 调用存储过程
MyBatis 调用存储过程
31 0
|
8月前
|
SQL Java 关系型数据库
|
8月前
|
SQL Java 关系型数据库
|
8月前
|
SQL Java 关系型数据库
|
9月前
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
java202304java学习笔记第六十六天-ssm-mybatis的dao层实现1
25 0
|
9月前
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
java202304java学习笔记第六十六天-ssm-mybatis中dao层实现-动态sql-foreach之2
34 0