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创建存储过程时,根据窗口进行创建,只需要在BeginEnd之间填充即可。下面写存储过程时只说明在BeginEnd中间需要填充的语句。

(1)没有参数存储过程调用

存储过程select * from people;

Mysql调用存储过程  call selectallpeople();

Mapper文件中调用存储过程

            <select id="getAllPeople" statementType="CALLABLE" resultType="People">

             call selectallpeople();

     select>

方法测试:

     List allPeoples=new ArrayList();

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=new HashMap();

    map.put("uid", 2);

    People people=new People();

    people=peopleDao.getPeople(map);

方法二:直接使用对象或简单数据类型传递数据即可

people=peopleDao.getPeople(2);

        System.out.println(people.getsNo());

(3)有输入和输出参数的存储过程

参数:OUT `num` intIN 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=new HashMap();

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 map=new HashMap();

peopleDao.getPeopleNum(map);

System.out.println(map.get("num"));

//这样并不能获取num值,如果只返回一个值,在存储过程中直接使用select语句获取即可。不用这么麻烦,而且会获取不了值(像插入、删除、修改直接返回即可)