资讯详情

MybatisPlus:SQL语句打印、SQL分析、自定义主键值策略填充(IdType.INPUT)、动态表名、多租户、枚举、...

文章目录

    • 1. 使用和配置简单 - 带分页配置
    • 2. 用法
      • 2.0 Wrapper属性
      • 2.1 @TableId - 自定义主键生成策略
      • 2.2 @TableField - 自定义字段值填充
      • 2.3 - 乐观锁,悲观锁
        • 2.3.1 @Version - 乐观锁
      • 2.4 DML、DQL操作
        • 2.4.1 DML - 增删改 - 物理
        • 2.4.2 DML - 逻辑删除 - @TableLogic - 仅对注入MyBatisPlus注入的SQL生效,自定义SQL不生效
        • 2.4.3 DQL - 查
        • 2.4.4 条件构造器
      • 2.5 性能分析、SQL打印插件(p6spy) - 支持SQL格式化
      • 2.6 代码生成器
      • 2.7 填充自定义的关键值策略(IdType.INPUT)
      • 2.8 动态表名-根据参与决定执行哪个表-会影响手写表SQL语句且手写SQL记得写表别名 - 手写SQL所有的表名都会通过这一层
        • 内置SQL
        • 手写SQL - 因为动态表单插件只改变动态表单插件,所以必须起表别名from表名,where属性的表名不会改变
      • 2.9 多租户 - 手写SQL所有的表名都会通过这一层 - 加上主表的租户字段where上面,加上连表租户字段on上
      • 2.10 枚举@EnumValue
      • 2.11 类型处理器BaseTypeHandler - 必须开启TableName.autoResultMap=true
      • 2.12 连表自定义SQL - 配合wrapper使用

1. 使用和配置简单 - 带分页配置

<dependencies>          <!--web功能的springboot -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>          <!--数据库驱动 -->         <dependency>             <groupId>mysql</groupId>             <artifactId>mysql-connector-java</artifactId>             <scope>runtime</scope>         </dependency>          <!--JavaBean的属性get.set生成器 -->         <dependency>             <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--SpringBoot自动配置mybatis-plus的默认配置 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <!--SpringBoot热加载 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--SpringBoot单元测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> 

   

spring:
  application:
    name: mybatisplusStudy
  datasource:
    data-password: root
    password: root
    username: 123456
    url: jdbc:mysql://localhost:3306/interview?serverTimezone=UTC&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver

server:
  servlet:
    context-path: /mybatisplus
  port: 80


mybatis-plus:

  # mapper文件的位置
  mapper-locations: classpath:/mappers/*Mapper.xml

  # 哪个包下的类名可以在mapper文件中不用写全限定名,写类名即可
  type-aliases-package: top.linruchang.mybatisplusstudy.dto
  configuration:
    # 默认true - 数据库字段名 与 JavaBean属性名的对应关系
    # 查询数据库时
    # 1. true 数据库字段名中的下划线去掉并toUpperCase = JavaBean属性名.toUpperCase
    # 2. false 数据库字段名.toUpperCase = JavaBean属性名.toUpperCase
    # update、set数据库时
    # 1. true 只要是驼峰的JavaBean字段,会将驼峰的大写字母 变成 _小写字母
    # 2. false 数据库字段 = JavaBean属性字段
    map-underscore-to-camel-case: false
   #打印SQL日志
   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    global-config:
      db-config:
        # @FieldId 默认类型为自增长
        id-type: auto
         # @TableName如果要使用需要设置@TableName的属性是keepGlobalPrefix为true
        table-prefix: test_
        

   

@Configuration
public class MyConfig { 
        

    @Bean
    public PaginationInterceptor getPaginationInterceptor() { 
        
        return new PaginationInterceptor();
    }

}

   


@Data
public class BaseDTO { 
        

    @TableId(type=IdType.AUTO)
    Integer id;

}


@TableName("class_type")
@Data
@Builder
public class ClassType extends BaseDTO { 
        

    @TableField("classNo")
    Integer classNo;

    @TableField("description")
    String description;

}

   

@Mapper
public interface ClassTypeDao extends BaseMapper<ClassType>{ 
        


}

   

@SpringBootTest
class SpringbootMybatisplusApplicationTests { 
        

    @Autowired
    ClassTypeDao classTypeDao;

    @Test
    public void test2() { 
        
        IPage<ClassType> classTypeIPage = classTypeDao.selectPage(new Page<>(1, 1), new QueryWrapper<ClassType>().gt("id", 0));

        List<ClassType> records = classTypeIPage.getRecords();

        records.forEach(System.out::println);
    }
}

   

在这里插入图片描述

   

2. 用法

2.0 Wrapper属性

# wrapper.getSqlSegment()  === 无where关键字 
(sys_user.id LIKE #{ew.paramNameValuePairs.MPGENVAL1} AND friendly_link.name = #{ew.paramNameValuePairs.MPGENVAL2} OR nick_name LIKE #{ew.paramNameValuePairs.MPGENVAL3})


# wrapper.wrapper.getCustomSqlSegment()  === 有where关键字
WHERE (sys_user.id LIKE #{ew.paramNameValuePairs.MPGENVAL1} AND friendly_link.name = #{ew.paramNameValuePairs.MPGENVAL2} OR nick_name LIKE #{ew.paramNameValuePairs.MPGENVAL3})


# wrapper.getTargetSql()  == 带问号参数sql非mybatis的手写sql == 即JDBC形式的SQL
(sys_user.id LIKE ? AND friendly_link.name = ? OR nick_name LIKE ?)

2.1 @TableId - 自定义主键生成策略

主键规则IdType
NONE:默认,跟随全局
AUTO:自增长
INPUT:代码手动填充主键号,不写会报错
ID_WORKER:生成全局唯一ID
UUID:UUID号
ID_WORKER_STR:ID_WORKER的字符串表示

@TableName("student")
public class Student { 
        
    
    //如果数据库该表的主键不是自增长,且不能为null,则用实体类插入数据到数据库时主键必须有值,否则报错
    @TableId(type=IdType.INPUT)
    Integer id;

}

2.2 @TableField - 自定义字段值填充

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler { 
        
    @Override
    public void insertFill(MetaObject metaObject) { 
        

        log.info("插入操作。。。。。。。。。。。。");

        this.setInsertFieldValByName("updateTime", new Date(), metaObject);
        this.setInsertFieldValByName("createTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) { 
        
        log.info("更新操作。。。。。。。。。。。。");

        this.setInsertFieldValByName("updateTime", new Date(), metaObject);
    }
}

   


@TableName("student")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends BaseDTO { 
        

    @TableField("name")
    String name;

    @TableField("sport")
    String sport;
	
	//FieldFill.DEFAULT默认填充不进行处理
    @TableField(value="create_time", fill = FieldFill.INSERT)
    Date createTime;

    @TableField(value="update_time", fill = FieldFill.INSERT_UPDATE)
    Date updateTime;

}

   

    @Test
    public void test7() { 
        

        Student student = new Student();
        student.setId("fbc629c6703f0d8188476feb33c1f41f");
        student.setName("ewoi");
        student.setSport("8764431");

        int flag = studentDao.updateById(student);

        System.out.println(flag);

    }

   

2.3 锁 - 乐观锁、悲观锁

乐观锁@Version:无论干什么都不上锁,出现问题,再次更新置测试即可
悲观锁:无论干什么都先上锁,在操作

2.3.1 @Version - 乐观锁

@Configuration
@EnableTransactionManagement
public class MyConfig { 
        

    @Bean
    public OptimisticLockerInterceptor getOptimisticLockerInterceptor() { 
        
        return new OptimisticLockerInterceptor();
    }

}

   


@Data
public class BaseDTO { 
        

    @TableId(type=IdType.UUID)
    String id;
    
    //乐观锁注解开启
    @Version
    Integer version;

}


@TableName("student")
@Data
@ToString(callSuper=true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends BaseDTO { 
        

    @TableField("name")
    String name;

    @TableField("sport")
    String sport;

    @TableField(value="create_time", fill = FieldFill.INSERT)
    Date createTime;

    @TableField(value="update_time", fill = FieldFill.INSERT_UPDATE)
    Date updateTime;

}

   

    @Test
    public void test8() { 
        

        Student student = studentDao.selectById("fsfsd");

        System.out.println(student);

        student.setSport("做爱做的侍寝111");

        studentDao.updateById(student);

        student = studentDao.selectById("fsfsd");

        System.out.println(student);


    }

2.4 DML、DQL操作


@Data
public class BaseDTO { 
        
    @TableId(type=IdType.UUID)
    String id;
}


@TableName("student")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student extends BaseDTO { 
        
    
    @TableField("name")
    String name;

    @TableField 

标签: c08连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台