本文将详细介绍 MyBatis Plus 的使用方法和优势,帮助读者更好地理解和掌握 MyBatis Plus。文章结构包括 MyBatis Plus 的简介、环境搭建、基本 CRUD 操作、条件构造器与分页插件、动态 SQL 与自定义 SQL 注入,以及通过一个简单的图书管理系统实例来演示 MyBatis Plus 的应用。
MyBatis Plus简介 MyBatis Plus是什么MyBatis Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上增加了许多开箱即用的功能,如分页、CRUD操作和条件构造器等。它简化了开发人员的编码工作,让开发变得更高效和简单。MyBatis Plus 适用于任何基于 MyBatis 的持久层框架,旨在提高开发效率和减少重复代码。
为什么使用MyBatis Plus使用 MyBatis Plus 可以带来以下好处:
- 简化开发流程:MyBatis Plus 提供了丰富的开箱即用功能,如分页、CRUD操作等,使得开发人员可以专注于业务逻辑的实现,而无需花费大量时间在增删改查等基础操作上。
- 提升开发效率:通过使用 MyBatis Plus 提供的注解和方法,可以大幅减少代码量,提高开发效率。例如,一个简单的 CRUD 操作可以通过几行代码实现。
- 易于维护:由于 MyBatis Plus 提供了统一的接口和方法,使得代码结构更加清晰,易于维护。
MyBatis Plus 是在 MyBatis 的基础上进行增强的,主要区别如下:
- 功能增强:MyBatis Plus 在 MyBatis 的基础上增加了许多增强的功能,如分页、CRUD操作、条件构造器等,使得开发更加高效。
- 简化操作:MyBatis Plus 提供了许多开箱即用的功能,可以简化开发人员的编码工作,而 MyBatis 则需要手动编写 SQL 语句。
- 与 MyBatis 兼容:MyBatis Plus 与 MyBatis 兼容,可以无缝对接 MyBatis 已有的项目,不需要对现有代码进行大规模改动。
为了使用 MyBatis Plus,你需要先搭建一个 Java 开发环境,包括 Java 开发工具(如 IntelliJ IDEA 或 Eclipse)、数据库(如 MySQL)和数据库连接驱动。
环境准备
- 开发工具:建议使用 IntelliJ IDEA 或 Eclipse。
- 数据库:安装 MySQL 数据库。
- 数据库驱动:下载并配置 MySQL 的 JDBC 驱动。
配置数据库连接信息
在你的项目中配置数据库连接信息。如果你使用 Spring Boot,可以在 application.properties
文件中添加以下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
添加依赖
在你的项目中添加 MyBatis Plus 的依赖。如果你使用 Maven 作为构建工具,可以在 pom.xml 文件中添加以下依赖:
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>
</dependencies>
如果你使用 Gradle 作为构建工具,可以在 build.gradle 文件中添加以下依赖:
dependencies {
implementation 'com.baomidou:mybatis-plus-boot-starter:3.4.2'
implementation 'mysql:mysql-connector-java:8.0.21'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.3'
}
创建数据表和实体类
创建一个简单的数据表 user
,并编写对应的实体类 User
。
创建数据表
执行以下 SQL 语句,创建 user
表:
CREATE TABLE `user` (
`id` BIGINT(19) NOT NULL COMMENT '主键ID',
`name` VARCHAR(30) DEFAULT NULL COMMENT '姓名',
`age` INT(11) DEFAULT NULL COMMENT '年龄',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
创建实体类
编写 User
类,用于映射 user
表中的数据:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
// getter 和 setter 方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
基本CRUD操作
增加数据
使用 MyBatis Plus 的 insert
方法实现数据的插入。
实例代码
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean addUser(User user) {
return save(user);
}
}
测试代码
import java.util.UUID;
public class Test {
public static void main(String[] args) {
User user = new User();
user.setId(null); // 自动生成主键
user.setName("张三");
user.setAge(25);
user.setEmail("[email protected]");
boolean result = userService.addUser(user);
System.out.println("插入结果:" + result);
}
}
查询数据
使用 MyBatis Plus 的 selectById
方法查询单个数据,或者使用 selectList
方法查询多个数据。
实例代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public User getUserById(Long id) {
return getOne(new QueryWrapper<User>().eq("id", id));
}
public List<User> getAllUsers() {
return list();
}
}
测试代码
public class Test {
public static void main(String[] args) {
User user = userService.getUserById(1L);
System.out.println("用户信息:" + user.getName());
List<User> users = userService.getAllUsers();
users.forEach(user -> {
System.out.println("用户信息:" + user.getName());
});
}
}
更新数据
使用 MyBatis Plus 的 update
方法实现数据的更新。
实例代码
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean updateUser(User user) {
return updateById(user);
}
}
测试代码
public class Test {
public static void main(String[] args) {
User user = new User();
user.setId(1L);
user.setName("李四");
user.setAge(30);
user.setEmail("[email protected]");
boolean result = userService.updateUser(user);
System.out.println("更新结果:" + result);
}
}
删除数据
使用 MyBatis Plus 的 deleteById
方法实现数据的删除。
实例代码
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean deleteUserById(Long id) {
return removeById(id);
}
}
测试代码
public class Test {
public static void main(String[] args) {
boolean result = userService.deleteUserById(1L);
System.out.println("删除结果:" + result);
}
}
条件构造器与分页插件
使用条件构造器
条件构造器允许构建复杂的查询条件,用于实现更加灵活的数据查询。
实例代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getUsersByConditions(String name, Integer age) {
return list(new QueryWrapper<User>()
.eq(name != null, "name", name)
.gt(age != null, "age", age)
);
}
}
测试代码
public class Test {
public static void main(String[] args) {
List<User> users = userService.getUsersByConditions("张三", null);
users.forEach(user -> {
System.out.println("用户信息:" + user.getName());
});
}
}
强大的分页插件配置与使用
MyBatis Plus 提供了强大的分页插件,可以轻松实现分页查询。
配置分页插件
在 Spring Boot 配置文件中配置分页插件:
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
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 PaginationInterceptor());
return interceptor;
}
}
使用分页插件
在查询方法中使用分页插件:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getUsersByPage(int currentPage, int pageSize) {
return page(new Page<>(currentPage, pageSize),
new QueryWrapper<User>()
);
}
}
测试代码
public class Test {
public static void main(String[] args) {
IPage<User> page = userService.getUsersByPage(1, 10);
System.out.println("当前页码:" + page.getCurrent());
System.out.println("每页记录数:" + page.getSize());
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
System.out.println("数据:" + page.getRecords());
}
}
动态SQL与自定义Sql注入
使用动态SQL
动态 SQL 提供了更加灵活的 SQL 生成能力,可以根据运行时的条件动态生成 SQL。
实例代码
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getUsersByDynamicSql(String name, Integer age) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if (name != null) {
queryWrapper.eq("name", name);
}
if (age != null) {
queryWrapper.eq("age", age);
}
return list(queryWrapper);
}
}
测试代码
public class Test {
public static void main(String[] args) {
List<User> users = userService.getUsersByDynamicSql("张三", null);
users.forEach(user -> {
System.out.println("用户信息:" + user.getName());
});
}
}
实例演示自定义Sql注入
自定义 SQL 注入允许直接编写 SQL 语句,实现更复杂的数据操作。
实例代码
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getUsersByCustomSql() {
return list(com.baomidou.mybatisplus.core.engine.SqlScriptEngine.getInstance().render("SELECT * FROM user WHERE age > #{age}", Collections.singletonMap("age", 20)));
}
}
测试代码
public class Test {
public static void main(String[] args) {
List<User> users = userService.getUsersByCustomSql();
users.forEach(user -> {
System.out.println("用户信息:" + user.getName());
});
}
}
实战演练:搭建一个简单的CRUD项目
项目需求分析
假设我们正在开发一个简单的图书管理系统,需要实现图书的增删改查功能。具体需求如下:
- 增加图书:支持添加一本图书。
- 查询图书:支持根据图书名称或类别查询图书。
- 更新图书:支持修改图书的信息。
- 删除图书:支持删除一本图书。
创建实体类
编写 Book
类,映射图书表 book
。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("book")
public class Book {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private String author;
private String category;
// getter 和 setter 方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
创建数据表
执行以下 SQL 语句,创建 book
表:
CREATE TABLE `book` (
`id` BIGINT(19) NOT NULL COMMENT '主键ID',
`name` VARCHAR(30) DEFAULT NULL COMMENT '书名',
`author` VARCHAR(30) DEFAULT NULL COMMENT '作者',
`category` VARCHAR(30) DEFAULT NULL COMMENT '类别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图书表';
创建 Mapper 接口和实现类
编写 BookMapper
接口和 BookMapper
实现类。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.Book;
public interface BookMapper extends BaseMapper<Book> {
}
创建 Service 接口和实现类
编写 BookService
接口和 BookServiceImpl
实现类。
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.Book;
import com.example.BookMapper;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService {
public boolean addBook(Book book) {
return save(book);
}
public Book getBookById(Long id) {
return getOne(new QueryWrapper<Book>().eq("id", id));
}
public boolean updateBook(Book book) {
return updateById(book);
}
public boolean deleteBookById(Long id) {
return removeById(id);
}
public List<Book> getBooksByConditions(String name, String category) {
return list(new QueryWrapper<Book>()
.eq(name != null, "name", name)
.eq(category != null, "category", category)
);
}
}
创建 Controller 类
编写 BookController
类,实现接口的 HTTP 请求处理。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class BookController {
@Autowired
private BookService bookService;
@PostMapping("/addBook")
public boolean addBook(@RequestBody Book book) {
return bookService.addBook(book);
}
@GetMapping("/getBookById/{id}")
public Book getBookById(@PathVariable Long id) {
return bookService.getBookById(id);
}
@PutMapping("/updateBook")
public boolean updateBook(@RequestBody Book book) {
return bookService.updateBook(book);
}
@DeleteMapping("/deleteBookById/{id}")
public boolean deleteBookById(@PathVariable Long id) {
return bookService.deleteBookById(id);
}
@GetMapping("/getBooksByConditions")
public List<Book> getBooksByConditions(@RequestParam(required = false) String name,
@RequestParam(required = false) String category) {
return bookService.getBooksByConditions(name, category);
}
}
测试与调试
测试代码
编写测试代码,验证上述功能是否正常。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class BookControllerTest {
@Autowired
private BookService bookService;
@Test
public void testAddBook() {
Book book = new Book();
book.setName("Java编程思想");
book.setAuthor("Herbert Schildt");
book.setCategory("编程技术");
boolean result = bookService.addBook(book);
System.out.println("插入结果:" + result);
}
@Test
public void testGetBookById() {
Book book = bookService.getBookById(1L);
System.out.println("图书信息:" + book.getName());
}
@Test
public void testUpdateBook() {
Book book = new Book();
book.setId(1L);
book.setName("Spring Boot实战");
book.setAuthor("黄勇");
boolean result = bookService.updateBook(book);
System.out.println("更新结果:" + result);
}
@Test
public void testDeleteBookById() {
boolean result = bookService.deleteBookById(1L);
System.out.println("删除结果:" + result);
}
@Test
public void testGetBooksByConditions() {
List<Book> books = bookService.getBooksByConditions(null, "编程技术");
books.forEach(book -> {
System.out.println("图书信息:" + book.getName());
});
}
}
共同學習,寫下你的評論
評論加載中...
作者其他優質文章