PageHelper简单使用说明

Mybatis分页插件 - PageHelperPageHelper是一款最方便使用的分页插件之一。支持各种数据库实现物理分页。开源地址:https://github.com/pagehelper/Mybatis-PageHelper开源中国主页:https://www.oschina.net/p/mybatis_pagehelper依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version></dependency>xml中配置在sqlSessionFactory中加入pageHelper插件的配置<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 传入PageHelper的插件 --> <property name="plugins"> <array> <!-- 传入插件的对象 --> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <props> <prop key="helperDialect">mysql</prop> <prop key="reasonable">true</prop> </props> </property> </bean> </array> </property> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath*:ssm/mapper/*.xml"></property></bean>SpringBoot中配置依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version></dependency>配置pagehelper: # dialect: ① # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式(可以不设置) helper-dialect: mysql # 上面数据库设置后,下面的设置为true不会改变上面的结果(默认为true) auto-dialect: true page-size-zero: false # ② reasonable: true # ③ # 默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。(一般用不着) offset-as-page-num: false # 默认值为 false,RowBounds是否进行count查询(一般用不着) row-bounds-with-count: false #params: ④ #support-methods-arguments: 和params配合使用,具体可以看下面的讲解 # 默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 auto-runtime-dialect: false # ⑤ # 与auto-runtime-dialect配合使用 close-conn: true # 用于控制默认不带 count 查询的方法中,是否执行 count 查询,这里设置为true后,total会为-1 default-count: false #dialect-alias: ⑥代码中使用PageHelper.startPage(page, pageSize);//这里使用 PageHelper.offsetPage(page, pageSize);亦可PageInfo pageInfo = new PageInfo<>(testMapper.findAll(Test));返回的PageInfo中可获取总条数及当且页数据pageInfo.getTotal() //总条数pageInfo.getList() //页面数据或使用Page强转亦可Page page=(Page)testMapper.findAll(Test);page.getTotal();//总条数page.getResult();//页面数据从以下源码可以看出来startPage可选参数更加丰富 /** * 开始分页 * * @param pageNum 页码 * @param pageSize 每页显示数量 * @param count 是否进行count查询 * @param reasonable 分页合理化,null时用默认配置 * @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置 */ public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) { Page<E> page = new Page<E>(pageNum, pageSize, count); page.setReasonable(reasonable); page.setPageSizeZero(pageSizeZero); //当已经执行过orderBy的时候 Page<E> oldPage = getLocalPage(); if (oldPage != null && oldPage.isOrderByOnly()) { page.setOrderBy(oldPage.getOrderBy()); } setLocalPage(page); return page; } /** * 开始分页 * * @param offset 页码 * @param limit 每页显示数量 * @param count 是否进行count查询 */ public static <E> Page<E> offsetPage(int offset, int limit, boolean count) { Page<E> page = new Page<E>(new int[]{offset, limit}, count); //当已经执行过orderBy的时候 Page<E> oldPage = getLocalPage(); if (oldPage != null && oldPage.isOrderByOnly()) { page.setOrderBy(oldPage.getOrderBy()); } setLocalPage(page); return page; }分页插件可选参数如下:dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。重要提示:当 offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。其他说明可参考:https://blog.csdn.net/qq_38375620/article/details/79467545

Tomcat 9.0.x在idea控制台显示乱码

按网上教程在所有能加VM options地方加上了-Dfile.encoding=UTF-8但是还是不行,后来想到还是应该改tomcat,修改conf/logging.properties文件中UTF-8为GBK就不乱码了,具体改成什么编码自己试试,或者将这行注释试试,修改完配置文件重新启动项目即可。java.util.logging.ConsoleHandler.encoding = UTF-8

Jrebel热部署注意事项

Jrebel热部署注意事项激活后可将JRebel设置为offline模式 点一下work offline使其不联网可用(激活移步https://cway.top/post/593.html)相关设置此时虽然安装好了JRebel并成功激活了,但是我们使用JRebel debug的时候,发现修改代码后,热部署不起作用。因为还需要设置两个地方1、设置项目自动编译Setting->Build,Execution…->Compiler中勾选Build project automatically2、设置 compiler.automake.allow.when.app.runningctrl+shift+A 或者 help->find action…打开搜索registry找到 compiler.automake.allow.when.app.running 并✔

黑马Java代码生成器

可根据数据库生成指定模板的代码,只要模板够多没有什么生成不了(以下模板来自网络)。目前收集的模板如下:下载地址:https://hik.lanzoui.com/iyU3Thbupud源码地址:https://gitee.com/chuanzhiliubei/codeutil

黑马Java代码生成器

Mybatis通用Mapper使用

通用Mapper:为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,Mybatis无需生成基础mapper.xml,只要写好实体类,就能支持相应的增删改查方法。tk.mybatis通用依赖<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.0</version></dependency>在dao中直接继承Mapper即可import cn.test.pojo.ApplyOperateRecord;import tk.mybatis.mapper.common.Mapper;public interface ApplyOperateRecordMapper extends Mapper<ApplyOperateRecord> {}详细可参考https://www.cnblogs.com/mzywucai/p/11053360.html或者使用Mybatis Plus依赖<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>Latest Version</version></dependency>或<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version></dependency>继承BaseMapperimport com.baomidou.mybatisplus.mapper.BaseMapper;import com.test.ftd.entity.Resume;public interface ResumeMapper extends BaseMapper<Resume>{}

Optional解决判断Null为空的问题

https://blog.csdn.net/zjhred/article/details/84976734

JSP中Date指定时间格式显示

首先引入标签库<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>示例代码<fmt:formatDate value="${res.startTime}" pattern="yyyy-MM-dd" />这样就不用后端再SQL查询出指定时间格式字符串了

IDEA一键删除所有代码注释方法

很简单,Ctrl+R使用正则替换,不仅IDEA,notepad++之类支持正则表达式的编辑器都可以。搜索如下正则替换为空串即可。替换 /** .. */与//注释(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|[ \t]*//.*)只替换多行注释(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)

命令行/IDEA根据wsdl生成WebService客户端以及接口调用

首先需配置wsdl环境1、在官网下载环境包或直接在网盘下载:https://hik.lanzoux.com/iKZ0tgloirg2、解压后配置环境变量(以你解压实际路径为准):在CLASSPATH中添加 D:\apache-cxf-3.3.7\lib;新建CXF_HOME D:\apache-cxf-3.3.7在PATH中添加 D:\apache-cxf-3.3.7\bin3、cmd中输入wsdl2java -v返回版本号说明环境配置成功命令行生成webservice客户端wsdl2java -d D:\webserviceClient -p top.cway.testWebServiceClient http://cway.top?WSDL-d后为生成代码保持路径,-p为代码保存的包路径,最后的地址为webservice服务端地址,一般要加?WSDL获取其接口信息。IDEA生成webService客户端首先鼠标选择项目中的一个包,然后点击顶部菜单栏 Tools->WebServices->Generate Java Code From Wsdl  ,然后输入服务端地址,选cxf生成即可优点:idea生成的优点是其自动生成了直接可供测试的client代码,而命令行生成的需要自己写测试类调用接口。调用示例与问题示例接口(根据手机号码查询归属地的)http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl大家可根据该接口生成代码进行测试。这里,IDEA生成了get/post/soap三种形式的client,经本地测试只有soap的可使用,可见IDEA还是很方便的。当参数为一般类型还好办,但是参数为Holder怎么传值呢?例如@WebParam(mode = WebParam.Mode.INOUT, name = "MyData", targetNamespace = "")javax.xml.ws.Holder<TableOfData> myData调用时填充参数示例//创建holderHolder<TableOfData> myData = new Holder<TableOfData>();//创建以上泛型对象TableOfData tableOfData = new TableOfData();//定义holder值为上述对象myData.value = tableOfData;//TableOfData对象中有个list属性,用item进行赋值List zlist = new ArrayList<>();tableOfData.item = zlist;

注解@Builder和@Accessors 简化get/set方法

使用前的准备@Builder和@Accessors都是lombok下的注解,都可以用于简化get/set方法。要使用Lombok,需要添加插件并导入依赖。插件直接在IDEA的settings-Plugins中搜索lombok,下载后重启IDEA即可,依赖如下:<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.10</version></dependency>@Builder注解@Builder 注解可以更方便的在对象初始化的时候对属性进行赋值,不用大量的调用 setter 方法,代码更易于阅读与编写。@Data@Builder@NoArgsConstructorpublic class User {    String name;    String address;   public static void main(String[] args) {        //builder方式赋值。取值仍然要通过get。        User user=new User().builder().name("teacher").address("河南省").build();        //set方式赋值        user.setName("student");        user.setAddress("北京市");    }}上述在使用中会报错,会提示“不应该通过类实例访问静态成员”,直接用类名调用即可,例如:User user=User.builder().name("teacher").address("河南省").build();@Accessors注解@Accessors 有3个值:flunt,chain,prefix;fluent ,Boolean类型,默认false,且flunt为true,则chain默认为true。如果为true,name的getter就是 name(),setter方法就是name(T newValue)。chain ,Boolean类型,默认false,且flunt为true,则chain默认为true。如果为true,产生的setter返回的this即对象实例本身而不是void,因此可以直接再使用set方法或者调用其他函数。prefix ,一系列string类型。如果显示,属性必须加上某些定义的前缀。前缀被提取出来后才是属性名。字符都是字母,紧接着前缀后的字符一定不能是小写字母。例如,pepper对前缀p不是相等匹配,而跟pEpper是匹配的(也就意味着属性的基本名字是epper)。注意:@Accessors注解可以在类和属性上使用。如果@Accessors注解在一个属性上,再对那个属性的类的@Accessors注解就会被忽略。@Data@Accessors(fluent = true)    @NoArgsConstructorpublic class User {    String name;    String Address;    public static void main(String[] args) {        //accesstor flunt=true,此时默认chain=true        User user=new User().name("teacher").Address("河北"); //赋值,类似set方法        String address=user.Address();                       //取值,类似get方法    }}@Data@Accessors(chain = true)@NoArgsConstructorpublic class User {    String name;    String Address;    public static void main(String[] args) {        //accesstor  chain=true,未设置flunt,默认flunt=false        User user=new User().setName("teacher").setAddress("河北"); //赋值,类似set方法        String address=user.getAddress();                       //取值,类似get方法    }}