MybatisPlus-快速上手

MybatisPlus学习

1、快速开始

创建表:满足一般字段还需要version乐观锁、delete逻辑删除、gm_create创建时间 、gm_modified 修改时间

依赖:

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

注意:mysql如果是8.0以上的需要改变驱动以及在url后面添加时区设置 serverTimezone=GMT%2B8,还有部分情况下useSSL=true 会导致初始化sqlsessionfactory错误将useSSL初始化为false

配置:

spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC

步骤:

1、写一个对应数据库的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

2、写一个实现BaseMapper的接口给定泛型

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

3、测试

@SpringBootTest
class MybatispluslearningApplicationTests {
    @Autowired
    private UserMapper userMapper;
    @Test
    void contextLoads() {
        //selectList中是一个条件构造器
        List<User> userList = userMapper.selectList(null);
        for (User user:userList) {
            System.out.println(user.toString());
        }
    }
}

2、配置日志

我们所有的sql都是不可见的,我需要知道怎么执行的!

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
//可以选择sel4j  log4j 日志输出 需要导入对应的依赖这里选择控制台输出

3、CRUD

1、添加

//简单的数据添加
@Test
    void test1(){
        @TableId(type = IdType.ID_WORKER)
        User user=new User();
        user.setName("java");
        user.setAge(18);
        user.setEmail("baidu@qq.com");
        userMapper.insert(user);
    }

​ id生成策略默认是一个雪花算法,分布式系统唯一id算法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vExccz9U-1658920437309)(MybatisPlus.assets/1658212622778.png)]

设定逐渐策略:

    //数据库ID自增
    AUTO(0),
    /**
     * 该类型为未设置主键类型
     */
    NONE(1),
    /**
     * 用户输入ID
     * 该类型可以通过自己注册自动填充插件进行填充
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);

2、删除

关于逻辑删除:

物理删除就是数据库中完全移除,逻辑删除则是在数据库中没有删除,用一个变量控制显示。防止数据的丢失,类似于回收站。

1、数据库中增加字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4J9HI8w8-1658920437312)(MybatisPlus.assets/1658900685183.png)]

2、测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mgAO4uiK-1658920437316)(MybatisPlus.assets/1658901158552.png)]

查询也会自动凭借deleted=0;

3、修改

@Test
    void test2(){
        User user=new User();
        user.setName("java");
        user.setAge(3);
        user.setId(5L);
        user.setEmail("baidu@qq.com");
        userMapper.updateById(user);
    }

关于自动填充:(gm_create创建时间 、gm_modified 修改时间,阿里巴巴首次明确规定要自动生成与时间相关的数据)

3.1、方式一(数据库级别)

1、表中添加gm_create创建时间 、gm_modified 修改时间 字段 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qqAx7Q79-1658920437318)(MybatisPlus.assets/1658896852028.png)]

3.2、方式二(代码级别)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NMgdabAP-1658920437319)(MybatisPlus.assets/1658897179264.png)]

实体类的属性上需要添加注解!!!

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

编写处理器处理:

@Slf4j
@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);
    }
}

4、查询

    @Test
    void Test3(){
        List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        userList.forEach(System.out::println);
    }

	@Test
    void Test4(){
        HashMap<String,Object> map=new HashMap<>();
        map.put("name","java");
        List<User> userList = userMapper.selectByMap(map);
        userList.forEach(System.out::println);
    }	
分页查询

1、配置拦截器组件

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return  new OptimisticLockerInterceptor();
    }
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

2、测试(分页查询前都会有一个couter(1) 查询)

    @Test
    void Test5(){
        Page<User> page=new Page<>(1,5);
        IPage<User> userIPage = userMapper.selectPage(page, null);
        userIPage.getRecords().forEach(System.out::println);
   }

5、乐观锁

1、给数据库添加version字段!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XbIAqPRR-1658920437321)(MybatisPlus.assets/1658898456066.png)]

2、同步实体类

   @Version
   private Integer version;

3、注册组件

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return  new OptimisticLockerInterceptor();
    }
}

6、条件构造器(解决复杂SQl)

    @Test
    void Test7(){
        QueryWrapper<User> wrapper=new QueryWrapper();
        wrapper.between("age",10,19);
        Integer integer = userMapper.selectCount(wrapper);
    }	

7、代码自动生成器

下面代码3.5.0以上无法使用

1、依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-core</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.9</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <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>

2、代码

    @Test
    void contextLoads() {
        //构建一个代码自动生成器对象
        AutoGenerator mpg = new AutoGenerator();
        //配置策略
        //1、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath+"/src/main/java");
        gc.setAuthor("黄");
        gc.setOpen(false);
        gc.setFileOverride(false);
        gc.setSwagger2(true);
        gc.setServiceName("%sService");
        gc.setIdType(IdType.ID_WORKER);
        mpg.setGlobalConfig(gc);
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.huang");
        pc.setEntity("pojo");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
        //策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user");//设置映射的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setLogicDeleteFieldName("deleted");
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        strategy.setTableFillList(Arrays.asList(createTime,updateTime));
        strategy.setVersionFieldName("version");
        mpg.setStrategy(strategy);
        //自动填充
        mpg.execute();
    }

8、性能分析插件

以往就是druid,目的就是分析每条sql执行的时间来解决慢sql问题

1、导入插件

    @Bean
    @Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(100);//能够执行最大时间,超过就不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

2、配置添加

spring.profiles.active=dev



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值