Bootstrap

Springboot项目搭建(4)-文章管理接口

1.概要

同用户信息管理一样,对文章分页的管理也大致分为三步:

1.映射类(Mapper)是与数据库直接交互的层面,通过定义SQL语句和Java方法的映射来执行具体的数据库操作。

2.业务层接口(Service)定义了应用程序的业务操作,而业务层实现类(ServiceImpl)则提供了这些接口的具体实现,它们通常包含业务逻辑并调用映射类的方法来完成数据库操作。

3.控制层(Controller)作为客户端和服务器之间的接口,处理HTTP请求,调用业务层的方法,并返回响应给客户端。

2.创建Java对象

文件地址:org/example/entity/Category.java

使用了Lombok库来简化Java对象的创建。

这个类名为Category,是一个数据传输对象(DTO),用于映射到数据库中的一个表。

package org.example.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
//映射类,用户与数据库的表对应
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Category {
    private int id;
    private String categoryName;
    private String categoryAlias;
    private int createUser;
    @JsonFormat(pattern = "yyyy-mm-dd MM:mm:ss")
    private LocalDateTime createTime;
    @JsonFormat(pattern = "yyyy-mm-dd MM:mm:ss")
    private LocalDateTime updateTime;
}

3.新增文章分类(增)

3.1 映射类CategoryMapper

文件地址:org/example/mapper/CategoryMapper.java

package org.example.mapper;
import org.apache.ibatis.annotations.*;
import org.example.entity.Category;
import java.util.List;
@Mapper
public interface CategoryMapper {//新增文章分类
    @Insert("insert into category(category_name,category_alias,create_user,create_time,update_time)"+
            "values (#{categoryName},#{categoryAlias},#{createUser},#{createTime},#{updateTime})")
    void insert(Category category);
}

3.2 业务层接口CategoryService

3.2.1 创建接口

文件地址:org/example/service/CategoryService.java

package org.example.service;
import org.example.entity.Category;
import java.util.List;
public interface CategoryService {//添加分类
    void add(Category category);
}

3.2.2 实现接口

文件地址:org/example/service/impl/CategoryServiceImpl.java

package org.example.service.impl;
import org.example.entity.Category;
import org.example.mapper.CategoryMapper;
import org.example.service.CategoryService;
import org.example.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper; //创建一个属性,是操作数据库的对象
    //添加实现方法&添加分类
    @Override
    public void add(Category category) {
        //补充时间
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        //从线程池中获得用户的id值
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userId = (Integer)map.get("id");
        //补充用户id值
        category.setCreateUser(userId);
        categoryMapper.insert(category);
    }
}

3.3 控制层CategoryController

文件地址:org/example/controller/CategoryController.java

@Autowired:依赖注入,会自动找到接口的实现类,将实现类构建成对象,赋予接口引用。

那么调用接口引入的方法,就相当于调用了实现类的方法。

@RequestBody:可自动转换并赋值

@Validated:校验

package org.example.controller;
import org.example.entity.Category;
import org.example.entity.Result;
import org.example.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;
    @PostMapping("/add")
    public Result add(@RequestBody @Validated Category category) {
        categoryService.add(category);
        return Result.success();
    }
}

3.4 实现效果:

4.获取文章分类信息(查)

4.1 映射类CategoryMapper

Integer与int:

int 的默认值是 0Integer 的默认值是 null,因为它是对象

Integer 是包装类,它是对象类型,可以用来封装一个 int 值,因此比int多了一些功能与方法。

Integer 对象在堆上分配内存,除了存储 int 值之外,还存储对象头信息,因此占用的内存更多。

package org.example.mapper;
import ...
@Mapper
public interface CategoryMapper {
    //新增文章分类
    ...
    //根据文章序号获取文章分类详情
    @Select("select * from category where id = #{id}")
    Category selectCategoryById(Integer id);
    //根据用户id获取文章分类列表
    @Select("select * from category where create_user =#{id}")
    List<Category> selectCategoryByCreateUserId(Integer id);
}

4.2 业务层接口CategoryService

4.2.1 创建接口

文件地址:org/example/service/CategoryService.java

package org.example.service;
import ...
public interface CategoryService {
    //添加分类
    ...
    //根据文章id查询文件分类
    Category findCategoryById(Integer id);
    //根据用户id获取文章分类列表
    List<Category> findCategoryByCreateUserId();
}

4.2.2 实现接口

文件地址:org/example/service/impl/CategoryServiceImpl.java

package org.example.service.impl;
import ...
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    //添加分类
    ...
    //根据文章id查询文件分类
    @Override 
    public Category findCategoryById(Integer id) {
        return categoryMapper.selectCategoryById(id);
    }
    //根据用户id获取文章分类列表
    @Override
    public List<Category> findCategoryByCreateUserId() {
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userId = (Integer)map.get("id");
        return categoryMapper.selectCategoryByCreateUserId(userId);
    }
}

4.3 控制层CategoryController

文件地址:org/example/controller/CategoryController.java

package org.example.controller;
import ...
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;
    //添加分类
    ...
    //根据文章id查询文件分类
    @GetMapping("/detail")
    public Result<Category> detail(Integer id) {
        Category category = categoryService.findCategoryById(id);
        return Result.success(category);
    }
    //根据用户id获取文章分类列表
    @GetMapping("/list")
    public Result<List<Category>> list(){
        List<Category> list = categoryService.findCategoryByCreateUserId();
        return Result.success(list);
    }
}

4.4 实现效果:

5.更改文章分类信息(改/删)

5.1 映射类CategoryMapper

文件地址:org/example/mapper/CategoryMapper.java

package org.example.mapper;
import ...
@Mapper
public interface CategoryMapper {
    //新增文章分类/获取文章分类详情/根据用户id获取文章分类列表
    ...
    //更改文章分类
    @Update("UPDATE category SET category_name = #{categoryName},category_alias = #{categoryAlias},create_user = #{createUser}," +
            "create_time = #{createTime},update_time = #{updateTime} WHERE id = #{id}")
    void updateCategory(Category category);
    //删除文章分类
    @Delete("DELETE FROM category WHERE id = #{id}")
    void deleteCategoryById(Integer id);
}

5.2 业务层接口CategoryService

5.2.1 创建接口

文件地址:org/example/service/CategoryService.java

package org.example.service;
import ...
public interface CategoryService {
    //添加分类/根据id查询文件分类/根据用户id获取文章分类列表
    ...
    //更改文章分类
    void update(Category category);
    //删除文章分类
    void delete(Integer id);
}

5.2.2 实现接口

文件地址:org/example/service/impl/CategoryServiceImpl.java

package org.example.service.impl;
import ...
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    //添加分类/根据id查询文件分类/根据用户id获取文章分类列表
    ...
    //更改文章分类
    @Override
    public void update(Category category) {
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer userId = (Integer)map.get("id");
        category.setCreateUser(userId);
        categoryMapper.updateCategory(category);
    }
    //删除文章分类
    @Override
    public void delete(Integer id) {
        categoryMapper.deleteCategoryById(id);
    }
}

5.3 控制层CategoryController

文件地址:org/example/controller/CategoryController.java

Delete不知道怎么跑出来的,但就是能跑

package org.example.controller;
import ...
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;
    //添加分类/根据id查询文件分类/根据用户id获取文章分类列表
    ...
    //更改文章分类
    @PostMapping("/update")
    public Result update(@RequestBody @Validated Category category) {
        categoryService.update(category);
        return Result.success();
    }
    //删除文章分类
    @DeleteMapping("/delete")
    public Result delete(@RequestBody Map<String, Object> payload) {
        Integer id = (Integer) payload.get("id");
        categoryService.delete(id);
        return Result.success();
    }
}

5.4 实现效果:

5.4.1 更改文章分类信息

 5.4.2 删除文章分类信息

;