MyBatis笔记(5)——存储过程的调用

“皇上,还记得当年大三时认识的存储过程吗?”

“朕记得,就是。。。”

今天咱们练练存储过程。如果现在需要写一个这样存储过程:查询得到男性或女性的数量, 如果传入的是0就女性否则是男性

其他不多说,在数据库中吧表定义好、数据插入好,等着朕来写存储过程吧。

create table p_user(  
	id int primary key auto_increment,  
	name nvarchar(10),
	sex nchar(1)
); 

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 
$

这里还是啰嗦几句吧,想必不少同学已经把存储过程的书写方式忘了个精光了。格式如上,参数两个,一个输入参数,一个输出参数,用IN和OUT标记。select语句的尾部的INTO是将返回结果传入某某变量的意思,这里是OUT参数变量user_count。

DELIMITER估计小白们都忘了吧,这个分隔符是用来标记执行末尾的符号的,因为定义存储过程实际上只是一步操作,但是存储过程体内存在的语句包含了分号,如果不声明DELIMITER,mysql会把当中的分号当成执行分隔符来进行断句,那样就嗝屁了。所以,这里把DELIMITER声明为#。

我们再定义一个PUser类:(本文出自:http://my.oschina.net/happyBKs/blog/475853)

package com.happyBKs.mybatis.C1_1.beans;

public class PUser {
	private String id;
	private String name;
	private String sex;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public PUser(String id, String name, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
	}
	public PUser() {
		super();
	}
	@Override
	public String toString() {
		return "PUser [id=" + id + ", name=" + name + ", sex=" + sex + "]";
	}
}

关键还是映射文件怎么写。来吧!

puserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.happyBKs.mybatis.C1_1.puserMapper">

	<!-- 
		查询得到男性或女性的数量, 如果传入的是0就女性否则是男性
		CALL mybatis.get_user_count(1, @user_count);
	 -->
	 <select id="getCount" statementType="CALLABLE" parameterMap="getCountMap">
	 	call mybatis.ges_user_count(?,?)
	 </select>
	 <parameterMap type="java.util.Map" id="getCountMap">
	 	<parameter property="sex_id" mode="IN" jdbcType="INTEGER"/>
	 	<parameter property="user_count" mode="OUT" jdbcType="INTEGER"/>
	 </parameterMap>


</mapper>

这里注意我们需要为select设置属性为CALLABLE,用来声明接下来的select标签体内是调用存储过程,并且要为参数列表指定一个parameterMap。parameterMap将参数列表描述为java.util.Map类型,里面需要将各个parameter列出,property是传入的HashMap的键名称;mode标记IN、OUT、INOUT等,即输入还是输出;jdbcType描述参数类型。

MyBatis 通过包含的 jdbcType 枚举型,支持下面的 JDBC 类型:

注意:这里的property需要与调用它的方法提供的HashMap对象中的键名一致,而与数据库存储过程中的参数名称不需要一致,只要顺序一致、mode和类型一致就可以了。

把映射文件在config.xml配置文件中注册。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<properties resource="db.properties"/>


<!-- 
development: 开发模式
work: 工作模式
 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 在conf.xml文件中注册userMapper.xml文件 -->
	<mappers>
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/orderMapper.xml"/>
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/orderMapper2.xml"/>
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/classMapper.xml"/>	
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/classMapper2.xml"/>	
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/classMapper3.xml"/>
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/classMapper4.xml"/>
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/userMapper.xml"/>	
		<mapper resource="com/happyBKs/mybatis/C1_1/beans/puserMapper.xml"/>
	</mappers>

</configuration>

调用测试代码:

package com.happyBKs.mybatis.C1_1;

import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.happyBKs.mybatis.C1_1.beans.ConditionUser;
import com.happyBKs.mybatis.C1_1.beans.User;

public class TestCondition {
	@Test
	public void test2()
	{
		Reader reader=null;
		try {
			reader = Resources.getResourceAsReader("config.xml");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		SqlSession sqlSession = sessionFactory.openSession();
		String statement = "com.happyBKs.mybatis.C1_1.puserMapper.getCount";
		Map<String, Integer> paramMap = new HashMap<String, Integer>();
		paramMap.put("sex_id", 0);
		paramMap.put("user_count", -1);
		sqlSession.selectOne(statement, paramMap);
				
		Integer userCount = paramMap.get("user_count");
		System.out.println(userCount);


	}
}

输出结果:

1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用MyBatis调用自定义类型存储过程的步骤如下: 1. 首先,确保已经定义了自定义类型。在数据库中创建一个类型,例如: ``` CREATE TYPE my_custom_type AS OBJECT ( id NUMBER, name VARCHAR2(100), email VARCHAR2(100) ); ``` 2. 在MyBatis的配置文件中,配置数据库连接和Mapper文件路径。 3. 创建一个Mapper接口和对应的Mapper XML文件,用于调用存储过程。在Mapper接口中定义一个方法,例如: ``` void callCustomProcedure(Map<String, Object> params); ``` 4. 在Mapper XML文件中,编写对应的SQL语句,如下所示: ```xml <insert id="callCustomProcedure" statementType="CALLABLE"> {call custom_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{param2, mode=IN, jdbcType=INTEGER}, #{result, mode=OUT, jdbcType=ARRAY, javaType=java.sql.Array, resultMap=CustomResultMap})} </insert> ``` 这里的`custom_procedure`是自定义的存储过程名称,`param1`和`param2`是输入参数,`result`是输出参数。`CustomResultMap`是一个自定义的ResultMap,用于将结果映射到Java对象中。 5. 在Java代码中调用该方法,传入相应的参数,例如: ```java Map<String, Object> params = new HashMap<>(); params.put("param1", "value1"); params.put("param2", 123); mapper.callCustomProcedure(params); ``` 在调用存储过程后,输出参数将包含在`params`中,可以根据需要进行处理。 总结起来,通过以上步骤,我们可以使用MyBatis调用自定义类型存储过程,并处理输出参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值