1、mysql数据库中存储过程的创建
参考http://yt0116.blog.51cto.com/9221014/1685307存储过程的基本创建于使用。在这里,主要讲容易出错的地方:
在创建存储过程中,选择存储过程后需要填写参数,设置好参数后,会自动生成参数列表,但是按照生成的参数列表写好存储过程语句之后会运行:
自动生成的参数列表:IN `m_sno` varchar,IN `m_pass` varchar,IN `m_sex` smallint,IN `m_school` varchar,IN `m_grade` varchar,IN `m_class` varchar
这时就会报出错误,错误原因在于没有指定每一个字符串的长度。在mysql创建存储过程时一定要注意这一点。
正确的如下:
IN `m_sno` varchar(20),IN `m_pass` varchar(20),IN `m_sex` smallint,IN `m_school` varchar(20),IN `m_grade` varchar(20),IN `m_class` varchar(20),长度根据自己的字段进行设置。
2、Mybatis中调用存储过程
使用Navicat创建存储过程时,根据窗口进行创建,只需要在Begin和End之间填充即可。下面写存储过程时只说明在Begin和End中间需要填充的语句。
(1)没有参数存储过程调用
存储过程:select * from people;
Mysql调用存储过程: call selectallpeople();
Mapper文件中调用存储过程:
<select id="getAllPeople" statementType="CALLABLE" resultType="People">
call selectallpeople();
select>
方法测试:
List
allPeoples=peopleDao.getAllPeople();
for(People people:allPeoples)
{System.out.println(people.getsNo());}
(这种方法与使用sql语句操作数据库区别不大,设置statementType="CALLABLE"和调用存储过程即可)
(2)有输入参数的存储过程
存储过程:SELECT * from people WHERE id=uid;
Mysql调用存储过程: CALL selectID(2);
Mapper文件中调用存储过程:
CALL selectID(#{id,mode=IN,jdbcType=INTEGER});
方法测试:
仅仅只有输入参数时可以有两种方式进行调用,第一种还是使用sql语句那种使用对象调用,或者使用map对象进行传参。
方法一:通过map、进行传参
Map
map.put("uid", 2);
People people=new People();
people=peopleDao.getPeople(map);
方法二:直接使用对象或简单数据类型传递数据即可
people=peopleDao.getPeople(2);
System.out.println(people.getsNo());
(3)有输入和输出参数的存储过程
参数:OUT `num` int,IN m_sex int
存储过程:
IF m_sex=1 THEN
select count(*) INTO num from people WHERE sex= 1;
ELSE
select count(*) INTO num from people WHERE sex= 0;
END IF;
Mysql调用存储过程:
SET @num=2;
CALL getpeoplenum(@num,0);
SELECT @num;
Mapper文件中调用存储过程:
Call getpeoplenum(#{num,mode=OUT,jdbcType=INTEGER},#{m_sex,mode=IN,jdbcType=INTEGER});
方法测试:
有输出参数时,必须使用map进行传参,执行完后,依旧还是根据map字段访问输出值。只需设置输入参数即可。
Map
map.put("m_sex", 0);
peopleDao.getPeopleNum(map);
System.out.println(map.get("num"));
(4)只有一个输出参数的存储过程
参数:OUT `num` int
存储过程:select count(*) INTO num from people
Mysql调用存储过程:
SET @num=2;
CALL getpeoplenum(@num);
SELECT @num;
Mapper文件中调用存储过程:
call getpeoplenum(#{num,mode=OUT,jdbcType=INTEGER});
方法测试:
Map
peopleDao.getPeopleNum(map);
System.out.println(map.get("num"));
//这样并不能获取num值,如果只返回一个值,在存储过程中直接使用select语句获取即可。不用这么麻烦,而且会获取不了值(像插入、删除、修改直接返回即可)