尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MyBatis-Plus快速入门与高效开发实践

MyBatis-Plus快速入门与高效开发实践 1. MyBatis-Plus快速入门指南刚接触Java持久层开发时我总在重复编写相似的CRUD代码。直到遇到MyBatis-Plus简称MP这个号称为简化开发而生的工具彻底改变了我的工作流。作为MyBatis的增强工具包它在保持原生MyBatis所有特性的基础上通过自动化CRUD操作和丰富的功能插件将开发效率提升了至少50%。下面分享我从零开始掌握MP的完整路径。2. 环境准备与基础配置2.1 项目依赖引入在Spring Boot项目中集成MP只需两步在pom.xml中添加核心依赖当前最新3.5.17版本dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.17/version /dependency配置数据源以application.yml为例spring: datasource: url: jdbc:mysql://localhost:3306/mp_demo?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver注意MP会自动配置MyBatis的核心组件包括SqlSessionFactory和MapperScannerConfigurer无需额外声明2.2 实体类设计规范MP通过实体类自动映射数据库表字段命名推荐使用驼峰转下划线规则Data TableName(sys_user) // 显式指定表名 public class User { TableId(type IdType.AUTO) // 主键自增 private Long id; private String userName; // 自动映射为user_name TableField(pwd) // 强制指定列名 private String password; TableField(exist false) // 非表字段 private String tempData; }3. 核心CRUD操作实战3.1 Mapper接口与Service封装基础Mapper只需继承BaseMapper即可获得18种通用方法public interface UserMapper extends BaseMapperUser { // 可自定义扩展方法 } Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { // 继承即获得ServiceImpl的CRUD封装 }3.2 常用API示例插入操作User user new User(); user.setUserName(test); user.setPassword(123); // 返回影响行数 int rows userMapper.insert(user); // 插入后自动回填主键 System.out.println(user.getId());更新操作// 根据ID更新 user.setPassword(456); userMapper.updateById(user); // 条件更新 UpdateWrapperUser wrapper new UpdateWrapper(); wrapper.eq(user_name, test) .set(pwd, 789); userMapper.update(null, wrapper);查询操作// 1. ID查询 User user1 userMapper.selectById(1L); // 2. 条件构造器查询 QueryWrapperUser query new QueryWrapper(); query.select(id, user_name) .like(user_name, 张) .orderByDesc(id); ListUser users userMapper.selectList(query); // 3. Lambda表达式写法 ListUser lambdaUsers userMapper.selectList( Wrappers.UserlambdaQuery() .select(User::getId, User::getUserName) .like(User::getUserName, 李) );4. 高级特性应用4.1 分页插件配置先配置分页拦截器Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }使用分页查询PageUser page new Page(1, 10); // 当前页, 每页数量 QueryWrapperUser wrapper new QueryWrapper(); wrapper.ge(id, 100); PageUser result userMapper.selectPage(page, wrapper); System.out.println(总记录数 result.getTotal()); result.getRecords().forEach(System.out::println);4.2 自动填充功能实现MetaObjectHandler处理自动填充字段Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }实体类添加注解TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.UPDATE) private LocalDateTime updateTime;5. 开发效率工具5.1 代码生成器使用AutoGenerator快速生成基础代码FastAutoGenerator.create(jdbc:mysql://localhost:3306/mp_demo, root, 123456) .globalConfig(builder - builder .author(dev) .outputDir(D://mp-code) .disableOpenDir() ) .packageConfig(builder - builder .parent(com.example) .moduleName(system) ) .strategyConfig(builder - builder .addInclude(sys_user) .entityBuilder() .enableLombok() .enableTableFieldAnnotation() ) .execute();5.2 MybatisX插件IDEA安装MybatisX插件后实体类与Mapper方法间跳转XML与接口方法导航自动生成查询语句字段名自动提示6. 生产环境最佳实践6.1 性能优化建议批量操作使用executeBatchListUser userList new ArrayList(); // 添加数据... SqlSession sqlSession sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper mapper sqlSession.getMapper(UserMapper.class); userList.forEach(mapper::insert); sqlSession.commit();复杂查询建议超过3表关联时使用原生XML编写SQL大数据量分页使用优化器PaginationInnerInterceptor pagination new PaginationInnerInterceptor(); pagination.setOptimizeJoin(true); // 优化JOIN查询 pagination.setMaxLimit(1000L); // 单页最大记录数6.2 常见问题排查问题1字段值为null不更新解决方案// 方法1全局配置 mybatis-plus: global-config: db-config: logic-not-delete-value: 0 logic-delete-value: 1 insert-strategy: not_empty update-strategy: not_empty // 方法2字段注解 TableField(updateStrategy FieldStrategy.IGNORED) private String remark;问题2多数据源冲突推荐使用dynamic-datasource组件DS(slave) // 指定数据源 public ListUser selectFromSlave() { return userMapper.selectList(null); }7. 扩展生态整合7.1 与Ruoyi框架集成在Ruoyi中引入MP的步骤排除原有Mybatis依赖添加MP starter依赖修改application.ymlmybatis-plus: mapper-locations: classpath*:mapper/**/*Mapper.xml type-aliases-package: com.ruoyi.**.domain configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl7.2 多模块项目配置父pom管理版本dependencyManagement dependencies dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.17/version /dependency /dependencies /dependencyManagement子模块按需引入dependencies dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId /dependency /dependencies实际项目中我习惯将MP配置放在common模块实体类和Mapper接口根据业务域划分到不同模块。对于超过10个表的系统建议使用Mybatis-Mate企业级模块获得分库分表等高级特性支持。
返回列表