一.在mysql中新建test表
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test`(`name`) VALUES ('测试');
SELECT * FROM `test`;
二.新建存储过程(根据id查询name值)
DROP PROCEDURE IF EXISTS sp_test_name; #如果存在先删除
DELIMITER $$ #定义结束符
#创建语句: CREATE PROCEDURE 名称([IN||OUT||INOUT 参数名 数据类型])
#IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
#OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
#INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
CREATE PROCEDURE sp_test_name(IN tId BIGINT, OUT Tname VARCHAR(255))
BEGIN
SELECT `name` INTO Tname FROM `test` WHERE id = tId;
END $$
DELIMITER ;
三.定义mapper接口
void selectBySp(Map<String, Object> params);
四.编写mapper.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="mapper全限定名">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="实体类全限定名">
<id column="id" property="id" />
<result column="name" property="name" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, `name`
</sql>
<!-- 执行存储过程 必须使用 statementType="CALLABLE"; -->
<select id="selectBySp" statementType="CALLABLE">
<!-- 关键字 { call 存储过程名称([参数]) }-->
{call sp_test_name(
#{id,mode=IN,jdbcType=INTEGER},
#{name,mode=OUT,jdbcType=VARCHAR}
)}
</select>
</mapper>
省略service.......
五.controller中调用
@RequestMapping("/testSp")
@ResponseBody
public String sp(Integer id) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
//必须有name,值可以随便填入
map.put("name", "");
mapper.selectBySp(map);
//查询map里面name的值,如果不存在则为错误!
String userName = MapUtils.getString(map, "name", "错误!");
//输出为 根据id查name的值
System.out.println(userName+"-----");