1. 日志管理业务层开发
1. 分页
分页原理
-
分页在使用时的分类
- 物理分页:
- 在操作数据库中的表时,sql语句中使用了limit ?,?,此时sql语句返回的结果是分页结果
- 逻辑分页:
- 依赖程序的代码,其原理为:通过sql语句将数据库表中的所有数据都查询出,之后将数据保存在内存中,最终要显示的数据若涉及到分页,到内存中去查找数据返回.通过以上原理得出,逻辑分页在对数据库表的操作上没有limit
- 物理分页:
-
物理分页和逻辑分页的区别?
- 数据库压力:
- 物理分页对数据库查询操作次数多,数据库压力会更大点,相对而言,逻辑分页对数据库的压力会小
- 对服务器的压力:
- 物理分页对服务器的压力相对而言较小,逻辑分页因为要在内存存储大量数据,对服务器压力会大
- 什么情况应该选择哪种分页?
- 物理分页:数据量大,数据稳定性差时使用,来实现实时更新数据
- 逻辑分页:数据量小,数据稳定性高时使用,此时可以使用逻辑分页
- 数据库压力:
-
实际工作中分页的实现:
-
通常会使用插件:目前市面上使用率较高的是mybatis的插件PageHelper
-
PageHelper的使用:
-
需要导入该插件的依赖
-
在代码中使用PageHelper的api方法实现分页
-
-
2. 日志列表查询业务层代码
-
业务层代码逻辑和以上图片中的业务层逻辑相同
-
准备工作:
-
定义业务异常的包以及父类以及会出现的子类业务异常
- 父类:ServiceException – 定义在base包下
- 子类业务异常:在service包下创建ex包,在该包下定义PageIllegalException异常类
-
注意点:
-
重写父类方法的快捷键:Ctrl+O
-
类中如何生成序列版本号:
- File->settings->Inspections->ser…->找到如下选项,勾选,即让idea检查序列版本号
-
-
-
业务层开发步骤:
-
创建LogService接口以及实现类LogServiceImpl
-
添加PageHelper的依赖
-
在idea中采用idea的联想功能注入依赖
-
更新maven
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency>
-
-
在业务层实现类中写分页查询代码:
@Service public class LogServiceImpl implements LogService { @Autowired LogMapper logMapper; @Override public PageInfo<Log> findLogList(String userName, Integer pageNum, Integer pageSize) { //参数非空判断 if(pageNum==null || pageSize==null){ throw new PageIllegalException("查询日志列表异常!查询页码或每页显示数据量不能空!"); } PageHelper.startPage(pageNum,pageSize); //调用mapper中的方法查询日志列表 List<Log> list = logMapper.selectLogList(userName); PageInfo<Log> pageInfo = new PageInfo<>(list); return pageInfo; } }
-
写测试类,进行测试
@SpringBootTest public class LogServiceTest { @Autowired LogService logService; @Test public void findLogList(){ String userName = null; Integer pageNum = 1; Integer pageSize = 6; PageInfo<Log> info = logService.findLogList(userName,pageNum,pageSize); System.err.println(info); } }
-
PageHelper插件实现分页查询的原理:
- PageHelper插件分页的原理:
使用了拦截器,对mybatis中的query操作进行拦截
- PageHelper插件分页的原理:
-
-
控制台打印mybatis执行操作的sql语句
-
通过在yml文件中添加mybatis的配置信息来打印sql语句
mybatis: mapper-locations: classpath:mappers/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
可能遇到的问题:
- 若service测试类执行报空指针异常,检查@Service注解添加是否正确,要在Service实现类上方添加,不是接口上方添加
-
-
PageHelper分页插件的合理化功能:
-
场景:
-
由页面发起请求,请求某页的数据,会进行分页查询,页面通常都会传递一个页码值给服务器,页码值正确的应该是从1开始的正整数
-
比如:查询第1页,第2页,但是有可能出现查询第0页和查询的页码超过总页数,以上2种情况
日志列表查询,假设每页显示6条数据,表中共有30条数据,即共5页 此时,请求中有可能请求的是第0页的数据 也有可能出现查询的页码为第6页 此时,以上2种值我们视为不合理的值
-
-
-
合理化功能:
- 是指PageHelper插件在分页查询时,会对传递来的页码值进行合理化判断
- 若页码值<1,此时PageHelper将页码设置为1,
- 若页码值>total,此时pageHelper将页码值设置为最大页码
- 是指PageHelper插件在分页查询时,会对传递来的页码值进行合理化判断
-
PageHelper的合理化功能默认是关闭的,若要使用,必须通过配置来启动
pagehelper: reasonable: true 注意点:yml文件中key和vlaue之间必须间隔一个空格
1.1 然后在ServiceImplTest测试类中,进行-1页,第8页测试,看pageInfo对象中的页码值是否进行了合理化处理
-
另外,用PageHelper查到的PageInfo中信息很全,相关属性均可以在前端页面取出使用,十分方便,以下是Json格式的截图: