精华内容
下载资源
问答
  • mybatis分页查询

    千次下载 热门讨论 2015-12-28 00:04:59
    mybatis分页查询,spring + maven + mybatis实现分页查询源码
  • Mybatis分页查询

    千次阅读 2018-05-06 19:42:36
    Mybatis分页查询 其实我们都知道Mybatis是对JDBC进行了轻量级的封装框架,在我们使用Mybatis对数据库进行CRUD等操作的时候,最重要的还是通过SQL语句来进行相应的操作,那么对Mybatis分页查询又该怎么来实现呢? ...

    Mybatis分页查询

    其实我们都知道Mybatis是对JDBC进行了轻量级的封装框架,在我们使用Mybatis对数据库进行CRUD等操作的时候,最重要的还是通过SQL语句来进行相应的操作,那么对Mybatis分页查询又该怎么来实现呢?
    其实Mybatis的分页查询同样也是使用:(select * from 表名 limit number,number;)来进行分查询。下面我简单的介绍两种方式分页查询:

    Mybatis分页查询方式一

    通过编写SQL语句进行分页查询
    映射文件:

    <select id="limitUser" parameterType="int" resultType="com.lc.mybatis.po.User">
            Select * from User limit #{arg0},#{arg1}
    </select>

    Mapper接口:
    这里关于@Param注解是传递多参数的映射方式;关于Mybatis传递多参数可以参考:http://www.cnblogs.com/mingyue1818/p/3714162.html

    public List<User> limitUser(@Param("arg0") int start,@Param("arg1") int limit);

    测试类:

        @Test
        public void testLimitUser() {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //获取UserMapper的代理类
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> users = userMapper.limitUser(0, 5);
            System.out.println(users.size());
            sqlSession.close();
        }

    Mybatis分页查询方式二

    通过Mybatis插件进行分页查询:
    我这里使用的是PageHelper插件,该插件是GitHub上的一个开源项目;该插件的方式下载地址:https://www.versioneye.com/java/com.github.pagehelper:pagehelper/3.3.2;
    PageHelper插件的原理
    通过前面几篇关于Mybatis的介绍,可以知道Mybatis的执行流程和原理:SqlSessionFactory的任务是创建SqlSession(SqlSession是用户用来操作数据库的接口),其实真正操作数据库并不是SqlSession去操作数据库,而是在SqlSession中封装了一个executor执行器来真真的操作数据库,而在MappedStatement中封装了操作数据库中的sql语句以及输入输出。因此,PageHelper插件就是在executor执行sql语句的时候通过Mybatsi的Intercept拦截器拦截对MappedStatement中的Sql语句进行修改(增加可以分页查询的功能),然后再把sql语句返回给MappedStatement。这样当executor执行MappedStatement中的sql语句就具有分页查询的功能。
    执行过程大致如下图:
    这里写图片描述
    使用PageHelper插件实现Mybatis分页查询
    第一步:添加jar包到工程中去(我这里使用的是maven工程)

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>3.3.2</version>
    </dependency>

    第二步:修改SqlMapConfig.xml配置文件(添加该插件的使用)

    <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 指定使用的数据库是什么 -->
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>

    第三步:使用分页查询插件测试分页查询
    这里通过Mybatis的逆向工程生成了表对应的pojo和一些简单的Mapper接口和映射文件。

    public class TestPageHelper {
    
        @Test
        public void testPageHelper() throws Exception {
            //1、获得mapper代理对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
            TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class);
            //2、设置分页
            PageHelper.startPage(1, 30);
            //3、执行查询
            TbItemExample example = new TbItemExample();
            List<TbItem> list = itemMapper.selectByExample(example);
            //4、取分页后结果
            PageInfo<TbItem> pageInfo = new PageInfo<>(list);
            //总记录数(相当于执行了select count(*) from 表名)
            long total = pageInfo.getTotal();
            System.out.println("total:" + total);
            //总页数
            int pages = pageInfo.getPages();
            System.out.println("pages:" + pages);
            //每页显示的数量
            int pageSize = pageInfo.getPageSize();
            System.out.println("pageSize:" + pageSize);
        }
    }

    方式一和方式二的不同:

    • 方式一需要手动去单独的写分页查询sql语句,而方式二只需要使用逆向工程生成的代码,在执行sql语句前设置分页查询的支持就可以了。
    • 方式一需要单独的编写查询数据总量的sql语句,而方式二中PageHelper已经为我们做了,可以通过PageInfo去获取许多分页信息。
    展开全文
  • MyBatis 分页查询

    2020-11-29 16:56:19
    MyBatis 通过 limit 关键字 或 RowBounds 类进行分页查询

    1. 利用 limit 关键字

    接口定义:

    public interface AccountMapper {
        // map 类型可以传入多个参数
        List<Account> findPage(Map<String, Integer> param);
    }
    

    select 标签:

    <select id="findPage" resultMap="pageMap">
        select  * from t_account limit #{offset},#{limit}
    </select>
    

    测试:

    @Test
    public void testFindPage() {
        Map<String, Integer> map = new HashMap<>();
        // 因为 xml 中指定的属性为 offset 和 limit
        // 所以 map 传入的键需与之对应
        map.put("offset", 0);
        map.put("limit", 2);
        List<Account> page = accountMapper.findPage(map);
        System.out.println(page);
    }
    

    2. 使用 RowBounds(了解)

    接口定义:

    public interface AccountMapper {
        // 使用 RowBounds 作为入参
        List<Account> findPage2(RowBounds rowBounds);
    }
    

    select 标签:

    <select id="findPage2" resultMap="pageMap">
        select * from t_account
    </select>
    

    测试:

    @Test
    public void testFindPage2() {
        RowBounds rowBounds = new RowBounds(0, 2);
        List<Account> accountList = accountMapper.findPage2(rowBounds);
        System.out.println(accountList);
    }
    
    • RowBounds 会将查询出所有满足条件的数据,然后根据 offsetlimit 参数(构造函数入参)取指定区间的数据。
    • 显然当数据庞大时,效率较低。

    3. PageHelper 插件

    展开全文
  • Mybatis 分页查询

    2019-10-01 18:11:27
    该篇博客记录采用pagehelper分页插件实现Mybatis分页功能 一、依赖 pom.xml <!-- pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>...

    该篇博客记录采用pagehelper分页插件实现Mybatis分页功能


    一、依赖

    • pom.xml
    <!-- pagehelper -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.5</version>
    </dependency>

    二、配置

    • application.yml
    # pagehelper
    pagehelper:
       helperDialect: mysql
       reasonable: true
       supportMethodsArguments: true
    params: count=countSql
    • CURD通用接口封装
    public interface CurdService<T> {
        /**
         * 分页查询
         * 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象
         * 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会
         * 影响服务层以上的分页接口,起到了解耦的作用
         * @param pageRequest 自定义,统一分页查询请求
         * @return PageResult 自定义,统一分页查询结果
         */
        PageResult findPage(PageRequest pageRequest);
    }
    • 分页请求封装
    public class PageRequest {
        /**
         * 当前页码
         */
        private int pageNum = 1;
        /**
         * 每页数量
         */
        private int pageSize = 10;
        /**
         * 查询参数
         */
        private Map<String, Object> params = new HashMap<>();
        
        public int getPageNum() {
            return pageNum;
        }
        public void setPageNum(int pageNum) {
            this.pageNum = pageNum;
        }
        public int getPageSize() {
            return pageSize;
        }
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
        public Map<String, Object> getParams() {
            return params;
        }
        public void setParams(Map<String, Object> params) {
            this.params = params;
        }
        public Object getParam(String key) {
            return getParams().get(key);
        }
    }
    • 分页结果封装
    public class PageResult {
        /**
         * 当前页码
         */
        private int pageNum;
        /**
         * 每页数量
         */
        private int pageSize;
        /**
         * 记录总数
         */
        private long totalSize;
        /**
         * 页码总数
         */
        private int totalPages;
        /**
         * 分页数据
         */
        private List<?> content;
        public int getPageNum() {
            return pageNum;
        }
        public void setPageNum(int pageNum) {
            this.pageNum = pageNum;
        }
        public int getPageSize() {
            return pageSize;
        }
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
        public long getTotalSize() {
            return totalSize;
        }
        public void setTotalSize(long totalSize) {
            this.totalSize = totalSize;
        }
        public int getTotalPages() {
            return totalPages;
        }
        public void setTotalPages(int totalPages) {
            this.totalPages = totalPages;
        }
        public List<?> getContent() {
            return content;
        }
        public void setContent(List<?> content) {
            this.content = content;
        }
    }
    • 分页助手封装
    public class MybatisPageHelper {
    
        public static final String findPage = "findPage";
        
        /**
         * 分页查询, 约定查询方法名为 “findPage” 
         * @param pageRequest 分页请求
         * @param mapper Dao对象,MyBatis的 Mapper  
         * @param args 方法参数
         * @return
         */
        public static PageResult findPage(PageRequest pageRequest, Object mapper) {
            return findPage(pageRequest, mapper, findPage);
        }
        
        /**
         * 调用分页插件进行分页查询
         * @param pageRequest 分页请求
         * @param mapper Dao对象,MyBatis的 Mapper  
         * @param queryMethodName 要分页的查询方法名
         * @param args 方法参数
         * @return
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) {
            // 设置分页参数
            int pageNum = pageRequest.getPageNum();
            int pageSize = pageRequest.getPageSize();
            PageHelper.startPage(pageNum, pageSize);
            // 利用反射调用查询方法
            Object result = ReflectionUtils.invoke(mapper, queryMethodName, args);
            return getPageResult(pageRequest, new PageInfo((List) result));
        }
    
        /**
         * 将分页信息封装到统一的接口
         * @param pageRequest 
         * @param page
         * @return
         */
        private static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) {
            PageResult pageResult = new PageResult();
            pageResult.setPageNum(pageInfo.getPageNum());
            pageResult.setPageSize(pageInfo.getPageSize());
            pageResult.setTotalSize(pageInfo.getTotal());
            pageResult.setTotalPages(pageInfo.getPages());
            pageResult.setContent(pageInfo.getList());
            return pageResult;
        }
    }
    • HTTP返回结果封装
    public class HttpResult {
        private int code = 200;
        private String msg;
        private Object data;
        
        public static HttpResult error() {
            return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
        }
        public static HttpResult error(String msg) {
            return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
        }
        public static HttpResult error(int code, String msg) {
            HttpResult r = new HttpResult();
            r.setCode(code);
            r.setMsg(msg);
            return r;
        }
        public static HttpResult ok(String msg) {
            HttpResult r = new HttpResult();
            r.setMsg(msg);
            return r;
        }
        public static HttpResult ok(Object data) {
            HttpResult r = new HttpResult();
            r.setData(data);
            return r;
        }
        public static HttpResult ok() {
            return new HttpResult();
        }
        public int getCode() {
            return code;
        }
        public void setCode(int code) {
            this.code = code;
        }
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
        public Object getData() {
            return data;
        }
        public void setData(Object data) {
            this.data = data;
        }
    }

    三、实现

    • SysUserController.java
    @RestController
    @RequestMapping("/user")
    public class SysUserController {
    
        @Autowired
        private SysUserService sysUserService;
        
        @PostMapping(value="/findPage")
        public HttpResult findPage(@RequestBody PageRequest pageRequest) {
            return HttpResult.ok(sysUserService.findPage(pageRequest));
        }
    }
    • SysUserService.java
    public interface SysUserService extends CurdService<SysUser> {
    
    }
    • SysUserMapper.java
    public interface SysUserMapper {
        List<SysUser> findPage();
    }
    • SysUserServiceImpl.java
    //经过对分页查询业务的封装,只需调用MybatisPageHelper.findPage(pageRequest, sysUserMapper)即可实现分页查询功能
    @Service
    public class SysUserServiceImpl implements SysUserService {
    
        @Autowired
        private SysUserMapper sysUserMapper;
        
        @Override
        public PageResult findPage(PageRequest pageRequest) {
            return MybatisPageHelper.findPage(pageRequest, sysUserMapper);
        }
    }
    • SysUserMapper.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="com.coisini.admin.mapper.SysUserMapper">
      <resultMap id="BaseResultMap" type="com.coisini.admin.entity.SysUser">
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="nick_name" jdbcType="VARCHAR" property="nickName" />
        <result column="avatar" jdbcType="VARCHAR" property="avatar" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="salt" jdbcType="VARCHAR" property="salt" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="mobile" jdbcType="VARCHAR" property="mobile" />
        <result column="status" jdbcType="TINYINT" property="status" />
        <result column="dept_id" jdbcType="BIGINT" property="deptId" />
        <result column="create_by" jdbcType="VARCHAR" property="createBy" />
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
        <result column="last_update_by" jdbcType="VARCHAR" property="lastUpdateBy" />
        <result column="last_update_time" jdbcType="TIMESTAMP" property="lastUpdateTime" />
        <result column="del_flag" jdbcType="TINYINT" property="delFlag" />
      </resultMap>
      <sql id="Base_Column_List">
        id, name, nick_name, avatar, password, salt, email, mobile, status, dept_id, create_by, 
        create_time, last_update_by, last_update_time, del_flag
      </sql>
      <select id="findPage" resultMap="BaseResultMap">
        select u.*, (select d.name from sys_dept d where d.id = u.dept_id) deptName from sys_user u
      </select>
    </mapper>

    四、测试

    在这里插入图片描述

    转载于:https://www.cnblogs.com/maggieq8324/p/11414538.html

    展开全文
  • MyBatis分页查询

    2018-09-20 16:53:55
    SqlSession对象的selectList方法有个RowBounds参数,该参数可用于控制返回的记录数量。使用代码如下:   数据抓取机制:是先将当前页记录以及前面所有记录,以及后面...优化MyBatis分页 高效的分页应该是只抓...

    SqlSession对象的selectList方法有个RowBounds参数,该参数可用于控制返回的记录数量。使用代码如下:

     

    数据抓取机制:是先将当前页记录以及前面所有记录,以及后面一条记录都抓取出来,然后再截取当前页记录显示。例如需要抓取显示4-6条记录时,实际获取的是前6条记录,外加第7条记录。这种抓取机制,越往后分页,性能会越差。

    优化MyBatis分页

    高效的分页应该是只抓取需要显示的记录,使用pageHelper.jar组件可以优化查询机制。使用方法如下:

    • 添加pageHelper.jar工具包

    • 在mybatis配置文件中配置pageHelper

     

    此时再执行上面查询代码时,会将原有SQL封装成分页SQL语句,抓取记录时只抓取需要显示的记录。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,652
精华内容 2,260
关键字:

mybatis分页查询