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

发布日期:2022-10-13

文章目录

    • 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. 使用和配置简单 - 带分页配置

pom.xml - 依赖

<dependencies>                   <dependency>             <groupId>org.springframework.bootgroupId>             <artifactId>spring-boot-starter-webartifactId>         dependency>                   <dependency>             <groupId>mysqlgroupId>             <artifactId>mysql-connector-javaartifactId>             <scope>runtimescope>         dependency>                   <dependency>             <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> dependency>  <dependency> <groupId>com.baomidougroupId> <artifactId>mybatis-plus-boot-starterartifactId> <version>3.3.2version> dependency>  <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-devtoolsartifactId> dependency>  <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> <exclusions> <exclusion> <groupId>org.junit.vintagegroupId> <artifactId>junit-vintage-engineartifactId> exclusion> exclusions> dependency> dependencies> 


application.yml

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_
        


MyConfig.java - 使MyBatis-plus分页起效

@Configuration
public class MyConfig { 
        

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

}


BaseDTO.java、ClassType.java


@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;

}


ClassTypeDao.java

@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 - 自定义字段值填充

实现填充处理器MetaObjectHandler

@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 - 乐观锁

开启乐观锁SQL拦截器

@Configuration
@EnableTransactionManagement
public class MyConfig { 
        

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

}


添加字段version字段


@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操作

实体类Student以及与该表交互的StudentDao


@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 
IDT(瑞萨)热门型号
item.manufacturerNumber

ICL3241EIVZ-T

芯片

现货库存:1000

item.manufacturerNumber

ICL3245ECAZ-T

芯片

现货库存:1991

item.manufacturerNumber

HIN202EIBNZ

芯片

现货库存:1070

item.manufacturerNumber

ISL32437EIBZ-T

芯片

现货库存:5000

一站式采购
正品保障
价格优势
闪电发货
电子元器件现货采购平台
IDT(瑞萨)代理商优质采购资源,TE代理商独家渠道,提供合理的IDT(瑞萨)产品采购价格,采购IDT(瑞萨)元器件相关产品敬请收藏本站!

全球服务热线

400-990-0325 在线咨询联系客服