【web层的增删改查以及分页查询 04】

项目开发:

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);
    }
}

客户端验证分页

 

 

 

 

 

 

 

 

 



 

【web层的增删改查以及分页查询 04】

上一篇:冬季实战营第三期:MySQL数据库进阶实战--总结


下一篇:Upload-labs 文件上传靶场通关攻略(下)