项目开发:
1、前期的准备工作:
--开发底层通用组件
上节课我们已经开发了返回状态码的共用组件:CommonResult -->code,message,data
2、对应dao类和Mapper.xml文件的几种方式
-- 在dao类前面加上@Mapper
-- 在配置类/启动类前面加上@MapperScan("com.wufq.aitesting.mapper") -->这个注解可以加到任何类前面
作用是:映射mapper包下面的UserMapper类
一、Controller实现以下几种功能
1、查询单个用户信息
2、查询所有用户信息
3、添加用户
4、修改用户
5、删除用户
6、分页查询用户
具体代码:
package com.example.demo.controller; import com.example.demo.common.CommonCode; import com.example.demo.common.CommonResult; import com.example.demo.model.TUser; import com.example.demo.service.TUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * 前端控制器 * </p> * * @author wufq * @since 2021-07-10 */ @RestController @RequestMapping("/tUser") public class TUserController { //定义一个日志对象 private static final Logger LOGGER = LoggerFactory.getLogger(TUserController.class); @Autowired private TUserService tUserService; //1、查询单个用户信息 //@RequestMapping表示接受用户传过来的数据,并且是已json的形式;{id}:大括号是占位符,前端不知道传过来是个什么数字,可以用占位符表示 @RequestMapping(value="/{id}",method = RequestMethod.GET) //@PathVariable Long id 接受传过来id,这个id会把占位符得到id替换掉,路径变量 public CommonResult<TUser> getUserById(@PathVariable Long id){ return CommonResult.success(tUserService.getById(id)); } //2、查询所有用户信息 @RequestMapping(value="/listAll",method = RequestMethod.GET) public CommonResult<List<TUser>> getUserList(){ return CommonResult.success(tUserService.list()); } //3、添加用户 @RequestMapping(value="/create",method = RequestMethod.POST) public CommonResult<TUser> createUser(@RequestBody TUser user){ CommonResult<TUser> commonResult; Boolean result = tUserService.save(user); //注意细节:这时候的user是没有id的,后面的几个user因为保存到数据了,所有有id,id是数据库内自动生成的id if(result){ commonResult=CommonResult.success(user); //{}占位符,输出user对象,以便调试 LOGGER.debug("添加成功:{}",user); }else { commonResult = CommonResult.failed(CommonCode.FAILURE); LOGGER.debug("添加失败:{}",user); } return commonResult; } //4、修改用户 @RequestMapping(value="/update",method = RequestMethod.PUT) public CommonResult<TUser> updateUser(@RequestBody TUser user){ CommonResult<TUser> commonResult; Boolean result = tUserService.updateById(user); if(result){ commonResult=CommonResult.success(user); }else { commonResult = CommonResult.failed(CommonCode.FAILURE); } return commonResult; } //5、删除用户 @RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE) public CommonResult<TUser> deleteUser(@PathVariable Long id){ CommonResult<TUser> commonResult; Boolean result = tUserService.removeById(id); if(result){ commonResult=CommonResult.success(null); LOGGER.debug("删除成功:{}",id); }else { commonResult = CommonResult.failed(CommonCode.FAILURE); LOGGER.debug("删除失败:{}",id); } return commonResult; } //6、分页查询用户 }
上面的代码没有写分页查询,后面单独写
------------分页查询--------
返回的同样是Commonesult类型,Commonesult主要包含:
code
message
data返回的数据 --->每一个结果都不一样
:user--单条数据
:list--所有(符合条件)数据
:null--没有数据
:Page对象的数据赋值到commonPage对象 --指定某个范围的数据
分页查询code,message不变,data是改变的
分页包含哪些信息:
页码(第几页):比如第10页
每页条数:比如10条
总页数:总条数/每页条数,比如12页
总条数:比如120条
数据:每一页页面展示的数据,list
设计完以后,前端需要传什么?第几页和每页显示多少条。而其他的总条数,总页数,数据都是数据库算出来的
1、首先在common包下创建一个通用页面类:CommonPage -->这个类的主要作用是把mybatis的Page类内的页面内容(页码,总条数等等)封装到CommonPage形成自定义的对象,然后在data里面显示
public class CommonPage<T> { private Integer pageNum; //页码 private Integer pageSize;//每页条数 private Integer totalPage;//总页数 private Long total; //总条数 private List<T> list; //保存数据的对象 /* * 怎么去创建对象呢,让用户传进来一个多少页啊,每一页显示多少数据啊,mybatis本身就提供一个IService类page方法 * 我们先写TUserController的分页查询方法 listUser */ /* * 把Page的信息封装到CommonPage类里面 * @param: pageResult 因为把Page里面的信息搬到CommonPage类里面,所以参数是Page类型 * @Return: */ public static <T> CommonPage<T> restPage(Page<T> pageResult){ //里面做的事情,创建一个CommonPage对象,然后把Page的信息传进来 CommonPage<T> commonPage = new CommonPage<>(); //PageNum是Integer类型,tCurrent是Long类型,所以用Convert.toInt()把long类型转换成Integer类型 commonPage.setPageNum(Convert.toInt(pageResult.getCurrent())); commonPage.setPageSize(Convert.toInt(pageResult.getSize())); commonPage.setTotal(pageResult.getTotal()); commonPage.setTotalPage(Convert.toInt(commonPage.getTotal()/commonPage.getPageSize())); commonPage.setList(pageResult.getRecords()); return commonPage; }
2、TUserController类
//6、分页查询用户 /* * * @param: pageNum 第几页 * @param: pageSize 每页条数 * @Return: CommonResult返回的是CommonPage对象,把页面的数据封装到了此对象内 */ @RequestMapping(value="/list",method = RequestMethod.GET) public CommonResult<CommonPage<TUser>> listUser (@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){ Page<TUser> userPage = tUserService.page(new Page(pageNum, pageSize)); //这么写是把Page里面的records等信息封装到了CommonResult里面,我们的目的是把页面的信息封装到自定义的CommonPage里面 //如何在CommonPage里面封装呢?这时候需要我们在CommonPage里面写一个静态方法 //return CommonResult.success(userPage); //CommonResult里面封装了CommonPage的数据 return CommonResult.success(CommonPage.restPage(userPage)); } }
这时候请求会发现没有分页,会把所有的数据都显示出来了,需要配置一个分页的bean实现分页,bean是Mybatis-plus提供的
3、编写一个配置类:config-->MybatisConfig类
package com.example.demo.config; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringBootConfiguration; import org.springframework.context.annotation.Bean; /** * @Description * @Author wufq * @Version * @Date 2021/7/17 14:54 */ /* * 这时候请求会发现没有分页,会把所有的数据都显示出来了,需要配置一个分页的bean实现分页,bean是Mybatis-plus提供的 * * 添加MyBatis-Plus的Java配置,使用@MapperScan注解配置好需要扫描的Mapper接口路径 * MyBatis-Plus自带分页功能,需要配置分页插件PaginationInterceptor */ //@SpringBootConfiguration 只要加上这个,会自动执行配置文件,如果是@Configuration会自动执行xml文件,一般推荐@SpringBootConfiguration @SpringBootConfiguration @MapperScan("com.example.demo.mapper") public class MybatisConfig { //加上bean会自动执行下面这段代码,执行后会返回paginationInterceptor对象,springboot拿着这个对象会自动进行分页 @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); //setCountSqlParser设置sql数量,JsqlParserCountOptimize sql优化器 paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } }
只要加上@SpringBootConfiguration,@Bean就能进行分页
举例说明配置类如何读取bean对象
package com.example.demo.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import java.util.HashMap; import java.util.Map; /** * @Description * @Author wufq * @Version * @Date 2021/7/17 18:18 */ @SpringBootConfiguration class Config{ @Bean public Map MyMap(){ Map map = new HashMap(); map.put("website","wufq.com"); map.put("company","wufq"); map.put("age",8); return map; } } @SpringBootApplication public class TestConfig { public static void main(String[] args){ //执行类根据配置类然后获取容器内所有的bean ConfigurableApplicationContext context = SpringApplication.run(TestConfig.class,args); //得到加载到容器中的bean函数名 Map map = (Map)context.getBean("MyMap"); int age =(int) map.get("age"); System.out.println("age==="+age); } }
客户端验证分页