Java案例怎么整合MyBatisPlus?

wen java案例 55

Java项目实战:MyBatis-Plus整合全流程详解(含最佳实践)

目录导读


为什么选择MyBatis-Plus?

在Java开发中,数据库操作框架的选择直接影响开发效率,MyBatis-Plus(简称MP)作为MyBatis的增强工具,在保留MyBatis灵活性的同时,通过自动生成CRUD方法Lambda条件构造器分页插件等特性,将开发效率提升30%以上,根据2024年Java生态报告,MP在Spring Boot项目中的使用率已超过65%。

Java案例怎么整合MyBatisPlus?

核心优势:

  • 无侵入式设计:不影响原生MyBatis功能
  • 代码生成器:一键生成Entity、Mapper、Service
  • 条件构造器:告别繁琐的XML映射文件
  • 分页插件:支持多种数据库物理分页

环境准备与依赖配置

技术栈要求

组件 推荐版本 说明
JDK 8+ 建议使用11或17
Spring Boot 7.x 兼容最新MP版本
MyBatis-Plus 5.3+ 最新稳定版
MySQL 0+ 支持其他主流数据库

Maven依赖配置(pom.xml核心部分)

<!-- MyBatis-Plus 启动器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- 代码生成器(可选) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3</version>
</dependency>

注意: 如果使用Spring Boot 3.x,需选择MP 3.5.5+版本,并确保JDK 17以上。


核心整合步骤(附代码)

步骤1:配置数据源与MP参数

application.yml中添加:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 开发环境开启SQL日志
  global-config:
    db-config:
      logic-delete-field: deleted  # 全局逻辑删除字段
      table-prefix: t_              # 全局表前缀

步骤2:创建实体类与Mapper

// User实体类
@Data
@TableName("t_user")  // 映射表名
public class User {
    @TableId(type = IdType.AUTO)  // 自增主键
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableLogic  // 逻辑删除注解
    private Integer deleted;
}
// Mapper接口
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 无需写任何方法,继承BaseMapper即可获得CRUD
}

步骤3:编写Service层

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    // 可直接使用ServiceImpl提供的方法
    public User findByName(String name) {
        return lambdaQuery().eq(User::getName, name).one();
    }
}

步骤4:控制器测试

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/list")
    public Result list() {
        List<User> list = userService.list();
        return Result.success(list);
    }
    @PostMapping("/add")
    public Result add(@RequestBody User user) {
        boolean save = userService.save(user);
        return save ? Result.success() : Result.fail();
    }
}

核心原理: BaseMapper<T>内置了insertdeleteByIdupdateByIdselectOne等18个基础方法,无需编写任何SQL语句即可完成单表操作。


高级功能实战:分页与条件构造器

1 分页插件配置

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页拦截器,支持多数据库
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

分页查询示例:

// 创建分页对象(当前页,每页大小)
Page<User> page = new Page<>(1, 10);
// 执行分页查询
page = userMapper.selectPage(page, null);
// 获取数据
List<User> records = page.getRecords();
long total = page.getTotal();  // 总记录数

2 Lambda条件构造器(复杂查询)

// 多条件组合查询
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 25)       // 年龄等于25
       .like(User::getName, "张")   // 姓名包含"张"
       .ge(User::getId, 100)        // ID大于等于100
       .orderByDesc(User::getAge);  // 按年龄降序
List<User> users = userMapper.selectList(wrapper);

3 代码生成器自动化

// 快速生成Controller、Service、Mapper、Entity
FastAutoGenerator.create("jdbc:mysql://localhost:3306/demo_db", "root", "123456")
    .globalConfig(builder -> builder.author("开发者").outputDir("src/main/java"))
    .packageConfig(builder -> builder.parent("com.example.demo"))
    .strategyConfig(builder -> builder.addInclude("t_user"))  // 指定表名
    .execute();

常见问题与Q&A

Q1:整合后出现“Invalid bound statement (not found)”错误?

答: 最常见原因是Mapper接口未被扫描,解决方式:

  1. 在启动类添加@MapperScan("com.example.demo.mapper") 注解
  2. 或在每个Mapper接口上加@Mapper注解(推荐第一种)

Q2:如何自定义SQL(使用XML文件)?

答: MP完全兼容原生MyBatis,可在resources/mapper/目录下创建XML文件:

<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="findCustomList" resultType="User">
        SELECT * FROM t_user WHERE age > #{age}
    </select>
</mapper>

然后在UserMapper接口中定义方法:List<User> findCustomList(@Param("age") Integer age);

Q3:逻辑删除无法自动填充时间字段?

答: 需配合MetaObjectHandler自动填充处理器:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.now());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.now());
    }
}

Q4:MyBatis-Plus和PageHelper哪个更好?

答: 推荐MP自带分页,原因:MP的分页是物理分页(自动拼接LIMIT),而PageHelper是基于拦截器的,在高并发场景下存在线程安全问题,MP的分页插件经过阿里巴巴内部验证,性能更稳定。


总结与性能优化建议

整合MyBatis-Plus的最佳实践流程为:配置依赖 → 扫描Mapper → 继承BaseMapper → 使用LambdaQueryWrapper → 配置分页插件,通过本文步骤,你可在10分钟内完成一个生产级的数据访问层搭建。

性能优化3点建议

  1. 开启懒加载:application.yml中配置mybatis-plus.configuration.lazy-loading-enabled=true
  2. 避免N+1查询: 使用MP的selectList()时,检查是否可通过QueryWrapperin方法合并查询
  3. 索引优化: 对频繁查询的字段(如nameage)建立数据库索引,MP不会自动处理索引问题

额外提示: 生产环境建议关闭StdOutImpl日志输出(配置为org.apache.ibatis.logging.nologging),以免影响性能。

通过本教程,你已掌握从零开始整合MyBatis-Plus的全流程,后续可进一步探索动态表名解析器多租户插件等高级特性,让你的Java应用更高效灵活。

抱歉,评论功能暂时关闭!