mybatisplus

概述

  • 简化开发,省略crud代码
  • 类似jpa,tk-mapper,
  • 在mybatis增强

特性

  • 无侵入,损耗小,强大CRUD操作,Lambda,主键生成,全局拦截插件,性能分析插件,分页插件,内置代码生成器,自定义全局通用操作,ActiveRecord

快速入门

建表,依赖,配置,连数据库,代码,

image-20210129111233259

<dependency>
	<groupId>com.baomidou</groupId>
    <artifictId>mybatis-plus-boot-starter</artifictId>
    <version>3.0.5</version>
</dependency>

image-20210129112059573

传统的方式:pojo-dao-service-controller

信方式:pojo,mapper接口,使用

// 主启动类可能需要扫描@MapperScan("xx.xx.mapper")
@Repository
public interface UserMapper extends BaseMapper<User>{
    // 已经编写完成,不需要配置文件
}
Autowired UserMapper userMapper;
void test(){
	List<User> 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

主键自增

1,实体类子段@TableId(type=IdType.AUTO) 主键

​ IdType.AUTO,NONE,INPUT,ID_WORKER,UUID,ID_WORKER_STR

2,数据库子段自增

userMapper.insert(User);

update

userMapper.updateById(user);

自动填充

  • 数据库级别,

    • create_time,
    • update_time,自动更新,current_timestmp
    • 不推荐使用
  • 代码级别

    • @TbaleField(fill=FieldFill.INSERT) 自动填充内容

    • @TbaleField(fill=FieldFill.INSERT_UPDATE) 自动更新

    • 编写处理器

      • // 通过反射的原理,识别操作,对对象进行修改
        @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

  • 数据库添加version子段,并设置默认值

  • 实体类添加字段 @Version注解

  • 注册组件

    • @Configuration
      public class MybatisPlusConfig {
          // 乐观锁插件
          public OptimisticLockerInterceptor optimisticLockerInterceptor(){
              return new OptimisticLockerInterceptor();
          }
      }
      

Select

map.put("name","xxx")
userMapper.selectByMap(map);

分页查询

  • limit
  • pageHelper
  • mybatisplus
 // 配置,还使用limit使用的
@Bean
public PaginationInterceptor paginationInterceptor(){
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    //paginationInterceptor.setDialectClazz();
    return paginationInterceptor;
}
Page<User> page = new Page<User>(2,5)
userMapper.selectPage(page,null); // 每页5个第二页
page.getRecords()
page.total()    

删除

  • 与查询类似

  • 逻辑删除:数据库中没有被移出

    • 数据库增加字段deleted

    • pojo增加字段,@TableLogic

    • 配置

      • @Bean
        public ISqlInjector sqlInjector(){
            return new LogicSqlInjector();
        }
        
      • mybatis-plus.global-config.db-config.logic-delete-value=1
        mybatis-plus.global-config.db-config.logic-not-delete-value=0
        
    • 此时删除操作其实底层是更新操作,数据库记录没有删除,若此时正常条件下查询该记录,是查不到的

性能分析插件

有些sql太慢,超时停止,分析sql

@Bean
@Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor(){
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(1);
    performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}

条件构造器

复杂的SQL

QueryWrapper<User> 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)

代码生成器

//构建一个代码生成器对象
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<TableFill> 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

posted @ 2021-03-03 19:52  下雨天,真好  阅读(105)  评论(0编辑  收藏  举报