Mybatis是一款流行的Java持久层框架,它通过XML文件或Java注解配置实现将Java对象与关系型数据库之间的交互,简化了开发者基于JDBC进行数据库操作的复杂性。本篇文章将详细介绍Mybatis如何实现在Oracle数据库中的分页查询。
假设我们有一个名为UserInfo的表,包含字段userId, userName, userAge和userGender。我们需要查询用户信息并实现分页展示。下面是UserInfo表的创建语句:
CREATE TABLE UserInfo ( userId INT PRIMARY KEY, userName VARCHAR2(50), userAge INT, userGender VARCHAR2(10) );
首先,我们在mapper.xml文件中定义查询语句及其参数:
<select id="getUserInfoByPage" parameterType="map" resultType="UserInfo"> SELECT * FROM ( SELECT u.*, rownum rownum_ FROM ( SELECT * FROM UserInfo WHERE 1=1 <if test="userName != null"> AND userName = #{userName,jdbcType=VARCHAR} </if> <if test="userAge != null"> AND userAge = #{userAge,jdbcType=INTEGER} </if> <if test="userGender != null"> AND userGender = #{userGender,jdbcType=VARCHAR} </if> ORDER BY userId DESC ) u WHERE rownum <= #{end,jdbcType=INTEGER} ) WHERE rownum_ >= #{start,jdbcType=INTEGER} </select>
以上代码实现了带条件的分页查询,其中start表示开始位置,end表示结束位置,都为页面request请求中传来的参数。如果没有传入参数,则start为0,end为页大小。
接着,在Java代码中调用Mapper接口的方法来查询数据,如下:
public List<UserInfo> getUserInfoByPage(int start, int end, String userName, Integer userAge, String userGender) { Map<String, Object> paramMap = new HashMap<>(); paramMap.put("start", start); paramMap.put("end", end); paramMap.put("userName", userName); paramMap.put("userAge", userAge); paramMap.put("userGender", userGender); return session.selectList("com.xxx.mapper.UserInfoMapper.getUserInfoByPage", paramMap); }
最后,在Controller中获取请求参数并调用Service方法返回数据,如下:
@RequestMapping("/getUserInfoByPage") @ResponseBody public Result getUserInfoByPage(HttpServletRequest request) { String userName = request.getParameter("userName"); String userAge = request.getParameter("userAge"); String userGender = request.getParameter("userGender"); int start = Integer.parseInt(request.getParameter("start")); int pageSize = Integer.parseInt(request.getParameter("pageSize")); int end = start + pageSize; List<UserInfo> userInfoList = userInfoService.getUserInfoByPage(start, end, userName, userAge, userGender); int totalCount = userInfoService.getUserInfoCount(userName, userAge, userGender); int totalPage = (int) Math.ceil((double) totalCount / pageSize); return new Result(true, "查询成功", userInfoList, totalCount, totalPage, start, end); }
以上代码实现了用户信息的分页查询,同时返回了查询的总条数、总页数、当前页起始项和终止项等信息。
总结来说,Mybatis配合Oracle数据库可以非常方便地实现分页查询,通过mapper.xml定义SQL语句及其参数,Java代码中使用传参方式来查询数据,最后传回Controller进行页面展示。