MyBatis-Plus入门介绍了一个强大的MyBatis增强工具,它提供了大量的简化编码特性,如CRUD增强、条件构造器和分页插件等,帮助开发者提高开发效率。本文详细讲解了MyBatis-Plus的核心特点、环境搭建以及基本的CRUD操作,旨在帮助新手快速上手。
MyBatis-Plus简介MyBatis-Plus是什么
MyBatis-Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了大量简化编码的特性,极大地提升了开发效率。MyBatis-Plus 并不是对 MyBatis 的封闭封装,而是在 MyBatis 基础上延伸出来的一个扩展插件,提供了一些开箱即用的功能,如分页、条件构造器、自定义全局主键等。以下是 MyBatis-Plus 的简单使用示例:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
private String createTime;
private String updateTime;
// Getter and Setter methods
}
@Repository
public interface UserMapper extends BaseMapper<User> {
}
MyBatis-Plus的核心特点
MyBatis-Plus 的核心特点包括:
- 无侵入:MyBatis-Plus 对原 MyBatis 的代码零侵入,可以与 MyBatis 完美融合。
- CRUD 增强:MyBatis-Plus 提供了大量的 CRUD 方法,简化了数据库操作。
- 条件构造器:提供了一个强大的条件构造器,可以灵活地构建复杂的查询条件。
- 分页插件:内置了分页插件,支持多种分页方式。
- 自定义主键:支持多种主键策略,如自增主键、UUID、雪花算法等。
- 逻辑删除:提供逻辑删除功能,避免物理删除带来的数据丢失风险。
- 其他特性:包括乐观锁、动态表名、全局乐观锁等。
MyBatis-Plus与MyBatis的区别
MyBatis-Plus 与 MyBatis 的主要区别在于:
- 基础特性:MyBatis 是一个持久层框架,提供了基础的 SQL 映射功能;MyBatis-Plus 是在此基础上增加了大量的增强特性。
- 功能增强:MyBatis-Plus 提供了大量的增强功能,如自动填充、逻辑删除、分页插件、条件构造器等。
- 使用方式:MyBatis-Plus 提供了简洁的接口和注解,使得操作更加直观和便捷。
- 开发效率:MyBatis-Plus 大大降低了开发者的开发工作量,提高了开发效率。
开发环境准备
为了在项目中使用 MyBatis-Plus,首先需要搭建开发环境。这里以 Spring Boot 项目为例,介绍开发环境的准备。
- 安装 JDK:确保已经安装了 JDK,并配置好环境变量。
- 安装 Maven:确保已经安装了 Maven,并配置好环境变量。
Maven 依赖配置
在 Spring Boot 项目中引入 MyBatis-Plus 依赖,可以在 pom.xml
文件中添加以下配置:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
快速开始示例
假设已经搭建好了开发环境,并在项目中添加了 MyBatis-Plus 依赖,接下来可以快速开始使用 MyBatis-Plus。
-
创建数据库表:首先需要在数据库中创建一个表。例如,创建一个
user
表:CREATE TABLE `user` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(50), `age` INT, `email` VARCHAR(50), `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
定义实体类:创建一个对应的实体类
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; private String createTime; private String updateTime; // Getter and Setter methods }
-
创建 Mapper 接口:定义一个
UserMapper
接口,继承BaseMapper
:import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.demo.entity.User; public interface UserMapper extends BaseMapper<User> { }
-
配置数据库连接:在
application.yml
中配置数据库连接信息:spring: datasource: url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath*:mapper/*.xml type-aliases-package: com.demo.entity
- 启动应用:通过 Spring Boot 启动应用,MyBatis-Plus 会自动扫描并注册
UserMapper
接口。
创建数据库表
在数据库中创建一个表,例如 user
表:
CREATE TABLE `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50),
`age` INT,
`email` VARCHAR(50),
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
实体类的定义
定义一个 User
实体类,使用 MyBatis-Plus 的注解:
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;
private String createTime;
private String updateTime;
// Getter and Setter methods
}
Mapper 继承与自定义SQL
定义一个 UserMapper
接口,继承 BaseMapper
:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
可以自定义 SQL 查询,例如:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
User selectUserById(Long id);
}
常见 CRUD 操作演示
插入数据
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
@Autowired
private UserMapper userMapper;
public void insertUser() {
User user = new User();
user.setName("John");
user.setAge(28);
user.setEmail("[email protected]");
userMapper.insert(user);
}
}
查询数据
public User selectUserById(Long id) {
return userMapper.selectById(id);
}
更新数据
public void updateUser(Long id) {
User user = new User();
user.setId(id);
user.setName("Jane");
user.setEmail("[email protected]");
userMapper.updateById(user);
}
删除数据
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
示例运行代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Autowired
private UserService userService;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
userService.insertUser();
User user = userService.selectUserById(1L);
System.out.println(user);
userService.updateUser(1L);
userService.deleteUser(1L);
}
}
功能增强
自动填充
MyBatis-Plus 提供了自动填充的功能,可以在插入或更新数据时自动填充一些字段。例如,可以自动填充创建时间和更新时间:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
// Getter and Setter methods
}
逻辑删除
逻辑删除是指在删除记录时,不直接删除数据,而是将数据标记为已删除。MyBatis-Plus 提供了逻辑删除功能,可以使用 @TableLogic
注解:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
@TableLogic
private Boolean deleted;
// Getter and Setter methods
}
分页插件配置
MyBatis-Plus 提供了分页插件,可以在查询时实现分页功能。首先需要在配置文件中配置分页插件:
mybatis-plus:
page:
size: 10
然后在代码中使用分页查询:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;
public List<User> selectUsersPage(int currentPage, int pageSize) {
Page<User> page = new Page<>(currentPage, pageSize);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age", "email").orderByAsc("id");
Page<User> result = userMapper.selectPage(page, queryWrapper);
return result.getRecords();
}
条件构造器
条件构造器 QueryWrapper
提供了强大的条件构建能力,可以灵活地构建复杂的查询条件:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;
public List<User> selectUsersByNameAge(String name, Integer age) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name).gt("age", age);
return userMapper.selectList(queryWrapper);
}
关联查询
单表查询
单表查询可以通过 Mapper
接口直接实现,例如:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
List<User> selectUsersByName(String name);
}
多表关联查询
多表关联查询可以通过 @TableName
注解和 @TableField
注解实现,例如:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
@TableField(select = false)
private String password;
// Getter and Setter methods
}
``
在 `UserMapper` 中定义关联查询:
```java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
List<User> selectUsersWithPassword();
}
联合查询与分页
联合查询可以使用 QueryWrapper
和 Page
结合实现:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;
public List<User> selectUsersWithPasswordPage(int currentPage, int pageSize) {
Page<User> page = new Page<>(currentPage, pageSize);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age", "email")
.orderByAsc("id")
.apply("password IS NOT NULL");
Page<User> result = userMapper.selectPage(page, queryWrapper);
return result.getRecords();
}
测试与调试
单元测试
可以通过 JUnit 进行单元测试,例如:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testInsertUser() {
User user = new User();
user.setName("John");
user.setAge(28);
user.setEmail("[email protected]");
userService.insertUser(user);
User result = userService.selectUserById(user.getId());
assertEquals("John", result.getName());
}
}
异常处理
MyBatis-Plus 提供了异常处理机制,可以通过自定义异常处理器实现:
import com.baomidou.mybatisplus.extension.handlers.AbstractRowBoundsHandler;
import org.springframework.stereotype.Component;
@Component
public class MyExceptionHandler extends AbstractRowBoundsHandler {
@Override
protected void handleException(Exception e) {
// 自定义异常处理逻辑
System.err.println("异常处理:" + e.getMessage());
}
}
日志配置
配置日志框架,例如使用 Logback:
logging:
level:
root: info
mybatisPlus: debug
通过以上配置,可以更好地调试和观察 MyBatis-Plus 的运行情况。
总结MyBatis-Plus 是一个强大的 MyBatis 增强工具,提供了丰富的功能增强特性,极大地提升了开发效率。通过本指南,你可以了解到 MyBatis-Plus 的核心特点、环境搭建、基本 CRUD 操作以及一些高级功能的使用。希望本指南能够帮助你在项目中更好地使用 MyBatis-Plus。如果你需要更深入的学习,可以参考官网文档或参加慕课网的相关课程。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章