• 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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可评论咨询.
  • 相关阅读:
    菜根谭#77
    菜根谭#76
    菜根谭#75
    菜根谭#74
    菜根谭#73
    python迭代器
    python爬取网页数据
    yii2验证规则
    python装饰器的理解
    php中多图上传采用数组差集处理(array_diff,array_map)
  • 原文地址:https://www.cnblogs.com/Dean0731/p/14476532.html
Copyright © 2020-2023  润新知