一、引言
MyBatis - Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上简化了开发流程,提供了更加强大的功能。它可以帮助开发者更高效地进行数据库持久层的开发,减少大量的重复代码。本文将详细介绍 MyBatis - Plus 的创建、使用方法以及相关知识点。
二、MyBatis - Plus 的创建步骤
1. 环境准备
- 确保你的项目是基于 Java 的,并且已经安装好合适的 JDK。对于项目的构建工具,如果使用 Maven,在
pom.xml
文件中添加以下依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis - plus - boot - starter</artifactId><version>最新版本号</version>
</dependency>
如果是 Gradle 项目,则在 build.gradle
文件中添加相应依赖:
implementation 'com.baomidou:mybatis - plus - boot - starter:最新版本号'
2. 配置数据源
- 在 Spring Boot 项目中(MyBatis - Plus 常与 Spring Boot 结合使用),在
application.properties
或application.yml
文件中配置数据源相关信息。以 MySQL 为例,application.yml
配置如下:
spring:datasource:driver - class - name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTCusername: rootpassword: your_password
3. 配置 MyBatis - Plus
- 在 Spring Boot 项目中,无需额外的 MyBatis - Plus 核心配置文件(当然也可以自定义配置)。如果需要自定义配置,可以创建
MybatisPlusConfig
类。例如:
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 可以在这里添加拦截器等自定义配置return interceptor;}
}
4. 创建实体类
- 创建与数据库表对应的实体类。假设我们有一个
User
表,实体类User
如下:
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}
这里使用了 Lombok 的 @Data
注解来简化 getter、setter 等方法的编写,@TableName
注解指定了实体类对应的表名。
5. 创建 Mapper 接口
- 创建继承自
BaseMapper
的 Mapper 接口。对于User
实体类,UserMapper
接口如下:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.springframework.stereotype.Repository;@Repository
public interface UserMapper extends BaseMapper<User> {
}
三、MyBatis - Plus 的使用
1. 基本的 CRUD 操作
- 插入数据:在服务层,可以通过注入
UserMapper
来插入数据。
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void insertUser(User user) {userMapper.insert(user);}
}
- 查询数据:
// 根据 ID 查询
User user = userMapper.selectById(1L);// 查询所有
List<User> userList = userMapper.selectList(null);// 条件查询,使用 QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
List<User> usersByName = userMapper.selectList(queryWrapper);
- 更新数据:
User user = new User();
user.setId(1L);
user.setName("李四");
userMapper.updateById(user);
- 删除数据:
// 根据 ID 删除
userMapper.deleteById(2L);// 根据条件删除
QueryWrapper<User> deleteWrapper = new QueryWrapper<>();
deleteWrapper.lt("age", 18);
userMapper.delete(deleteWrapper);
2. 分页查询
- 首先配置分页插件,在
MybatisPlusConfig
类中添加:
@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}
- 然后在代码中进行分页查询:
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, null);
System.out.println("当前页:" + page.getCurrent());
System.out.println("每页数量:" + page.getSize());
System.out.println("总记录数:" + page.getTotal());
System.out.println("数据列表:" + page.getRecords());
四、MyBatis - Plus 的知识点
1. 条件构造器(Wrapper)
- 功能强大:
QueryWrapper
、UpdateWrapper
等条件构造器可以灵活地构建 SQL 语句中的 WHERE 子句和 SET 子句。除了简单的等于(eq
)、大于(gt
)、小于(lt
)等条件,还有模糊查询(like
、notLike
)、范围查询(between
、notBetween
)、分组(groupBy
)、排序(orderBy
、orderByDesc
)等丰富的方法。 - 示例:
QueryWrapper<User> complexWrapper = new QueryWrapper<>();
complexWrapper.like("name", "张").gt("age", 20).orderByDesc("age").groupBy("department");
List<User> complexResult = userMapper.selectList(complexWrapper);
2. 自动填充功能
- 场景与实现:在某些情况下,我们希望在插入或更新数据时自动填充一些字段,比如创建时间、更新时间等。可以通过实现
MetaObjectHandler
接口来实现。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);}
}
3. 逻辑删除
- 概念与配置:逻辑删除是指在数据库中不是真正地删除数据,而是通过一个字段(如
deleted
)来标记数据是否被删除。在实体类中使用@TableLogic
注解来配置逻辑删除。
@Data
@TableName("user")
@TableLogic
public class User {private Long id;private String name;private Integer age;private String email;// 数据库中 deleted 字段类型为 Integer(0 表示未删除,1 表示已删除)private Integer deleted;
}
当执行删除操作时,MyBatis - Plus 会自动将 deleted
字段更新为表示删除的值,查询时也会自动过滤掉已删除的数据。
4. 代码生成器
- 快速生成代码:MyBatis - Plus 提供了代码生成器,可以根据数据库表结构快速生成实体类、Mapper 接口、Service 层、Controller 层等代码。示例代码如下:
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import java.util.ArrayList;public class CodeGenerator {public static void main(String[] args) {// 代码生成器AutoGenerator mpg = new AutoGenerator();// 全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir(projectPath + "/src/main/java");gc.setAuthor("你的名字");gc.setOpen(false);gc.setFileOverride(false);gc.setServiceName("%sService");gc.setIdType(IdType.AUTO);gc.setDateType(DateType.ONLY_DATE);mpg.setGlobalConfig(gc);// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setDbType(DbType.MYSQL);dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUrl("jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC");dsc.setUsername("root");dsc.setPassword("your_password");mpg.setDataSourceConfig(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setModuleName("demo");pc.setParent("com.example");mpg.setPackageConfig(pc);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);strategy.setEntityLombokModel(true);strategy.setLogicDeleteFieldName("deleted");// 自动填充配置TableFill createTime = new TableFill("create_time", FieldFill.INSERT);TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);ArrayList<TableFill> tableFills = new ArrayList<>();tableFills.add(createTime);tableFills.add(updateTime);strategy.setTableFillList(tableFills);strategy.setRestControllerStyle(true);strategy.setControllerMappingHyphenStyle(true);strategy.setInclude("user"); // 这里填写要生成代码的表名,可以多个mpg.setStrategyConfig(strategy);// 执行生成mpg.execute();}
}
五、总结
MyBatis - Plus 为数据库持久层开发带来了极大的便利,通过简单的配置和丰富的功能,可以快速实现各种复杂的数据库操作。从基本的 CRUD 到高级的条件查询、分页、自动填充、逻辑删除以及代码生成等功能,让开发者可以更专注于业务逻辑的实现,提高开发效率。希望本文能帮助你更好地理解和使用 MyBatis - Plus。