Administrator
发布于 2026-05-17 / 1 阅读
0

mybatisplus

# 概述 - 简化开发,省略crud代码 - 类似jpa,tk-mapper, - 在mybatis增强 # 特性 - 无侵入,损耗小,强大CRUD操作,Lambda,主键生成,全局拦截插件,性能分析插件,分页插件,内置代码生成器,自定义全局通用操作,ActiveRecord # 快速入门 建表,依赖,配置,连数据库,代码, !\[image-20210129111233259\](https://cdn.jsdelivr.net/gh/Dean0731/File@main//image/image-20210129111233259.png) \`\`\`xml com.baomidou mybatis-plus-boot-starter 3.0.5 \`\`\` !\[image-20210129112059573\](https://cdn.jsdelivr.net/gh/Dean0731/File@main//image/image-20210129112059573.png) 传统的方式:pojo-dao-service-controller 信方式:pojo,mapper接口,使用 \`\`\`java // 主启动类可能需要扫描@MapperScan("xx.xx.mapper") @Repository public interface UserMapper extends BaseMapper{ // 已经编写完成,不需要配置文件 } \`\`\` \`\`\`java Autowired UserMapper userMapper; void test(){ List list = userMapper.selectList(null);// 全部用户 } \`\`\` # 配置日志 现在sql不可见,日志可以看到 \`\`\` mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.StdOutImpl \`\`\` # CRUD ## 用户ID会自动插入:全局的唯一id ### 主键生成策略 uuid,redis生成,雪花算法等等都是用来生成唯一id的 重点:雪花算法,生成long型,分布式唯一id生成 !\[image-20210129134706999\](https://cdn.jsdelivr.net/gh/Dean0731/File@main//image/image-20210129134706999.png) ### 主键自增 1,实体类子段@TableId(type=IdType.AUTO) 主键 IdType.AUTO,NONE,INPUT,ID_WORKER,UUID,ID_WORKER_STR 2,数据库子段自增 \`\`\`java userMapper.insert(User); \`\`\` ## update \`\`\`java userMapper.updateById(user); \`\`\` ## 自动填充 - 数据库级别, - create_time, - update_time,自动更新,current_timestmp - 不推荐使用 - 代码级别 - @TbaleField(fill=FieldFill.INSERT) 自动填充内容 - @TbaleField(fill=FieldFill.INSERT_UPDATE) 自动更新 - 编写处理器 - \`\`\`java // 通过反射的原理,识别操作,对对象进行修改 @Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("insert 创建时间"); this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("update update时间"); this.setFieldValByName("updateTime",new Date(),metaObject); } } \`\`\` ## 乐观锁,悲观锁 乐观锁,操作不加锁,操作是否执行由代码配合数据版本号实现, !\[image-20210129142208175\](https://cdn.jsdelivr.net/gh/Dean0731/File@main//image/image-20210129142208175.png) - 数据库添加version子段,并设置默认值 - 实体类添加字段 @Version注解 - 注册组件 - \`\`\`java @Configuration public class MybatisPlusConfig { // 乐观锁插件 public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } } \`\`\` ## Select \`\`\`java map.put("name","xxx") userMapper.selectByMap(map); \`\`\` ## 分页查询 - limit - pageHelper - mybatisplus \`\`\`java // 配置,还使用limit使用的 @Bean public PaginationInterceptor paginationInterceptor(){ PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); //paginationInterceptor.setDialectClazz(); return paginationInterceptor; } \`\`\` \`\`\`java Page page = new Page(2,5) userMapper.selectPage(page,null); // 每页5个第二页 page.getRecords() page.total() \`\`\` ## 删除 - 与查询类似 - 逻辑删除:数据库中没有被移出 - 数据库增加字段deleted - pojo增加字段,@TableLogic - 配置 - \`\`\`java @Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); } \`\`\` - \`\`\`properties mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 \`\`\` - 此时删除操作其实底层是更新操作,数据库记录没有删除,若此时正常条件下查询该记录,是查不到的 # 性能分析插件 有些sql太慢,超时停止,分析sql \`\`\`java @Bean @Profile({"dev","test"}) public PerformanceInterceptor performanceInterceptor(){ PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(1); performanceInterceptor.setFormat(true); return performanceInterceptor; } \`\`\` # 条件构造器 复杂的SQL \`\`\`java QueryWrapper wrapper = new QueryWrapper(); wrapper.isNotNull("name").isNotNull("email").ge("age","12"); userMapper.selectList(wrapper); \`\`\` \`\`\` wrapper.inSql("id","select id from user where id\<3") userMapper.selectObjs(wrapper) \`\`\` # 代码生成器 \`\`\`java //构建一个代码生成器对象 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String dir = System.getProperty("user.dir"); // 输出路径 gc.setOutputDir(dir+"/src/main/java"); gc.setAuthor("dean"); gc.setOpen(false); gc.setFileOverride(false);// 是否覆盖 gc.setServiceName("%sService"); gc.setIdType(IdType.ID_WORKER); gc.setDateType(DateType.ONLY_DATE); gc.setSwagger2(true); // 数据源配置 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setUrl(); dataSourceConfig.setUsername(); dataSourceConfig.setPassword(); dataSourceConfig.setDriverName(); dataSourceConfig.setDbType(DbType.MYSQL); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName("blog"); pc.setParent("top.dean"); pc.setEntity("entity"); pc.setMapper("mapper"); pc.setService("service"); pc.setController("controller"); //策略配置 StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setInclude("user","role"); strategyConfig.setNaming(NamingStrategy.underline_to_camel); strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); strategyConfig.setSuperEntityClass("父类,没有就不设置"); strategyConfig.setEntityLombokModel(true); strategyConfig.setRestControllerStyle(true); strategyConfig.setLogicDeleteFieldName("deleted");// 逻辑删除子段 // 自动填充 TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT); TableFill gmtModified = new TableFill("gmt_create", FieldFill.INSERT_UPDATE); ArrayList list = new ArrayList\<\>(); list.add(gmtCreate); list.add(gmtModified); strategyConfig.setTableFillList(list); // 乐观锁 strategyConfig.setVersionFieldName("version"); strategyConfig.setControllerMappingHyphenStyle(true); mpg.setStrategy(strategyConfig); mpg.setPackageInfo(pc); mpg.setDataSource(dataSourceConfig); mpg.setGlobalConfig(gc); mpg.execute(); \`\`\` 参考:https://gitee.com/kuangstudy/openclass