MyBatisPlus

MyBatisPlus


快速入门 使用第三方组件:

  1. 导入对应的依赖
  2. 研究依赖如何配置
  3. 代码如何编写
  4. 提高扩展技术能力

步骤

  1. 创建数据库

  2. 编写项目,初始化项目 使用springboot初始化

  3. 导入依赖

  4. 连接数据库

  5. 传统方式:pojo--dao(mybatis,mapper.xml)--service--controller

  6. 使用了mybatis-plus后

    • pojo
    • mapper接口
    • main 添加扫描包注解
    • 测试类
  7. 配置日志

  8. CRUD扩展

    • 插入操作

      User user = new User();
      user.setUsername("zhangsan"); //1774720336040734721
      user.setPassword("123456");
      user.setEmail("1234562");
      user.setPhone("1234562");
      
      user.setCreateTime(LocalDateTime.now());
      user.setUpdateTime(LocalDateTime.now());
      user.setStatus(1);
      user.setBalance(100);
      
      int insert = userMapper.insert(user);
      
    • 主键生成策略: 数据库字段自增,实体类字段上加: @TableId(value = "id", type = IdType.ASSIGN_ID)

      AUTO(0), // 数据库id自增 
      
      NONE(1), // 未设置主键 
      
      INPUT(2), // 手动输入 
      
      ID_WORKER(3), // 默认的全局唯一id 
      
      UUID(4), // 全局唯一id uuid 
      
      ID_WORKER_STR(5); //ID_WORKER 字符串表示法
      
    • 更新操作

      User user = new User();
      user.setId(29L);
      user.setUsername("zhangsan");
      user.setAge(20);
      int i = userMapper.updateById(user);
      
    • 自动填充时间 baocuo

       字段属性添加注解   
          @TableField(fill = FieldFill.INSERT)
          @ApiModelProperty(value = "创建时间")
          private LocalDateTime createtime;
      
          @TableField(fill = FieldFill.INSERT_UPDATE)
          @ApiModelProperty(value = "修改时间")
          private LocalDateTime updatetime;
      
      @Component
      public class MyMetaObjectHandler implements MetaObjectHandler {
          //插入时的填充策略
          @Override
          public void insertFill(MetaObject metaObject) {
           log.info("start insert fill......");
           //this.setFieldValByName("createTime",new Date(),metaObject);
           //this.setFieldValByName("updateTime",new Date(),metaObject);
      
          }
      
          //更新时的填充策略
          @Override
          public void updateFill(MetaObject metaObject) {
             log.info("start update fill......");
             //this.setFieldValByName("updateTime",new Date(),metaObject);
          }
      }
      
    • 乐观锁

      乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,

      再次更新值测试

      悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

      //字段添加注解
      @Version  //乐观锁注解
      @ApiModelProperty(value = "版本号")
      private Integer version;
      
      
      @MapperScan("com.ishop.mapper")
      @EnableTransactionManagement
      @Configuration //配置类
      public class MyBatisPlusConfig {
      
          @Bean //注册乐观锁插件
          public MybatisPlusInterceptor mybatisPlusInterceptor(){
              MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
              interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
              return interceptor;
          }
      }
      
      

      C7C7139D-5A89-445b-BC11-BB024B76AE63

      B0617322-37C5-4487-A746-1D55FCDCB2B3

    • 查询操作

      批量查询:userMapper.selectBatchIds(Arrays.asList(1,2,3))

      map查询:usermapper.selectByMap(map)

    • 分页操作

      1. 原始Limit分页

      2. pageHelper第三方插件分页

      3. MP其实也内置了分页插件

    • 删除操作

      userMapper.deleteById(1L);
      userMapper.deleteBatchIds(Array.asList(1L,2L));
      
      HashMap<String,Object> map=new HashMap<>();
      map.put("name","zhangsan");
      userMapper.deleteByMap(map);
      
    • 逻辑删除

      物理删除 :从数据库中直接移除

      逻辑删除 :再数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1

         字段添加注解
          @TableLogic //逻辑删除
          @ApiModelProperty(value = "使用状态(1正常 2删除)")
          private Integer status;
      
      配置文件:
            logic-delete-value: 1      #逻辑删除
            logic-not-delete-value: 0   
                
          @Test
          public void testDeleteByIDS(){
              userMapper.deleteById(1L);
          }
      
    • 性能分析插件

      性能分析拦截器,用于输出每条 SQL 语句及其执行时间

      MP也提供性能分析插件,如果超过这个时间就停止运行!

      执行sql超过了时间就抛出异常,可以帮助我们提供工作效率

    • 条件构造器

      Wrapper我们写一些复杂的sql就可以使用它来替代!

      几乎有所有的条件:
      allEq,eq,ne,gt,lt,ge,le,between,notBetween,like,notLike,likeLeft,likeRight,isNull,isNotNull,in notIn,groupBy,orderByAsc,orderByDesc,having,and,or

         @Test
          void testWrapper(){
              QueryWrapper<User> userWrapper = new QueryWrapper<>();
              userWrapper.isNotNull("username")
                      .isNotNull("email")
                      .ge("age",12)
                      .eq("username","zhangsan31");
      
              userMapper.selectList(userWrapper).forEach(System.out::println);
          }
          
          @Test
          void testWrapper2(){
              QueryWrapper<User> userWrapper = new QueryWrapper<>();
              userWrapper.inSql("id","select id from user where id<30");
      
              List<User> users = userMapper.selectList(userWrapper);
              users.forEach(System.out::println);
          }
          
           @Test
          void testWrapper3(){
              QueryWrapper<User> userWrapper = new QueryWrapper<>();
              userWrapper.orderByAsc("id");
              List<User> users = userMapper.selectList(userWrapper);
              users.forEach(System.out::println);
          }
      
    • 代码自动生成器

      AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、

      Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

      // 代码自动生成器

      public class KuangCode {public static void main(String[] args) {

      // 需要构建一个 代码自动生成器 对象

      AutoGenerator mpg = new AutoGenerator();

      // 配置策略

      // 1、全局配置

      GlobalConfig gc = new GlobalConfig();

      String projectPath = System.getProperty("user.dir");

      gc.setOutputDir(projectPath+"/src/main/java");

      gc.setAuthor("XXX");

      gc.setOpen(false);

      gc.setFileOverride(false); // 是否覆盖

      gc.setServiceName("%sService"); // 去Service的I前缀

      gc.setIdType(IdType.ID_WORKER);

      gc.setDateType(DateType.ONLY_DATE);

      gc.setSwagger2(true);

      mpg.setGlobalConfig(gc);

      //2、设置数据源

      DataSourceConfig dsc = new DataSourceConfig();

      dsc.setUrl("jdbc:mysql://localhost:3306/XXX_DB?

      useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");

      dsc.setDriverName("com.mysql.cj.jdbc.Driver");

      dsc.setUsername("root");

      dsc.setPassword("123456");

      dsc.setDbType(DbType.MYSQL);

      mpg.setDataSource(dsc);

      //3、包的配置

      PackageConfig pc = new PackageConfig();

      pc.setModuleName("blog");

      pc.setParent("com.kuang");

      pc.setEntity("entity");

      pc.setMapper("mapper");

      pc.setService("service");

      pc.setController("controller");

      mpg.setPackageInfo(pc);

      //4、策略配置

      StrategyConfig strategy = new StrategyConfig();

      strategy.setInclude("blog_tags","course","links","sys_settings","user_record","

      user_say"); // 设置要映射的表名

      strategy.setNaming(NamingStrategy.underline_to_camel);

      strategy.setColumnNaming(NamingStrategy.underline_to_camel);

      strategy.setEntityLombokModel(true); // 自动lombok;

      strategy.setLogicDeleteFieldName("deleted");

      // 自动填充配置

      TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);

      TableFill gmtModified = new TableFill("gmt_modified",

      FieldFill.INSERT_UPDATE);

      ArrayList tableFills = new ArrayList<>();

      tableFills.add(gmtCreate);

      tableFills.add(gmtModified);

      strategy.setTableFillList(tableFills);

      // 乐观锁

      strategy.setVersionFieldName("version");strategy.setRestControllerStyle(true);

      strategy.setControllerMappingHyphenStyle(true); //

      localhost:8080/hello_id_2

      mpg.setStrategy(strategy);

      mpg.execute(); //执行

      }

      }

posted @ 2024-04-02 14:38  大树2  阅读(10)  评论(0编辑  收藏  举报