使用 MyBatis-Plus 操作 books
表。我们将实现以下功能:
创建实体类 Book
。
创建 Mapper 接口 BookMapper
。
创建 Service 层 BookService
和 BookServiceImpl
。
创建 Controller 层 BookController
。
配置 MyBatis-Plus 和数据库连接。
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ ├── DemoApplication.java
│ │ ├── entity
│ │ │ └── Book.java
│ │ ├── mapper
│ │ │ └── BookMapper.java
│ │ ├── service
│ │ │ ├── BookService.java
│ │ │ └── impl
│ │ │ └── BookServiceImpl.java
│ │ └── controller
│ │ └── BookController.java
│ └── resources
│ └── application.properties
└── test
└── java
└── com
└── example
└── DemoApplicationTests.java
在 pom.xml
中添加 MyBatis-Plus 和 MySQL 依赖:
POP.XML
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.4.3
com.example
demo3
0.0.1-SNAPSHOT
demo3
demo3
23
org.springframework.boot
spring-boot-starter-web
org.hibernate.validator
hibernate-validator
8.0.0.Final
jakarta.validation
jakarta.validation-api
3.0.2
org.glassfish
jakarta.el
4.0.2
org.springdoc
springdoc-openapi-starter-webmvc-ui
2.7.0
org.projectlombok
lombok
1.18.30
com.baomidou
mybatis-plus-spring-boot3-starter
3.5.5
com.mysql
mysql-connector-j
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
在 application.properties
中配置数据库连接和 MyBatis-Plus:
application.properties
spring.application.name=demo3
spring.datasource.url=jdbc:mysql://192.168.1.10:3306/databasename**?useSSL=false&serverTimezone=UTC
spring.datasource.username=user***
spring.datasource.password=psd***
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis-Plus 配置
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.type-aliases-package=com.example.com.mapper
# OpenAPI 配置
#springdoc.swagger-ui.path=/swagger-ui.html
MybatisPlusConfig.java
package com.example.demo.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
使用 MyBatis-Plus 的注解定义实体类。
Book.java
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data // 使用 Lombok 自动生成 getter 和 setter 方法
@TableName("books") // 指定数据库表名
public class Book {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String name;
private String author;
}
继承 MyBatis-Plus 的 BaseMapper
接口,自动获得 CRUD 方法。
BookMapper.java
package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.Book;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BookMapper extends BaseMapper {
// 无需手动编写 CRUD 方法,BaseMapper 已提供
}
使用 MyBatis-Plus 的 IService
和 ServiceImpl
简化 Service 层代码。
BookService.java
package com.example.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.Book;
public interface BookService extends IService {
// 可以在此定义自定义方法
}
BookServiceImpl.java
package com.example.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.Book;
import com.example.mapper.BookMapper;
import com.example.service.BookService;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl extends ServiceImpl implements BookService {
// 无需手动实现 CRUD 方法,ServiceImpl 已提供
}
在控制器中调用 Service 层的方法。
BookController.java
package com.example.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.entity.Book;
import com.example.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
// 获取所有书籍
@GetMapping
public List findAll() {
return bookService.list();
}
// 根据 ID 获取书籍
@GetMapping("/{id}")
public Book findById(@PathVariable Long id) {
return bookService.getById(id);
}
// 创建书籍
@PostMapping
public void insert(@RequestBody Book book) {
bookService.save(book);
}
// 更新书籍
@PutMapping("/{id}")
public void update(@PathVariable Long id, @RequestBody Book book) {
book.setId(id);
bookService.updateById(book);
}
// 删除书籍
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
bookService.removeById(id);
}
// 分页查询书籍
@GetMapping("/page")
public IPage getBooksByPage(
@RequestParam(defaultValue = "1") int pageNum, // 默认第 1 页
@RequestParam(defaultValue = "10") int pageSize // 默认每页 10 条
) {
Page page = new Page<>(pageNum, pageSize);
return bookService.page(page);
}
// 根据名称搜索书籍
@GetMapping("/search")
public List search(@RequestParam String keyword) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", keyword).or().like("author", keyword);
return bookService.list(queryWrapper);
}
}
在 MySQL 中创建 books
表:
CREATE TABLE books (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL
);
启动项目后,可以使用以下 API 进行测试:
获取所有书籍:
bash
复制
curl http://localhost:8080/books
根据 ID 获取书籍:
bash
复制
curl http://localhost:8080/books/1
创建书籍:
bash
复制
curl -X POST -H "Content-Type: application/json" -d '{"name": "Spring Boot in Action", "author": "Craig Walls"}' http://localhost:8080/books
更新书籍:
bash
复制
curl -X PUT -H "Content-Type: application/json" -d '{"name": "Spring Boot in Action (2nd Edition)", "author": "Craig Walls"}' http://localhost:8080/books/1
删除书籍:
bash
复制
curl -X DELETE http://localhost:8080/books/1
分页查询书籍:
bash
复制
curl http://localhost:8080/books/page?pageNum=1&pageSize=5
搜索书籍:
bash
复制
curl http://localhost:8080/books/search?keyword=Spring