mybatis存储过程实现二,简单根据用户名和分页参数进行查询,返回总数和分页数据
1. 首先看一下数据库要完成的存储过程(我用的数据库是DBeaver,这里也给出Navicat for Mysql中的存储过程实现,两个不同软件代码实现不太一样)
Navicat for Mysql中存储过程代码:
-- 第二个存储过程 -- 简单根据用户名和分页参数进行查询,返回总数和分页数据 delimiter $ drop procedure if exists `select_user_page`; create procedure `select_user_page`( IN userName VARCHAR(50), IN _offset BIGINT, IN _limit BIGINT, OUT total BIGINT ) BEGIN -- 查询数据总数 select count(*) INTO total from sys_user where user_name like concat('%',userName,'%'); -- 分页查询数据 select * from sys_user where user_name like concat('%',userName,'%') limit _offset, _limit; END $ DELIMITER ;
执行后出现存储过程函数:
DBeaver中存储过程代码:
create procedure `select_user_page`( IN userName VARCHAR(50), IN _offset BIGINT, IN _limit BIGINT, OUT total BIGINT ) BEGIN -- 查询数据总数 select count(*) INTO total from sys_user where user_name like concat('%',userName,'%'); -- 分页查询数据 select * from sys_user where user_name like concat('%',userName,'%') limit _offset, _limit; END
drop procedure if exists `select_user_page`;
注意:这里务必注意,先执行第一部分代码在执行第二部分的代码,不然执行过程会出如下错误:
执行完毕后会出现相应的存储过程:
这样,第一步基础就打好了。(千万注意,在实现mybatis之前必须要实现此存储过程,不然就会出现如下错误:### Cause: java.sql.SQLException: Parameter number 2 is not an OUT parameter,这个问题折磨了我两天,头秃,难过到窒息,最后实现了此存储过程后报错才消失)
第一步基础打好了之后,接下来进行java代码配置。
2. UserMapper.xml中代码:
<select id="selectUserPage" statementType="CALLABLE" useCache="false" resultMap="userMap"> { call select_user_page ( #{userName,mode = IN}, #{_offset,mode = IN}, #{_limit,mode = IN}, #{total,mode = OUT, jdbcType = BIGINT} ) } </select>
3. 接口如下:
/* * 使用存储过程分页查询 * */ List<SysUser> selectUserPage(Map<String,Object> params);
4. 测试代码如下:
@Test public void testSelectUserPage(){ SqlSession sqlSession = getSqlSession(); try{ UserMapper userMapper = sqlSession.getMapper(UserMapper.class); Map<String,Object> params = new HashMap<String, Object>(); params.put("userName" , "ad"); params.put("offset" , 0); params.put("limit" , 0); List<SysUser> userList = userMapper.selectUserPage(params); Long total = (Long)params.get("total"); System.out.println("总数:" + total); for (SysUser user:userList ) { System.out.println("用户名:" + user.getUserName()); } }finally { sqlSession.close(); } }
测试结果如下:
至此,第二个存储过程结束。