深入解析MyBatis-Plus核心功能与实践
一、基础功能应用
MyBatis-Plus的核心组件包括BaseMapper、IService和ServiceImpl,这些组件可高效实现常规数据操作。通过合理配置可大幅减少重复代码。
1.依赖配置
项目需引入基础依赖及扩展功能支持:
<dependencies>
<!-- Spring Boot基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 数据库连接与处理 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!-- 数据源连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.19</version>
</dependency>
<!-- MyBatis-Plus核心库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
</dependencies>
启动类需配置扫描路径,可通过以下两种方式:
- 使用
@MapperScan指定Mapper包路径 - 配合
@ComponentScan和@Repository注解
@MapperScan("com.example.mapper")
@SpringBootApplication
public class AppStarter {
public static void main(String[] args) {
SpringApplication.run(AppStarter.class, args);
}
}
2.实体类注解应用
实体类与数据库表映射需注意以下注解:
@Data
@TableName("task_table")
public class TaskEntity {
@TableId(value = "task_id", type = IdType.AUTO)
private Long taskId;
@TableField("task_name")
private String taskName;
@TableLogic
private Integer status;
@Version
private Integer version;
}
关键注解说明:
@TableName:指定对应数据表@TableId:定义主键字段及生成策略@TableField:字段映射配置@TableLogic:逻辑删除标记@Version:乐观锁版本号
3.核心接口使用
3.1 基础Mapper
通过继承BaseMapper可获得基础CRUD能力:
public interface TaskMapper extends BaseMapper<TaskEntity> {
// 自动注入基础方法
}
3.2 服务层接口
IService接口提供通用服务方法,需配合实现类使用:
public interface TaskService extends IService<TaskEntity> {
// 自动继承服务方法
}
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, TaskEntity>
implements TaskService {
// 实现自定义业务逻辑
}
4.配置优化
4.1 YML配置示例
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
call-setters-on-nulls: false
global-config:
db-config:
id-type: auto
4.2 插件配置
@Configuration
public class MyBatisConfig {
@Bean
public MybatisPlusInterceptor interceptor() {
return new MybatisPlusInterceptor(
new PaginationInnerInterceptor(DbType.MYSQL),
new OptimisticLockerInnerInterceptor()
);
}
}
5.查询构建器
使用LambdaQueryWrapper构建复杂查询:
List<TaskEntity> result = taskService.list(new LambdaQueryWrapper<TaskEntity>()
.eq(TaskEntity::getStatus, 1)
.and(wrapper -> wrapper
.like(TaskEntity::getName, "test")
.or()
.gt(TaskEntity::getPriority, 5)
)
);
6.分页处理
Page<TaskEntity> page = new Page<>(1, 10);
taskService.page(page, new LambdaQueryWrapper<TaskEntity>()
.like("name", "search"));
7.高级功能
7.1 自定义字段填充
@Component
public class FieldFillHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("create_time", LocalDateTime.now(), metaObject);
}
}
7.2 多数据源配置
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://...
slave:
url: jdbc:mysql://...
二、代码生成配置
通过代码生成器可快速创建基础代码结构:
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://...", "user", "pass")
.globalConfig(builder -> builder.author("admin"))
.packageConfig(builder -> builder.parent("com.example"))
.strategyConfig(builder -> builder.addInclude("task_table"))
.execute();
}
}
三、潜在问题与解决方案
1.分页性能问题
大数据量分页建议先查询ID再二次查询:
Page<Long> idPage = taskService.page(new Page<>(1, 100),
new LambdaQueryWrapper<TaskEntity>().select(TaskEntity::getId));
2.批量插入效率
建议使用JDBC批量操作替代默认方法:
public void batchInsert(List<TaskEntity> list) {
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
TaskMapper mapper = session.getMapper(TaskMapper.class);
for (TaskEntity item : list) {
mapper.insert(item);
}
session.commit();
}
}
3.日期类型兼容性
升级Druid到1.1.21以上版本解决JDK8日期类型支持问题:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
四、常见异常处理
1.日期类型异常
错误原因:低版本Druid不支持LocalDateTime类型
解决方案:
- 升级Druid到1.1.21+
- 使用String类型存储日期信息
- 更换数据源实现