精华内容
下载资源
问答
  • 将多个后缀为.docx文档合并成一个文档,并实现分页,避免因文档过多,打开过于麻烦
  • jspdf源代码jspdf源代码jspdf源代码jspdf源代码jspdf源代码jspdf源代码
  • Mybatis分页插件PageHelper实现自动分页

    千次阅读 2017-03-06 13:48:11
    今天尝试向项目中添加了一项新的功能——分页查询,查询了很多资料,最后发现使用Mybatis分页插件Pagehelper来实现最为方便。 pagehelper插件实现分页查询十分方便,主要通过以下几个步骤: 1.引入分页插件 由于...

    今天尝试向项目中添加了一项新的功能——分页查询,查询了很多资料,最后发现使用Mybatis分页插件Pagehelper来实现最为方便。

    pagehelper插件实现分页查询十分方便,主要通过以下几个步骤:

    1.引入分页插件

    由于项目采用maven来管理jar包,所以可以在pom.xml 中添加如下依赖:

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>${mybatis-pagehelper.version}</version>
    </dependency>

    mybatis-pagehelper.version为该插件的最新版本号。

    2.配置拦截插件

    在MyBatis的xml配置文件中添加如下配置信息:
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
    
          <!-- 4.0.0以后版本可以不设置该参数 -->
          <property name="dialect" value="mysql" />
    
          <!-- 该参数默认为false -->
          <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
          <!-- 和startPage中的pageNum效果一样 -->
          <property name="offsetAsPageNum" value="true" />
    
          <!-- 该参数默认为false -->
          <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
          <property name="rowBoundsWithCount" value="true" />
    
          <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
          <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型) -->
          <property name="pageSizeZero" value="true" />
    
          <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
          <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
          <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
          <property name="reasonable" value="false" />
    
          <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
          <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
          <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
          <!-- 不理解该含义的前提下,不要随便复制该配置 -->
          <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;" />
    
          <!-- 支持通过Mapper接口参数来传递分页参数 -->
          <property name="supportMethodsArguments" value="false" />
    
          <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
          <property name="returnPageInfo" value="none" />
        </plugin>
      </plugins>
    分页插件参数的具体介绍可见 Pagehelper官方文档

    3.在代码中使用该插件

    在sql执行前引入该插件,完成分页操作,即在mapper接口方法执行之前。
    @RestController
    public class IndexHistoryEndpoint {
    
      @Resource
      private IndexHistoryMapper indexHistoryMapper;
    
      @ResponseBody
      @RequestMapping(value = { "api/v1/indexhistory" }, method = RequestMethod.GET)
      public PageInfo
        
          listIndexHistory(
          @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
          @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List
         
           list = indexHistoryMapper.listindexHistory();
        PageInfo
          
            pageInfo = new PageInfo
           
            (list);
        return  pageInfo;
      }
    }
           
          
         
        
    这样便可以完成了该插件的全部配置。

    为何要用此插件?

    mybatis提供的分页效率低

    Select * from user limit #{p1},#{p2}传统的分页有何不足之处?

    Select * from user limit #{p1},#{p2} mybatis内部在看到jdbc的Resultset对象时,用游标定位offset的位置,只处理limit条记录。

    场景:当数据库105万条数据,1万1页,我要查第一百页,那就是第1000001到条1010000条,使用这种分页查询,先是查询全部105万条,然后截取所对应页码的记录,效率不行。



    展开全文
  • Mybatis Plus对于分页数量大小默认有限制,同时有的时候分页接口和导出接口通常是一模一样,这时候需要自动判断是否需要开启分页。 二、实现思路 基于mybatis plus的文档 // 当`page`参数为null时,会抛出空指针异常...

    一、 背景

    Mybatis Plus对于分页数量大小默认有限制,同时有的时候分页接口和导出接口通常是一模一样,这时候需要自动判断是否需要开启分页。

    二、实现思路

    基于mybatis plus的文档

    // 当`page`参数为null时,会抛出空指针异常
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    

    如果想实现自动开闭分页需要这样实现

    三、实现代码

    1. 基础分页参数
    @Data
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    public class PageParam<T> extends Page<T> {
        private Integer isOpenPage = 1;
    }
    
    
    public class BaseServiceImpl<M extends BaseSqlInjectorMapper<T>, T> extends ServiceImpl<M, T> {
        public PageParam<T> selectByPage(PageParam<T> page, Wrapper<T> queryWrapper) {
            if (page.getIsOpenPage() == 1) {
                return getBaseMapper().selectPage(page, queryWrapper);
            }
    
            List<T> list = list(queryWrapper);
            PageParam<T> pageResult = new PageParam<>();
            pageResult.setRecords(list);
            pageResult.setTotal(list.size());
    
            return pageResult;
        }
    
        public <E> PageParam<E> selectByPage(PageParam<E> page, Function<PageParam<E>, List<E>> function) {
            if (page.getIsOpenPage() == 1) {
                function.apply(page);
                return page;
            }
    
            List<E> list = function.apply(null);
            PageParam<E> pageResult = new PageParam<>();
            pageResult.setRecords(list);
            pageResult.setTotal(list.size());
    
            return pageResult;
        }
    
        public <E> IPage<E> selectByPage(PageParam<T> page, Wrapper<T> wrapper, Class<E> clz) {
            IPage<T> eiPage = selectByPage(page, wrapper);
    
            return eiPage.convert(o -> {
                E e = null;
                try {
                    e = clz.newInstance();
                } catch (InstantiationException | IllegalAccessException ex) {
                    throw new RuntimeException(ex);
                }
                BeanUtils.copyProperties(o, e);
                return e;
            });
        }
    }
    
    
    展开全文
  • js表格打印自动分页demo

    千次阅读 2019-01-08 22:46:08
    打印表格根据纸张自动分页,带表头表尾 &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv="...

    打印表格根据纸张自动分页,带表头表尾

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>无标题文档</title>
        <style type="text/css">
            @media print {
                INPUT {
                    display: none;
                }
            }
        </style>
    </head>
     
    <body>
        <table border="1" style="font-size: 9pt;" width="300px" align="center">
            <thead style="display: table-header-group; font-weight: bold">
                <tr>
                    <td align="center" style="font-weight: bold; border: 3px double red">表头</td>
                    <td align="center" style="font-weight: bold; border: 3px double red">表头2</td>
                </tr>
            </thead>
            <tbody style="text-align: center">
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容1</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容2</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容3</td>
                    <td>表格内容</td>
                </tr>
                            <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容3</td>
                    <td>表格内容</td>
                </tr>
                            <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容</td>
                    <td>表格内容</td>
                </tr>
                <tr>
                    <td>表格内容3</td>
                    <td>表格内容</td>
                </tr>
            </tbody>
            <tfoot style="display: table-footer-group; font-weight: bold">
                <tr>
                    <td colspan="2" align="center" style="font-weight: bold; border: 3px double blue">每页都有的表尾</td>
                </tr>
            </tfoot>
        </table>
        <input type="button" value=" 打 印 " onclick="javascript: window.print();">
    </body>
    </html>

     

    展开全文
  • Pagehelper分页详解文档

    万次阅读 2018-03-07 10:43:56
    引入分页插件引入分页插件有下面2种方式,推荐使用 Maven 方式。1). 引入 Jar 包你可以从下面的地址中下载最新版本的 jar 包...

    使用方法

    1. 引入分页插件

    引入分页插件有下面2种方式,推荐使用 Maven 方式。

    1). 引入 Jar 包

    你可以从下面的地址中下载最新版本的 jar 包

    由于使用了sql 解析工具,你还需要下载 jsqlparser.jar:

    2). 使用 Maven

    在 pom.xml 中添加如下依赖:

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>最新版本</version>
    </dependency>
    

    最新版本号可以从首页查看。

    2. 配置拦截器插件

    特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

    1. 在 MyBatis 配置 xml 中配置拦截器插件

    <!--
        plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
        properties?, settings?,
        typeAliases?, typeHandlers?,
        objectFactory?,objectWrapperFactory?,
        plugins?,
        environments?, databaseIdProvider?, mappers?
    -->
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="param1" value="value1"/>
    	</plugin>
    </plugins>
    

    2. 在 Spring 配置文件中配置拦截器插件

    使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <!-- 注意其他配置 -->
      <property name="plugins">
        <array>
          <bean class="com.github.pagehelper.PageInterceptor">
            <property name="properties">
              <!--使用下面的方式配置参数,一行配置一个 -->
              <value>
                params=value1
              </value>
            </property>
          </bean>
        </array>
      </property>
    </bean>
    

    3. 分页插件参数介绍

    分页插件提供了多个可选参数,这些参数使用时,按照上面两种配置方式中的示例配置即可。

    分页插件可选参数如下:

    • dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。

    下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。

    1. helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
      oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
      特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
      你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

    2. offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

    3. rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。

    4. pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。

    5. reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

    6. params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

    7. supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest

    8. autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五

    9. closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

    重要提示:

    当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。

    4. 如何选择配置这些参数

    单独看每个参数的说明可能是一件让人不爽的事情,这里列举一些可能会用到某些参数的情况。

    场景一

    如果你仍然在用类似ibatis式的命名空间调用方式,你也许会用到rowBoundsWithCount, 分页插件对RowBounds支持和 MyBatis 默认的方式是一致,默认情况下不会进行 count 查询,如果你想在分页查询时进行 count 查询, 以及使用更强大的 PageInfo 类,你需要设置该参数为 true

    注: PageRowBounds 想要查询总数也需要配置该属性为 true

    场景二

    如果你仍然在用类似ibatis式的命名空间调用方式,你觉得 RowBounds 中的两个参数 offset,limit 不如 pageNum,pageSize 容易理解, 你可以使用 offsetAsPageNum 参数,将该参数设置为 true 后,offset会当成 pageNum使用,limit 和 pageSize 含义相同。

    场景三

    如果觉得某个地方使用分页后,你仍然想通过控制参数查询全部的结果,你可以配置 pageSizeZero 为 true, 配置后,当 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果。

    场景四

    如果你分页插件使用于类似分页查看列表式的数据,如新闻列表,软件列表, 你希望用户输入的页数不在合法范围(第一页到最后一页之外)时能够正确的响应到正确的结果页面, 那么你可以配置 reasonable 为 true,这时如果 pageNum<=0 会查询第一页,如果 pageNum>总页数 会查询最后一页。

    场景五

    如果你在 Spring 中配置了动态数据源,并且连接不同类型的数据库,这时你可以配置 autoRuntimeDialect 为 true,这样在使用不同数据源时,会使用匹配的分页进行查询。 这种情况下,你还需要特别注意 closeConn 参数,由于获取数据源类型会获取一个数据库连接,所以需要通过这个参数来控制获取连接后,是否关闭该连接。 默认为 true,有些数据库连接关闭后就没法进行后续的数据库操作。而有些数据库连接不关闭就会很快由于连接数用完而导致数据库无响应。所以在使用该功能时,特别需要注意你使用的数据源是否需要关闭数据库连接。

    当不使用动态数据源而只是自动获取 helperDialect 时,数据库连接只会获取一次,所以不需要担心占用的这一个连接是否会导致数据库出错,但是最好也根据数据源的特性选择是否关闭连接。

    3. 如何在代码中使用

    阅读前请注意看重要提示

    分页插件支持以下几种调用方式:

    //第一种,RowBounds方式的调用
    List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
    
    //第二种,Mapper接口方式的调用,推荐这种使用方式。
    PageHelper.startPage(1, 10);
    List<Country> list = countryMapper.selectIf(1);
    
    //第三种,Mapper接口方式的调用,推荐这种使用方式。
    PageHelper.offsetPage(1, 10);
    List<Country> list = countryMapper.selectIf(1);
    
    //第四种,参数方法调用
    //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    public interface CountryMapper {
        List<Country> selectByPageNumSize(
                @Param("user") User user,
                @Param("pageNum") int pageNum,
                @Param("pageSize") int pageSize);
    }
    //配置supportMethodsArguments=true
    //在代码中直接调用:
    List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);
    
    //第五种,参数对象
    //如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
    //有如下 User 对象
    public class User {
        //其他fields
        //下面两个参数名和 params 配置的名字一致
        private Integer pageNum;
        private Integer pageSize;
    }
    //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    public interface CountryMapper {
        List<Country> selectByPageNumSize(User user);
    }
    //当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
    List<Country> list = countryMapper.selectByPageNumSize(user);
    
    //第六种,ISelect 接口方式
    //jdk6,7用法,创建接口
    Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
        @Override
        public void doSelect() {
            countryMapper.selectGroupBy();
        }
    });
    //jdk8 lambda用法
    Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());
    
    //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
    pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
        @Override
        public void doSelect() {
            countryMapper.selectGroupBy();
        }
    });
    //对应的lambda用法
    pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());
    
    //count查询,返回一个查询语句的count数
    long total = PageHelper.count(new ISelect() {
        @Override
        public void doSelect() {
            countryMapper.selectLike(country);
        }
    });
    //lambda
    total = PageHelper.count(()->countryMapper.selectLike(country));
    

    下面对最常用的方式进行详细介绍

    1). RowBounds方式的调用

    List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));
    

    使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。

    分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页

    关于这种方式的调用,有两个特殊的参数是针对 RowBounds 的,你可以参看上面的 场景一 和 场景二

    注:不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数,例如:

    //这种情况下也会进行物理分页查询
    List<Country> selectAll(RowBounds rowBounds);  
    

    注意: 由于默认情况下的 RowBounds 无法获取查询总数,分页插件提供了一个继承自 RowBounds 的 PageRowBounds,这个对象中增加了 total 属性,执行分页查询后,可以从该属性得到查询总数。

    2). PageHelper.startPage 静态方法调用

    除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。

    在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

    例一:
    //获取第1页,10条内容,默认查询总数count
    PageHelper.startPage(1, 10);
    //紧跟着的第一个select方法会被分页
    List<Country> list = countryMapper.selectIf(1);
    assertEquals(2, list.get(0).getId());
    assertEquals(10, list.size());
    //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>
    assertEquals(182, ((Page) list).getTotal());
    
    例二:
    //request: url?pageNum=1&pageSize=10
    //支持 ServletRequest,Map,POJO 对象,需要配合 params 参数
    PageHelper.startPage(request);
    //紧跟着的第一个select方法会被分页
    List<Country> list = countryMapper.selectIf(1);
    
    //后面的不会被分页,除非再次调用PageHelper.startPage
    List<Country> list2 = countryMapper.selectIf(null);
    //list1
    assertEquals(2, list.get(0).getId());
    assertEquals(10, list.size());
    //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
    //或者使用PageInfo类(下面的例子有介绍)
    assertEquals(182, ((Page) list).getTotal());
    //list2
    assertEquals(1, list2.get(0).getId());
    assertEquals(182, list2.size());
    
    例三,使用PageInfo的用法:
    //获取第1页,10条内容,默认查询总数count
    PageHelper.startPage(1, 10);
    List<Country> list = countryMapper.selectAll();
    //用PageInfo对结果进行包装
    PageInfo page = new PageInfo(list);
    //测试PageInfo全部属性
    //PageInfo包含了非常全面的分页属性
    assertEquals(1, page.getPageNum());
    assertEquals(10, page.getPageSize());
    assertEquals(1, page.getStartRow());
    assertEquals(10, page.getEndRow());
    assertEquals(183, page.getTotal());
    assertEquals(19, page.getPages());
    assertEquals(1, page.getFirstPage());
    assertEquals(8, page.getLastPage());
    assertEquals(true, page.isFirstPage());
    assertEquals(false, page.isLastPage());
    assertEquals(false, page.isHasPreviousPage());
    assertEquals(true, page.isHasNextPage());
    

    3). 使用参数方式

    想要使用参数方式,需要配置 supportMethodsArguments 参数为 true,同时要配置 params 参数。 例如下面的配置:

    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="supportMethodsArguments" value="true"/>
            <property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/>
    	</plugin>
    </plugins>
    

    在 MyBatis 方法中:

    List<Country> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNumKey") int pageNum,
            @Param("pageSizeKey") int pageSize);
    

    当调用这个方法时,由于同时发现了 pageNumKey 和 pageSizeKey 参数,这个方法就会被分页。params 提供的几个参数都可以这样使用。

    除了上面这种方式外,如果 User 对象中包含这两个参数值,也可以有下面的方法:

    List<Country> selectByPageNumSize(User user);
    

    当从 User 中同时发现了 pageNumKey 和 pageSizeKey 参数,这个方法就会被分页。

    注意:pageNum 和 pageSize 两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。

    3). PageHelper 安全调用

    1. 使用 RowBounds 和 PageRowBounds 参数方式是极其安全的
    RowBounds:行范围
    2. 使用参数方式是极其安全的
    3. 使用 ISelect 接口调用是极其安全的

    ISelect 接口方式除了可以保证安全外,还特别实现了将查询转换为单纯的 count 查询方式,这个方法可以将任意的查询方法,变成一个 select count(*) 的查询方法。

    4. 什么时候会导致不安全的分页?

    PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。

    只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。

    如果代码在进入 Executor 前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到 MappedStatement 时), 这种情况由于线程不可用,也不会导致 ThreadLocal 参数被错误的使用。

    但是如果你写出下面这样的代码,就是不安全的用法:

    PageHelper.startPage(1, 10);
    List<Country> list;
    if(param1 != null){
        list = countryMapper.selectIf(param1);
    } else {
        list = new ArrayList<Country>();
    }
    

    这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

    上面这个代码,应该写成下面这个样子:

    List<Country> list;
    if(param1 != null){
        PageHelper.startPage(1, 10);
        list = countryMapper.selectIf(param1);
    } else {
        list = new ArrayList<Country>();
    }
    

    这种写法就能保证安全。

    如果你对此不放心,你可以手动清理 ThreadLocal 存储的分页参数,可以像下面这样使用:

    List<Country> list;
    if(param1 != null){
        PageHelper.startPage(1, 10);
        try{
            list = countryMapper.selectAll();
        } finally {
            PageHelper.clearPage();
        }
    } else {
        list = new ArrayList<Country>();
    }
    

    这么写很不好看,而且没有必要。

    展开全文
  • 将多个word文档合并到一个文档分页(Aspose.words库)  将多个word文档(doc/docx)合并到一个word文档,就像很多人写书,合成一本;包含分页效果和不分页。代码贴上: WordQuery接口:主要通过路径获取word文档...
  • /** * 生成导出word */ @RequestMapping("/dcWord1") public @ResponseBody void dcWord1(@RequestParam Map<String, Object> pMap,HttpServletRequest request,HttpServletResponse response){ ...
  • 问:怎么把word文档里已经有的分页符去掉? 答:先在工具――>选项――>视图――>格式标记,选中全部,然后就能够看到分页符,delete就ok了。 5.问:Word中下标的大小可以改的吗? 答:格式―字体 6.问:Word里怎么...
  • 本文实例讲述了使用PHPWord生成word文档的方法。分享给大家供大家参考,具体如下: ...自动加载 安装好phpword后,新建一个php文档,引入autoload.php。 require 'vendor/autoload.php'; 实例化 实例化并新增一个空
  • 网页报表表格自动分页打印 超好

    热门讨论 2010-08-20 15:23:24
    网页表格默认打印 分页会断开,很难看. 本人研究2天才解决 设置a4纸页边距为13mm,打印预览该网页看看,分页完美 如果你的打印效果不对, 可能需要改一下里面的参数,反正原理肯定对的
  • 超级预载器 安装和文件 文档 安装 兼容性 + / Firefox + Violentmonkey / Greasemonkey 4 / + Chrome / ...自动加载分页网页的用户脚本。 它将根据规则将页面连接在一起。 该脚本来自https://greasyfork.or
  • 最近因为工作中的一个需求,需要针对用户数据页面进行分页并截屏并返回 PDF 文件,期间用到了 puppeteer 与 HTML 分页算法,还找到了一个不错的插件,于是来聊些其中遇到的趣事,先附上目录。 一、利用 puppeteer ...
  • mybatis分页插件文档

    2019-05-25 16:25:16
    分页插件可选参数如下: 1. dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。 下面...
  • qt 生成pdf ,自动分页

    2015-06-12 00:47:27
    各位大神,在qt中,我想实现将txt文档数据导入到pdf,用drawtext函数实现。 但是,当txt里面的数据较多的时候,pdf在一页中不能全都显示,这时我应该怎么 添加新页,显示剩余的内容呢! printer_text.newPage();//...
  • 只需要选中文字,在标尺处点击想要对齐到的位置:然后使用Tab键就能完成内容的对齐:一键处理标题、分页在内容超多的文档中,我们总会需要统一标题的字体、大小等等,你会怎么操作?一定也是逐个的选中,再进行调整...
  • 首先贴图: 大概是这样的,可以动态设置打开的路径 ... <h1><a href="javascript:void(0)" target="_blank" onclick...显示pdf文档</a></h1> <div id="container" style="display: none;">...
  • 一款超好用的pc端分页控件,兼容各个版本的浏览器!! 文档说明: 参数名 参数类型 可选参数 说明 allPage number 自定义数字 默认值:12。总页数:页码器总共多少页。 showPage number 自定义数字 默认值:5。显示...
  • 目录修订历史环境安装0.Python-docx新建文档1.Python-docx编辑已存在文档2.win32com将doc转为docx3.win32com操作word3.1 打开新的word文档并添加内容3.2 打开已存在word文档并添加内容3.3 转换word为pdf4.Python-...
  • JasperReports 取消自动分页/忽略分页

    千次阅读 2014-08-31 18:11:58
    因为需要将合同比价单由PDF文档形式改为HTML页面方式,虽然转换文档类型了,但是发现...后来才意识到是自动分页引起的。那就取消自动分页或忽略分页就行了。 方法:将报表属性“Ignore pagination ”的勾打上即可。
  • 1 使用详解 (1)InsertNode() 说明:在当前位置插入元素。...在文档末尾插入分页符。 Document doc=new Document("test.doc"); DocumentBuilder builder =new DocumentBuiler(); //移动至文档结尾 builder.T
  • SpringBoot接口文档自动生成

    万次阅读 2018-06-18 13:25:47
    它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个...
  • JODConverter(用于Java OpenDocument Converter)使用LibreOffice或OpenOffice.org自动执行文档转换。 :warning: 该存储库不再维护 :warning: 请改用或其他主动维护的fork。 历史 我从2003年开始这个项目,并于...
  • 不过在实际应用中,我需要打印的是弹框中的内容,使用原生的方法打印,页面的样式无法调整,故放弃使用这个方法。 方法2、jqprint插件  项目中引用jQuery不方便,也没有找到具体文档,所以这个方法还没试过。 ...
  • 即使到达文档的最后一页,它也将继续循环播放 我不确定这是否会导致整个内容按预期缓存,需要更多测试 安装 克隆此仓库 在Chrome中,转到chrome:// extensions,打开开发人员模式,然后单击“加载解压缩”,然后...
  • 分页器 在drf中有三种分页器,分别是PageNumberPagination,LimitOffsetPagination,CursorPagination PageNumberPagination分页器 class MyPageNumberPagination(PageNumberPagination): page_size=3 #每页条数 ...
  • C++通过adobe打印PDF文件 实现分页打印 全部打印等功能 具体请看OCX中的方法
  • DocumentAssistant 目前Document Assistant 插件已经上传到 Intellij IDE ...今天先介绍一下我的新开发的一个插件,之前看了很多自动生成文档的各个方案。但是想0侵入性是不可能的,但是今天我希望通过intellij ...
  • Word邮件合并时根据指定条件分页

    千次阅读 2019-12-21 15:30:20
    邮件合并选择文档为“目录”,因为这种模式不会自动分页,信函什么的是一条数据一个文档(或分页),标签模式格式不好设置。 在Word中添加if then域,判断指定值为1时则添加分页符,否则不添加内容 数据源 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,963
精华内容 26,785
关键字:

怎样调整文档的自动分页