Mybatis中使用存储过程实践

简介: Mybatis中使用存储过程实践

存储过程没有返回值,不要尝试接收存储过程返回值:

-- 正确;
deviceImagesExtendDao.getCheckedDeviceCount(map);
-- 之后代码直接使用map即可。如果需要返回值,map里面有对应的inout型或out型参数。
-- 错误;
Map<String, Object> checkedDeviceCount = deviceImagesExtendDao.getCheckedDeviceCount(map);
-- checkedDeviceCount  将会为null !!!

【1】带有in /out 参数

存储过程实例如下:

create PROCEDURE get_user_count(in sex_id INT,OUT user_count INT)
BEGIN
  IF sex_id = 0 THEN
  SELECT COUNT(*) FROM p_user WHERE p_user.sex="女" into user_count;
  ELSE
  SELECT COUNT(*) FROM p_user WHERE p_user.sex="男" INTO user_count;
  END IF;
END

Navicat 下 调用存储过程 :

set @user_count = 0;
CALL get_user_count(1,@user_count);
SELECT @user_count;

result as follows :


【2】xml配置

<!--注意这里statementType="CALLABLE"-->
<select id="getUserCount" parameterMap="getUserCountMap" statementType="CALLABLE">
  call get_user_count(?,?)
</select>
<!-- type --java.util.Map-->
<parameterMap type="java.util.Map" id="getUserCountMap">
  <!-- mod distinguish the in or out  or inout -->
  <parameter property="sexId"  jdbcType="INTEGER" mode="IN"/>
  <parameter property="userCount" jdbcType="INTEGER" mode="OUT"/>
</parameterMap>


或者xml配置如下:

<!-- 设置 statmentType callable-->
<select id="getUserCount" parametertype="hashmap" statementType="CALLABLE" resultType="hashmap">
    {call get_user_count(
      #{sexId,jdbcType=INTEGER,mode=IN},
      #{userCount,jdbcType=INTEGER,mode=OUT}
    )}
</select>


这里需要说明一下xml配置与存储过程参数注意事项 :


① 如果两个参数不同类型,务必按照存储过程参数类型次序进行xml配置;


② 如果两个参数同样类型,将会按照xml配置依次传参;mybatis或者mysql不会按照jdbcType给你自动甄别。


③ select标签可以不加resultType,即使加了也不会有返回值接收(存储过程无返回值)

【3】代码测试

@Test
public void getUserCount(){
  SqlSession session = MybatisUtils.getFactory().openSession();
  String statement = "com.web.mapper.userMapper.getUserCount";
  Map<String, Integer> paramMap = new HashMap<String, Integer>();
  paramMap.put("sexId", 0);
  paramMap.put("userCount", 1);
  Integer userCount = session.selectOne(statement,paramMap);
  /* commit by yourself*/
  session.commit();
  System.out.println("effect rows.."+userCount);
  System.out.println("存储过程输出结果。。。"+paramMap.get("userCount"));
  session.close();
}


result as follows :

effect rows..null
 /*存储过程无返回值,当然是null !!!*/
存储过程输出结果。。。3


目录
相关文章
|
5月前
|
SQL Java 数据库连接
MyBatis 框架入门理论与实践
MyBatis 框架入门理论与实践
66 6
|
5月前
|
SQL Java 数据库连接
MyBatis Plus应用实践总结
MyBatis Plus应用实践总结
63 0
|
5月前
|
XML Java 数据库连接
MyBatis使用实践总结
MyBatis使用实践总结
70 0
|
4月前
|
Java 数据库连接 数据库
MyBatis TypeHandler详解:原理与自定义实践
MyBatis TypeHandler详解:原理与自定义实践
|
11月前
|
Java 数据库连接 mybatis
MyBatis中对象映射关联之association使用实践
MyBatis中对象映射关联之association使用实践
418 1
|
5月前
|
Java 数据库连接 微服务
Java程序员必学知识:高并发+微服务+数据结构+Mybatis实战实践
BATJ最全架构技术合集:高并发+微服务+数据结构+SpringBoot 关于一线互联网大厂网站的一些特点:用户多,分布广泛、大流量,高并发、海量数据,服务高可用、安全环境恶劣,易受网络攻击、功能多,变更快,频繁发布、从小到大,渐进发展、以用户为中心。 如果你工作中够仔细,你会发现这些特点跟高并发、分布式、微服务、Nginx这些技术密切相关的,是因为只要你的公司在上升,用户量级都会与日俱增,高性能、高并发的问题自然避免不了,话不多说往下看。
|
5月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
66 0
|
5月前
|
XML SQL Java
MyBatis【付诸实践 01】mapper.xml 中特殊符号的 2 种处理方法(CDATA区+替代字符举例)
MyBatis【付诸实践 01】mapper.xml 中特殊符号的 2 种处理方法(CDATA区+替代字符举例)
185 0
|
5月前
|
XML Java 关系型数据库
MyBatis Plus入门实践详解
MyBatis Plus入门实践详解
94 0
|
11月前
|
SQL Java 数据库连接
MyBatis: 深入解析与实践
什么是MyBatis? MyBatis是一款开源的、基于Java的持久层框架。它的设计理念是通过简单的XML或注解配置来映射Java对象和数据库表,而不是采用全自动的映射机制。这使得开发者可以更直观地控制SQL语句,适应不同的数据库和复杂的查询需求。
103 0

热门文章

最新文章