MyBatis Plus資料:新手入門教程與實(shí)用指南
本文全面介绍了MyBatis Plus资料,包括其功能、优势以及与MyBatis的区别。文章详细讲解了MyBatis Plus的快速开始、基础操作和高级功能,并提供了实战案例分享。通过本文,读者可以深入了解并掌握MyBatis Plus的使用方法。
MyBatis Plus简介MyBatis Plus是什么
MyBatis Plus 是一款基于 MyBatis 的增强工具,旨在简化开发、提升效率。它提供了一系列开箱即用的功能,如分页、动态 SQL 构造、逻辑删除、自动填充等。MyBatis Plus 通过继承 MyBatis 的基本功能,添加了许多便捷的方法来处理数据库操作,使得开发者可以更专注于业务逻辑的实现,而无需过多关注底层数据库操作的细节。
MyBatis Plus与MyBatis的区别
MyBatis 和 MyBatis Plus 都是用于数据库操作的框架,但它们在设计和使用上有所不同:
-
MyBatis:MyBatis 是一个持久层框架,提供了一种动态地生成 SQL 语句的方式,通过 XML 映射文件或注解来定义 SQL 语句的执行。开发者需要手动编写 SQL 语句和相应的 XML 映射文件,或者使用注解来配置 SQL 语句。
- MyBatis Plus:MyBatis Plus 是 MyBatis 的增强工具,它在 MyBatis 的基础上提供了更多的便捷方法和功能。例如,MyBatis Plus 提供了针对 CRUD 操作的简化方法,支持自动生成 SQL 语句,简化了分页操作,并提供了一些高级功能,如自动填充、逻辑删除等。
MyBatis Plus的核心优势
MyBatis Plus 的核心优势在于其提供的便捷方法和功能,使得数据库操作更加简化和高效。以下是 MyBatis Plus 的一些核心优势:
-
简化 CRUD 操作:MyBatis Plus 提供了便捷的方法来执行 CRUD(创建、读取、更新、删除)操作,例如
save
、update
、delete
等方法,使得操作数据库更加简单。 -
分页支持:MyBatis Plus 自带分页插件,支持多种分页方式,如 MyBatis 的 RowBounds、Spring Data 的 PageHelper 等,简化了分页操作。
-
动态 SQL 构造:MyBatis Plus 提供了条件构造器
QueryWrapper
和UpdateWrapper
,可以动态构建 SQL 语句,使得查询和更新操作更加灵活。 -
逻辑删除:MyBatis Plus 支持逻辑删除,可以通过配置来实现数据的软删除,避免了物理删除操作对数据完整性的破坏。
-
自动填充:MyBatis Plus 支持自动填充字段的功能,可以自动填充创建时间和更新时间等字段,减轻了开发者的负担。
-
数据库字段映射:MyBatis Plus 支持数据库字段与实体类字段之间的映射,简化了数据库表与实体类之间的映射关系。
- 插件支持:MyBatis Plus 提供了插件机制,允许开发者自定义插件来扩展框架的功能,满足特定业务需求。
环境搭建与依赖配置
在开始使用 MyBatis Plus 之前,需要搭建开发环境并配置相关依赖。这里以 Maven 项目为例,展示如何在项目中引入 MyBatis Plus 的依赖。
- 创建 Maven 项目:首先创建一个新的 Maven 项目。可以通过 IntelliJ IDEA 或 Eclipse 等 IDE 创建。
- 配置
pom.xml
文件:在pom.xml
文件中添加 MyBatis Plus 的依赖。以下是一个示例配置:
<dependencies>
<!-- MyBatis Plus 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- Spring Boot Starter JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
- 配置数据库连接:在
application.properties
文件中配置数据库连接信息,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
创建MyBatis Plus的Entity类
在 MyBatis Plus 中,实体类主要用于映射数据库表中的数据。以下是创建一个简单的实体类 User
的示例:
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
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;
}
}
在这个示例中,使用了 @TableName
注解来指定与实体类对应的数据库表名,以及 @TableId
注解来指定主键字段。
编写Mapper接口与配置
在 MyBatis Plus 中,Mapper 接口用于定义数据库操作的方法。以下是创建一个简单的 Mapper 接口 UserMapper
的示例:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
在上述代码中,UserMapper
继承了 BaseMapper
接口,BaseMapper
接口中定义了一些基本的 CRUD 操作方法,例如 insert
、update
、delete
等,这些方法可以自动映射到对应的 SQL 语句。
CRUD操作简介
MyBatis Plus 提供了简单易用的方法来执行 CRUD 操作。以下是 CRUD 操作的简要介绍及示例代码:
读取操作(Select)
- 查询单个记录:使用
selectById
方法查询单个记录。
User user = userMapper.selectById(1);
System.out.println(user.getName());
- 查询多条记录:使用
selectList
方法查询多条记录。
List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("age", 20));
for (User user : users) {
System.out.println(user.getName());
}
创建操作(Create)
- 插入一条记录:使用
insert
方法插入一条记录。
User user = new User();
user.setName("张三");
user.setAge(20);
user.setEmail("zhangsan@example.com");
int result = userMapper.insert(user);
System.out.println(result); // 输出受影响的行数
更新操作(Update)
- 更新单条记录:使用
update
方法更新单条记录。
User user = new User();
user.setId(1);
user.setName("李四");
user.setAge(25);
int result = userMapper.updateById(user);
System.out.println(result); // 输出受影响的行数
- 更新多条记录:使用
update
方法和QueryWrapper
更新多条记录。
User user = new User();
user.setAge(25);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
int result = userMapper.update(user, queryWrapper);
System.out.println(result); // 输出受影响的行数
删除操作(Delete)
- 删除单条记录:使用
deleteById
方法删除单条记录。
int result = userMapper.deleteById(1);
System.out.println(result); // 输出受影响的行数
- 删除多条记录:使用
delete
方法和QueryWrapper
删除多条记录。
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
int result = userMapper.delete(queryWrapper);
System.out.println(result); // 输出受影响的行数
分页查询
MyBatis Plus 提供了简单易用的分页功能,可以通过 Page
类来实现分页查询。以下是一个简单的分页查询代码示例:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
Page<User> page = new Page<>(1, 5); // 设置当前页为 1,每页显示 5 条记录
IPage<User> result = userMapper.selectPage(page, new QueryWrapper<User>());
List<User> users = result.getRecords();
for (User user : users) {
System.out.println(user.getName());
}
System.out.println("当前页:" + result.getCurrent());
System.out.println("每页条数:" + result.getSize());
System.out.println("总条数:" + result.getTotal());
System.out.println("总页数:" + result.getPages());
条件构造器使用
MyBatis Plus 提供了 QueryWrapper
和 UpdateWrapper
两个条件构造器,用于构建动态的查询和更新条件。以下是一些常见的条件构造器用法示例:
简单条件
- 等于:使用
eq
方法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
List<User> users = userMapper.selectList(queryWrapper);
- 不等于:使用
ne
方法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ne("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
- 大于:使用
gt
方法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
- 小于:使用
lt
方法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
复杂条件
- 链式调用:可以链式调用多个条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").gt("age", 20);
List<User> users = userMapper.selectList(queryWrapper);
- 逻辑连接:使用
and
和or
方法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").or().eq("email", "zhangsan@example.com");
List<User> users = userMapper.selectList(queryWrapper);
高级功能探索
自动填充与逻辑删除
自动生成填充和逻辑删除是 MyBatis Plus 提供的两个高级功能,可以大大简化数据库操作。
自动填充
- 创建时间:自动填充创建时间字段
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.FieldFill;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
// Getter 和 Setter 方法
}
- 更新时间:自动填充更新时间字段
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
// Getter 和 Setter 方法
}
逻辑删除
- 配置逻辑删除字段
mybatis-plus.global-config.db-config.logic-delete-field-name="deleted"
- 实体类配置逻辑删除
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableLogic;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableLogic
private boolean deleted;
// Getter 和 Setter 方法
}
数据库字段映射与序列化
MyBatis Plus 支持数据库字段与实体类字段之间的映射,同时也支持字段的序列化。
字段映射
- 字段注解
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "user_name")
private String name;
@TableField(value = "user_age")
private Integer age;
// Getter 和 Setter 方法
}
字段序列化
- 序列化字段
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "user_name", serializeName = "name")
private String name;
@TableField(value = "user_age", serializeName = "age")
private Integer age;
// Getter 和 Setter 方法
}
插件开发与自定义逻辑
MyBatis Plus 提供了插件机制,允许开发者自定义插件来扩展框架的功能。
自定义插件
- 实现插件接口
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 执行拦截逻辑
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 设置插件属性
}
}
- 配置插件
<bean id="myPlugin" class="com.example.demo.plugin.MyPlugin"/>
<bean id="mybatisPlusConfig" class="com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration">
<property name="plugins" ref="myPlugin"/>
</bean>
实战案例分享
使用MyBatis Plus构建简单的CRUD应用
以下是一个简单的 CRUD 应用示例,展示了如何使用 MyBatis Plus 进行数据库操作。
创建实体类
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
// Getter 和 Setter 方法
}
创建 Mapper 接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
创建 Service 类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
public class UserService extends ServiceImpl<UserMapper, User> {
}
创建 Controller 类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.save(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateById(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.removeById(id);
}
@GetMapping
public List<User> getAllUsers() {
return userService.list();
}
}
配置应用主类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
MyBatis Plus与Spring Boot集成实例
以下是一个将 MyBatis Plus 与 Spring Boot 集成的实例,展示了如何在 Spring Boot 应用中使用 MyBatis Plus。
创建实体类
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
// Getter 和 Setter 方法
}
创建 Mapper 接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
创建 Service 类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
public class UserService extends ServiceImpl<UserMapper, User> {
}
创建 Controller 类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.save(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateById(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.removeById(id);
}
@GetMapping
public List<User> getAllUsers() {
return userService.list();
}
}
配置应用主类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
常见问题与解决
常见问题汇总
- 连接数据库失败:检查
application.properties
文件中的数据库连接配置是否正确。 - 找不到实体类对应的表名:检查实体类中是否正确使用了
@TableName
注解。 - 找不到 Mapper 接口对应的实现类:检查 Mapper 接口是否继承了
BaseMapper
接口。 - SQL 语句执行失败:检查 SQL 语句是否正确,可以通过
selectPage
方法的返回值来获取调试信息。 - 分页查询结果为空:检查分页参数是否正确,可以通过控制台输出来查看 SQL 语句的执行情况。
常见错误及调试技巧
- 异常:
java.lang.ClassCastException
Caused by: java.lang.ClassCastException: com.baomidou.mybatisplus.extension.plugins.Page cannot be cast to com.baomidou.mybatisplus.core.metadata.IPage
解决方法:确保 Page
类型的变量转换为 IPage
类型的变量。
Page<User> page = new Page<>(1, 5);
IPage<User> result = userMapper.selectPage(page, new QueryWrapper<>());
- 异常:
java.lang.IllegalArgumentException
Caused by: java.lang.IllegalArgumentException: No writer for type: java.util.Date
解决方法:确保实体类中的字段类型与数据库表中的字段类型一致,或者使用序列化注解 @TableField(serializeName = "your_field_name")
。
@TableField(serializeName = "create_time")
private Date createTime;
-
调试技巧
- 使用 MyBatis 的日志功能:在
mybatis-plus
配置中启用日志功能,查看 SQL 语句的执行情况。
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- 使用 IDE 的调试工具:通过设置断点和查看变量值,来调试代码的执行流程。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章