本文介绍了 MyBatisPlus,一个强大的 MyBatis 增强工具,提供了简单而强大的 CRUD 操作、支持 Lambda 表达式、自定义主键生成及多种查询方式。文章详细讲解了 MyBatisPlus 的优点、与其他 ORM 框架的比较、环境搭建与依赖配置、基本 CRUD 操作、条件构造器与复杂查询、自动填充与逻辑删除以及插件与扩展功能。
MyBatisPlus简介MyBatisPlus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了简单、强大的 CRUD 操作、支持 Lambda 表达式、支持自定义主键、支持自定义生成器、支持链式操作、支持分页插件等特性。MyBatisPlus 旨在简化 MyBatis 的使用,减少代码编写量,提高开发效率。
与其他 ORM 框架相比,MyBatisPlus 具有以下优势:
开发环境准备主要包括搭建 Java 开发环境以及配置开发工具。以下是推荐的配置步骤:
在 Maven 项目中,需要在 pom.xml
文件中添加 MyBatisPlus 的依赖。示例如下:
<dependencies> <!-- MyBatisPlus 依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.0</version> </dependency> <!-- MySQL 依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!-- Spring Boot 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.3</version> </dependency> </dependencies>
在 Gradle 项目中,需要在 build.gradle
文件中添加 MyBatisPlus 的依赖。示例如下:
dependencies { // MyBatisPlus 依赖 implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.0' // MySQL 依赖 implementation 'mysql:mysql-connector-java:8.0.22' // Spring Boot 依赖 implementation 'org.springframework.boot:spring-boot-starter:2.5.3' }
在 Spring Boot 项目中,MyBatisPlus 的配置文件通常放在 src/main/resources
目录下的 application.yml
或 application.properties
文件中。
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC username: root password: root mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root mybatis-plus.mapper-locations=classpath*:mapper/*.xml mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
在 src/main/java
目录下创建一个配置类,用于初始化 MyBatisPlus 和数据库连接。
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; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }基本CRUD操作
首先,创建一个简单的实体类 User
以及对应的 Mapper 接口 UserMapper
。
package com.example.demo.entity; 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 Integer id; private String name; private Integer age; public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } // Getter and Setter methods public Integer getId() { return id; } public void setId(Integer 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; } }
package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; public interface UserMapper extends BaseMapper<User> { }
使用 MyBatisPlus 进行基本的增删改查操作非常简单,只需要调用对应的方法即可。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public void addUser(User user) { this.save(user); } }
public void deleteUser(Integer id) { this.removeById(id); }
public void updateUser(User user) { this.updateById(user); }
public User getUserById(Integer id) { return this.getById(id); }
MyBatisPlus 支持复杂的参数类型,例如 List、Map 等。以下是一些示例代码。
public void batchInsert(List<User> users) { this.saveBatch(users); }
public List<User> listUsers() { return this.list(); }
public List<User> listUsersByName(String name) { return this.list(Wrappers.<User>lambdaQuery().eq(User::getName, name)); }条件构造器与复杂查询
MyBatisPlus 提供了强大的条件构造器,可以使用 Lambda 表达式构建复杂的查询条件。
public List<User> listUsersByAgeGreaterThan(Integer age) { return this.list(Wrappers.<User>lambdaQuery().gt(User::getAge, age)); }
MyBatisPlus 支持多表关联查询,可以使用 @TableField
注解来关联其他表的数据。
假设有一个 User
表和一个 Address
表,其中 User
表有一个 addressId
字段关联 Address
表的 id
字段。
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @TableName("address") public class Address { @TableId(value="id", type=IdType.AUTO) private Integer id; private String address; public Address() { } public Address(String address) { this.address = address; } // Getter and Setter methods public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.example.demo.entity.Address; public class User { // Existing code... @TableField(exist = true) private Address address; // Getter and Setter methods public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
public List<User> listUsersWithAddress() { return this.list(Wrappers.<User>lambdaQuery().select(User::getId, User::getName, User::getAge).join(Address.class, User::getAddressId, Address::getId)); }
MyBatisPlus 提供了内置的分页插件,可以快速实现分页功能。
public Page<User> getUserPage(Integer currentPage, Integer pageSize) { return this.page(new Page<>(currentPage, pageSize)); }自动填充与逻辑删除
MyBatisPlus 支持自动填充策略,可以在实体类中使用 @TableField
注解来配置自动填充策略。
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.FieldFill; import java.util.Date; @TableName("user") public class User { // Existing code... @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; // Getter and Setter methods public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
MyBatisPlus 支持逻辑删除,可以使用 @TableLogic
注解来实现。
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; @TableName("user") public class User { // Existing code... @TableLogic private Integer deleted; // Getter and Setter methods public Integer getDeleted() { return deleted; } public void setDeleted(Integer deleted) { this.deleted = deleted; } }
MyBatisPlus 提供了多种注解来简化开发过程,以下是一些常用的注解:
@TableId
:用于指定主键字段。@TableField
:用于指定其他字段,可以配置自动填充策略。@TableLogic
:用于实现逻辑删除。@TableField(exist = false)
:用于指定不查询某个字段。@TableField(fill = FieldFill.INSERT)
:用于在插入时自动填充某个字段。@TableField(fill = FieldFill.INSERT_UPDATE)
:用于在插入或更新时自动填充某个字段。MyBatisPlus 提供了多种插件来扩展功能,例如:
MyBatisPlus 内置了分页插件,可以在配置文件中启用。
mybatis-plus: global-config: db-config: id-type: AUTO pagination: enable: true
MyBatisPlus 支持通过配置文件或代码来启用插件功能。
package com.example.demo.config; import com.baomidou.mybatisplus.annotation.DbType; 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(DbType.MYSQL)); return interceptor; } }
如果数据库中没有相应的表,MyBatisPlus 会抛出异常。可以通过以下方式解决:
mybatis-plus: global-config: db-config: id-type: AUTO db-init: enable: true
如果分页插件不起作用,可以检查以下几点:
mybatis-plus: global-config: db-config: db-type: MYSQL pagination: enable: true
如果查询结果为空,可以检查以下几点:
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { @TableId(value="id", type=IdType.AUTO) private Integer id; private String name; // Getter and Setter methods public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
通过以上步骤,可以解决常见的 MyBatisPlus 使用问题。希望本文对你学习和使用 MyBatisPlus 提供了帮助。