SpringBoot实战第四天

新增棋子

接口文档

从接口文档读取请求方式,响应数据类型等,战斗,爽!

没什么新东西,先上实体类

@Data
public class Chess {
    private Integer id;//主键ID
    private String ChessName;//棋子名
    private String content;//简介
    private String coverImg;//棋子图标
    private String state;//发布状态 已发布|草稿
    private Integer categoryId;//棋子分类id
    private Integer createUser;//创建人ID
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
    private int cost;//棋子费用
    private String chessClass;//棋子种族
    private String chessOrigin;//棋子特性
}

Controller层(参数校验下一步做)

@RestController
@RequestMapping("/chess")
public class ChessController {

    @Autowired
    private ChessService chessService;


    @PostMapping
    public Result add(@RequestBody Chess chess){
        chessService.add(chess);
        return Result.success();
    }

}

Srivice层

@Mapper
public interface ChessMapper {

    @Insert("insert into chess(chess_name,content,cover_img,state,category_id,create_user,create_time,update_time,cost,class,origin)" +
            "values(#{ChessName},#{content},#{coverImg},#{state},#{categoryId},#{createUser},#{createTime},#{updateTime},#{cost},#{chessClass},#{chessOrigin})")
    void add(Chess chess);
}

json没有传入创建时间,创建用户ID,那么创建时间和修改时间直接用LocalDateTime来获取设置,创建用户ID还是老规矩用ThreadLocal来获取设置

Mapper层

    @Override
    public void add(Chess chess) {
        chess.setCreateTime(LocalDateTime.now());
        chess.setUpdateTime(LocalDateTime.now());

        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userID  = (Integer) map.get("id");
        chess.setCreateUser(userID);

        chessMapper.add(chess);
    }

 基本框架写好了,准备进行下一步的参数校验

新增棋子参数校验

在接口文档中对我们提出要求,发布状态之能是已发布或者是草稿状态,这一条件的校验用我们之前使用过的所有方法都是解决不了的,这时候就要用到自定义校验技术

自定义校验

        已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)

自定义注解步骤

1.自定义注解State

@Documented//元注解
@Constraint(validatedBy = {StateValidatiom.class})//指定提供校验规则的类
@Target({FIELD} )
@Retention(RUNTIME)
public @interface State {

    //提供校验失败后的提示信息
    String message() default "State参数值只能为\"已发布\"或者\"草稿\"";
    //指定分组
    Class<?>[] groups() default {};
    //负载 可以获取到State注解的附加信息
    Class<? extends Payload>[] payload() default {};
}

三个参数必备

还要在@Constraint注解中指定提供校验规则的类

2.自定义校验数据的类StateValidatiom实现ConstrainValidator接口

public class StateValidatiom implements ConstraintValidator<State,String> {
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        //提供校验规则
        //s:要校验的数据
        if(s == null){
            return false;
        }
        if (s.equals("已发布") || s.equals("草稿")){
            return true;
        }
        return false;
    }
}

3.在需要校验的地方使用自定义注解

    @State
    private String state;//发布状态 已发布|草稿

棋子分类列表查询(条件分页)

接口文档

读接口文档,目的明确,开工!

Controller层

    @GetMapping
    public Result<PageBean<Chess>> list(Integer pageNum,Integer pageSize,@RequestParam(required = false) Integer categoryId,@RequestParam(required = false) String state){
        PageBean<Chess> pageBean = chessService.list(pageNum,pageSize,categoryId,state);
        return Result.success(pageBean);
    }

这里用了一个实体类PageBean来封装每一页对应的棋子对象

PageBean实体类如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean <T>{
    private Long total;//总条数
    private List<T> items;//当前页数据集合
}

Service层 

    @Override
    public PageBean<Chess> list(Integer pageNum, Integer pageSize, Integer categoryId, String state) {

        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userID  = (Integer) map.get("id");
        //创建pageBean对象用于封装查询到的对象
        PageBean<Chess> pageBean = new PageBean<>();



        //借助mybatis的插件pagehelper开启分页查询
        PageHelper.startPage(pageNum,pageSize);

        //调用mapper查询
        List<Chess> cs = chessMapper.list(userID,categoryId,state);
            //Page中提供了方法,可以获取PageHelper分页查询后,得到的总记录条数和当前页main数据
        Page<Chess> chessPage = (Page<Chess>) cs;
        //把数据填充到PageBean对象中
        pageBean.setTotal(chessPage.getTotal());
        pageBean.setItems(chessPage.getResult());
        return pageBean;
    }

这里用了一个mybatis的分页查询插件pagehelper

坐标如下

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

注意

代码是这么写的,如果换某几行看起来不会报错的代码,他照样会在查时报错,你要问为什么?

代码是这么写的 

Mapper层

    List<Chess> list(Integer userId, Integer categoryId, String state);

因为 categoryID和state是不一定会有的,所以选用配置文件写动态sql,

注意:xml配置文件的相对路径要与对应方法所在的Mapper层中的类的相对路径完全一致

 Mapper层类路径

xml配置文件路径

动态sql

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cacb.mapper.ChessMapper">
<!--    动态sql-->
    <select id="list" resultType="com.cacb.pojo.Chess">
            select * from chess
            <where>
                <if test="categoryId != null">
                    category_id = #{categoryId}
                </if>

                <if test="state!=null">
                    and state=#{state}
                </if>
                and create_user=#{userId}
            </where>
    </select>
    
</mapper>

获取棋子详情

接口文档

阅读接口文档,没什么特殊要求,开工!

Controller层

    @GetMapping("detail")
    public Result<Chess> getChessByID(Integer id){
        Chess chess = chessService.getChessByID(id);
        if (chess == null){
            return Result.error("查询的棋子不存在!");
        }else {
            return Result.success(chess);
        }
    }

Service层

    @Override
    public Chess getChessByID(Integer chessID) {
        return chessMapper.getChessByID(chessID);
    }

Mapper层

    @Select("select * from chess where id=#{chessID}")
    Chess getChessByID(Integer chessID);

更新棋子

接口文档

没啥难度,注意下修改之前给个身份判定就行了,开工!

Controller层

    @PutMapping()
    public Result update(@RequestBody @Validated Chess chess){
        Chess chess_get = chessService.getChessByID(chess.getId());
        if (chess_get == null){return Result.error("您所要修改的棋子不存在");}
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userID  = (Integer) map.get("id");
        if (!chess_get.getCreateUser().equals(userID)){return Result.error("你所要修改的棋子不属于您!");}
        chessService.update(chess);
        return Result.success();

    }

做了一个身份判定和棋子信息存在判定

Service层

    @Override
    public void update(Chess chess) {
        chess.setUpdateTime(LocalDateTime.now());
        chessMapper.update(chess);
    }

Service层注入更新时间 

Mapper层 

    @Update("update chess set chess_name = #{ChessName} , content = #{content} , cover_img = #{coverImg} , " +
            " state = #{state},category_id = #{categoryId},update_time = #{updateTime} ," +
            "cost = #{cost} , chess_class = #{chessClass},chess_origin = #{chessOrigin} where id = #{id}")
    void update(Chess chess);

删除棋子

接口文档

也没啥难度,战斗,爽!

Controller层

    @DeleteMapping
    public Result delete(Integer id){
        Chess chess = chessService.getChessByID(id);
        if (chess == null){
            return Result.error("您所要删除的棋子不存在");
        }
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userID  = (Integer) map.get("id");
        if (!chess.getCreateUser().equals(userID)){return Result.error("你所要修改的棋子不属于您!");}
        chessService.delete(id);
        return Result.success();

    }

Service层

    @Override
    public void delete(Integer id) {
        chessMapper.delete(id);
    }

Mapper层

    @Delete("delete from chess where id = #{id}")
    void delete(Integer id);

相关推荐

  1. 实习记录——

    2024-02-17 20:14:02       27 阅读
  2. 开始学习

    2024-02-17 20:14:02       36 阅读
  3. 练气

    2024-02-17 20:14:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-17 20:14:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-17 20:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-17 20:14:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-17 20:14:02       20 阅读

热门阅读

  1. 学习数据结构和算法的第8天

    2024-02-17 20:14:02       40 阅读
  2. python系统学习Day3

    2024-02-17 20:14:02       31 阅读
  3. mysql读写分离

    2024-02-17 20:14:02       32 阅读
  4. Linux命令-builtin命令(执行bash内建命令)

    2024-02-17 20:14:02       31 阅读
  5. vivado DSP Block

    2024-02-17 20:14:02       32 阅读
  6. mysql存储范式简记

    2024-02-17 20:14:02       31 阅读
  7. 初识tensorflow程序设计模式

    2024-02-17 20:14:02       33 阅读
  8. Mongodb 文本检索

    2024-02-17 20:14:02       31 阅读
  9. FFmpeg编译安装外部库包括NVIDIA

    2024-02-17 20:14:02       37 阅读