分页
分页原理
分页是将数据库中的数据进行分页展示,例如每一页只展示10几个记录。
分页一般有两种实现方式
1.逻辑方式:
从数据库获取数据,编写程序根据页面对应的页面码进行展示数据
适合小规模的分类
2.物理方式:
只从数据库取出这一页的数据(物理分页)
使用最多的方式
两种分页方法
- SQL分页法
- 语法
limit offset, size
其中offset是偏移量(不写默认是0),size是取出的条数
假定用户列表每页显示5条记录,则
第1页对应的SQL:
select * from t_user limit 5 或 select * from t_user limit 0,5
第2页对应的SQL:
select * from t_user limit 5,5
第3页对应的SQL:
select * from t_user limit 10,5
偏移量 = 页大小 (当前页码-1) ———>offset = size(page-1)
给UserDao类的查询操作绑定SQl语句
@Select("select * from t_user where status !=2 limit #{offset},5")
public List<User> getUserBypage(Integer offset);
创建UserController方法
@ResponseBody
@RequestMapping("/page")
public List<User> getUserBypage(Integer page) {
int size =5;
int offset = size*(page-1);
//去数据中根据id查询用户信息
List<User> userlist = userDao.getUserBypage(offset);
return userlist;
}
运行截图:
为防止用户不输入参数出现指针错误
可以加入@RequestParam(defaultValue=“1”) 给查询页设置默认值1。
- PageHelper分页
PageHelper是针对Mybatis分页的第三方插件
支持任何复杂的单表、多表分页
紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页
在pom.xml中加入pagehelper启动器依赖
<!--pagehelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
给UserDao类的查询操作绑定SQl语句
@Select("select * from t_user where status !=2)
public List<User> getUserBypage();
创建UserController方法
@ResponseBody
@RequestMapping("/page")
public List<User> getUserBypage(@RequestParam(defaultValue="1")Integer page,
@RequestParam(defaultValue="4")Integer size) {
PageHelper.startPage(page,size);
//去数据中根据id查询用户信息
List<User> userlist = userDao.getUserBypage();
return userlist;
}
每页获取4个数据
使用Page方法接收返回值
@ResponseBody
@RequestMapping("/page")
public Object getUserBypage(@RequestParam(defaultValue="1")Integer page,
@RequestParam(defaultValue="4")Integer size) {
Page<User> pa = PageHelper.startPage(page,size);
//去数据中根据id查询用户信息
List<User> userlist = userDao.getUserBypage();
return pa.toPageInfo();
}
结果返回结果包含返回数据条数统计以及数据库数据条数统计等:
{
“total”: 10,
“list”: [
{
“id”: 9,
“username”: “zhonglele”,
“password”: “123”,
“realName”: “zhong”,
“phone”: “13433334433”,
“email”: “zhong@qq.com”,
“status”: 1,
“tx”: “tx4.jpg”,
“birthday”: “2002-03-01 21:56:59.0”
},
{
“id”: 10,
“username”: “zhonglele”,
“password”: “123”,
“realName”: “zhong”,
“phone”: “13433334433”,
“email”: “zhong@qq.com”,
“status”: 1,
“tx”: “tx4.jpg”,
“birthday”: “2002-03-01 21:56:59.0”
}
],
“pageNum”: 3,
“pageSize”: 4,
“size”: 2,
“startRow”: 9,
“endRow”: 10,
“pages”: 3,
“prePage”: 2,
“nextPage”: 0,
“isFirstPage”: false,
“isLastPage”: true,
“hasPreviousPage”: true,
“hasNextPage”: false,
“navigatePages”: 8,
“navigatepageNums”: [
1,
2,
3
],
“navigateFirstPage”: 1,
“navigateLastPage”: 3,
“lastPage”: 3,
“firstPage”: 1
}
校验
- 在信息输入过程中,我们需要对信息的内容进行相关的约束,例如电话号码必须是11位,限制用户名长度为6到10等。
校验分为前端校验和后端校验
- 前端校验
前端校验利用HTML或JavaScript的功能在参数提交之前进行校验
前端校验没有和服务器交互,速度快,用户体验好
前端校验是不安全的,可以被绕过,容易被小人利用- 后端校验
后端校验是在与数据库交互前完成校验,安全性高
数据校验类型
根据不同的要求将数据校验类型分为两大类
- 数据格式校验
例如: 非空校验,长度校验,手机格式- 数据逻辑校验
例如:用户名重复,余额不足,日期超时,账户不存在
后端校验两种方法
- 使用if~else语句进行校验
在UserController方法内部添加条件约束
@ResponseBody
@PostMapping("/add") //必须用post方式提交
public Result addUser( User user) {
//添加条件
if(user.getUsername().trim().length()<6
||user.getUsername().trim().length()>10) {
Result r = new Result();
r.setCode(4002);
r.setMsg("用户名不符合规则!");
return r;
}
userDao.insertUser(user); //插入数据库
Result r = new Result();
r.setCode(2000);
r.setMsg("新增用户成功!");
return r;
}
显然这种方法会使得我们的UserController变得不美观,代码量也非常大。
2. JSR-303校验
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,里面规定了使用注解进行校验的方式
引入依赖
<!-- JSR303校验-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 在接收参数的JavaBean的字段上使用@NotNull、@NotBlank、@Size等注解设置校验规则
@NotBlank(message ="用户不能为空")
@Size(min = 6, max =11, message = "用户名在6~11个字符之间")
private String username;
- 在Controller的方法上,声明形参时加上@Valid开启校验
@ResponseBody
@PostMapping("/add") //必须用post方式提交
public Result addUser(@Valid User user) {
// //添加条件
// if(user.getUsername().trim().length()<6
// ||user.getUsername().trim().length()>10) {
// Result r = new Result();
// r.setCode(4002);
// r.setMsg("用户名不符合规则!");
// return r;
// }
userDao.insertUser(user); //插入数据库
Result r = new Result();
r.setCode(2000);
r.setMsg("新增用户成功!");
return r;
}
- 当参数不符合规则时,会抛出异常,Controller的方法不会执行
验证手机位数等,我们需要用到正则表达式
绑定@Pattern注解
@Pattern(regexp = “^1(?:3\d 4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$”,message = “手机号码不正确”)
校验规格表:
- 我们还可以使用数据库校验的方法
在数据库中设置约束条件,如:
主键约束Primay Key Coustraint,
唯一约束Unique Counstraint,
非空约束Not Null Counstraint,
外键约束Foreign Key Counstraint,
默认约束Default Value Counstraint
统一异常处理
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object methodArgumentNotValidException(MethodArgumentNotValidException e){
return Result.failure(e.getMessage());
}