SpringBoot入门实现简单增删改查

本例子的依赖

要实现的内容

通过getpostputdelete 接口,对数据库中的trade.categories表进行增删改查操作。

目录结构

c 复制代码
com.test/
│
├── controller/
│   ├── CateController.java
│
├── pojo/
│   ├── dto/
│   │   └── CategoryDto.java
│   ├── Category.java
│	└── ResponseMessage.java
│
├── repository/
│  	└── CateRepository.java
│
└── service/
	├── CateRepository.java
	└── ICateRepository.java

各目录文件之间的关系(仅限于本文章)

添加配置

java 复制代码
/* application.properties */
spring.datasource.url=jdbc:mysql://localhost:3306/trade
spring.datasource.username=root
#spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update

spring.jpa.show-sql=true

当设置为 true 时,Hibernate 会在控制台中打印所有执行的 SQL 语句,方便调试和查看 SQL 查询。

spring.jpa.properties.hibernate.format_sql=true

当设置为 true 时,Hibernate 会将 SQL 语句格式化成更具可读性的形式便于阅读。

spring.jpa.hibernate.ddl-auto=update

作用
update 如不存在表则创建新表,已有表会尝试修改
create 启动时先删除表,再重新创建表
create-drop 应用停止时会删除表
none 不会对数据库结构进行任何操作

映射categories表

java 复制代码
/* Category.java */
@Table(name = "categories")
@Entity
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "category_id")
    private Integer categoryID;
    @Column(name = "category_name")
    private String categoryName;
    @Column(name = "description")
    private String description;
}
/* ...省略 get set方法 */

@Table(name = "categories")

Category 类将与数据库中名为 categories 的表进行映射。

@Entity

注解标记该类为一个 JPA 实体,即一个可以映射到数据库表的类。JPA 会在运行时使用该类与数据库进行交互。

@Id

标识该字段是实体的主键。

@GeneratedValue

注解表示主键值是自动生成的。strategy = GenerationType.IDENTITY 表示数据库会为该字段生成唯一的自增值。也就是说,每次插入一条新记录时,categoryID 会自动递增

@Column

注解用来指定该字段映射到数据库表中的哪一列。

dto传输类

java 复制代码
/* CategoryDto.java */
public class CategoryDto {
	private  Integer categoryID;
    @NotBlank(message = "分类名称不能为空")
    private String categoryName;
    @NotBlank(message = "分类描述不能为空")
    private String description;
}
/* ...省略 get set方法 */

由于主键id是自动生成的,所以插入值时只用到两个列。

API响应数据类

java 复制代码
/* ResponseMessage.java */
public class ResponseMessage<T> {
    private Integer code;
    private String message;
    private T data;

    public ResponseMessage(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    
    public static <T> ResponseMessage<T> success(T data){
        return new ResponseMessage<>(HttpStatus.OK.value(),"success!",data);
    }
    /* ...省略 get set方法 */
}

定义了一个泛型类 ,用于封装统一格式的响应消息,里面有一个静态泛型方法,成功响应返回状态码、字符串和对象内容。

统一类型返回

java 复制代码
/* GlobalExceptionHandlerAdvice.java */
@RestControllerAdvice
public class GlobalExceptionHandlerAdvice {
    Logger log = LoggerFactory.getLogger(GlobalExceptionHandlerAdvice.class);
    @ExceptionHandler({Exception.class})
    public ResponseMessage handlerException(Exception e, HttpServletRequest request, HttpServletResponse response){
        log.error("统一异常:",e);
        return new ResponseMessage(500,"error",null);
    }
}

这个类用来处理全局范围内的异常,响应报异常返回统一的消息。

@RestControllerAdvice

通过该注解,可以捕获所有控制器中的异常,并返回统一格式的 JSON 响应。

@ExceptionHandler

声明该方法用于处理指定的异常类型,{Exception.class}:捕获所有 Exception 类型的异常,包括其子类。

POST

CateRepository 继承 了 Spring Data JPA 提供的 CrudRepository 接口,可以获得基本的CRUD 操作(如增、删、改、查)。

java 复制代码
/* CateRepository.java */
@Repository
public interface CateRepository extends CrudRepository<Category,Integer> {
}

在服务类添加add方法,插入请求body里的内容。

java 复制代码
/* ICateService.java 服务接口 */
public interface ICateService {
    /**
     * 插入分类
     * @param categoryDto
     */
    Category add(CategoryDto categoryDto);
}
java 复制代码
/* CateService.java 实现服务接口 */
@Service
public class CateService implements ICateService{
    @Autowired
    CateRepository cateRepository;
    
    @Override
    public Category add(CategoryDto categoryDto) {
        Category category = new Category();
        BeanUtils.copyProperties(categoryDto,category);
        return cateRepository.save(category);
    }
}

@Service

表示该类是一个专门用于 Service 层 的注解,用于处理业务逻辑 ,Spring 会自动检测并注册 CateService 为一个 Spring Bean,因此可以被其他类注入和使用。

@Autowired

Spring 提供的依赖注入注解 ,它用于自动注入依赖的对象。Spring 容器会自动将 CateRepository 的实例注入到 CateService 类中,cateRepository 便可以用来执行数据库操作,如保存、查询、删除类别等。

BeanUtils.copyProperties(first,second)

此方法会自动匹配相同名字的字段和兼容的类型,将 first对象中的数据赋值到second对象中。

接下来写Controller 对象的里的内容,完成post处理接口。

java 复制代码
/* Controller.java */
@RestController
@RequestMapping("/cate")
public class CateController {
    @Autowired
    ICateService cateService;
    @PostMapping
    public ResponseMessage<Category> add(@Validated @RequestBody CategoryDto categoryDto){
        Category cateNew = cateService.add(categoryDto);
        return ResponseMessage.success(cateNew);
    }
}

@RestController

该注解使得 CateController 类成为一个 RESTful风格的控制器,可以处理 HTTP 请求,并返回 JSON 数据。

@RequestMapping("/cate")

该注解用于定义该控制器处理的请求 URL 路径前缀。

@PostMapping

当收到 POST 请求时,该方法会被调用。add 方法接收前端提交的 CategoryDto 数据 ,并通过 cateService 保存数据。返回的结果是一个封装了状态、消息和数据的统一响应对象 ResponseMessage,以 JSON 格式返回给客户端。

GET 通过id查询分类

java 复制代码
/* Controller.java */
@GetMapping("/{id}")
public ResponseMessage<Category> get(@PathVariable Integer id){
    return ResponseMessage.success(cateService.getCate(id));
}
java 复制代码
/* ICateService.java 服务接口 */
/**
  * 查询分类
  * @param id
  */
Category getCate(Integer id);
java 复制代码
/* CateService.java 实现服务接口 */
@Override
public Category getCate(Integer id) {
    return cateRepository.findById(id).orElseThrow(()-> new IllegalArgumentException("分类不存在"));
}

PUT 通过id修改分类

java 复制代码
/* Controller.java */
@PutMapping
public ResponseMessage<Category> update(@Validated @RequestBody CategoryDto categoryDto){
    Category cateNew = cateService.cateEdit(categoryDto);
    return ResponseMessage.success(cateNew);
}
java 复制代码
/* ICateService.java 服务接口 */
/**
 * 编辑分类
 * @param categoryDto
 */
Category cateEdit(CategoryDto categoryDto);
java 复制代码
/* CateService.java 实现服务接口 */
@Override
public Category cateEdit(CategoryDto categoryDto) {
    Category category = new Category();
    BeanUtils.copyProperties(categoryDto,category);
    return cateRepository.save(category);
}

Delete 通过id删除数据

java 复制代码
/* Controller.java */
@DeleteMapping("/{id}")
public ResponseMessage<Category> delete(@PathVariable Integer id){
    cateService.cateDelete(id);
    return ResponseMessage.success(null);
}
java 复制代码
/* ICateService.java 服务接口 */
/**
 * 删除分类
 *
 * @param id
 */
void cateDelete(Integer id);
java 复制代码
/* CateService.java 实现服务接口 */
@Override
public void cateDelete(Integer id) {
    cateRepository.deleteById(id);
}
相关推荐
莳花微语2 小时前
再谈Oracle统计信息
数据库·oracle
盖世英雄酱5813610 小时前
Java 组长年终总结:靠 AI 提效 50%,25 年搞副业只赚 4k?
后端·程序员·trae
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue在线音乐播放系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
code bean11 小时前
Flask图片服务在不同网络接口下的路径解析问题及解决方案
后端·python·flask
+VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
努力的小郑11 小时前
2025年度总结:当我在 Cursor 里敲下 Tab 的那一刻,我知道时代变了
前端·后端·ai编程
AlfredZhao11 小时前
使用 Oracle 官方 HR Demo 快速验证 RAS 功能(小白实战指南)
oracle·ras
困知勉行198512 小时前
springboot整合redis
java·spring boot·redis
颜淡慕潇13 小时前
深度解析官方 Spring Boot 稳定版本及 JDK 配套策略
java·后端·架构
Victor35613 小时前
Hibernate(28)Hibernate的级联操作是什么?
后端