天天看点

MybatisPlus快速入门学习目标:学习内容:MybatisPlus功能快速上手配置日志功能扩展

学习目标:

一天掌握MybatisPlus功能,原理,使用

学习内容:

1、 配置MybatisPlus依赖

2、 掌握MybatisPlus使用

3、 掌握MybatisPlus原理

MybatisPlus功能

参考: MybatisPlus官方文档.

一句话:为简化开发而生

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

个人理解:支持多种数据库,自动生成crud语句,消灭crud程序员。

快速上手

1、准备工作

假定数据库中已有如下一张表

MybatisPlus快速入门学习目标:学习内容:MybatisPlus功能快速上手配置日志功能扩展

2、添加依赖

引入 Spring Boot Starter 父工程:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath/>
</parent>
           

引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、lombok、h2 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.2</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
           

不要同时导入mybatis与mybatisPlus,可能有版本冲突。

连接数据库

spring.datasource.username=root
spring.datasource.password=123456789z
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&useUnicode=true
           

3、写MVC类

编写po、mapper;

User.java

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

UserMapper.java

@Mapper
//操作哪张表就把BaseMapper的范型改为该表的po对象,此处为user
public interface UserMapper extends BaseMapper<User> {
}
           

启动类

@MapperScan("com.example.dao")
@SpringBootApplication
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}
           

此时就已经完成增删改查的全部操作了!!!!

4、编写测试类验证

test.java

@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    private UserMapper mus;
    @Test
    void contextLoads() {
        //查询全部用户数据,参数为条件构造器,无条件则传null
        List<User> users = mus.selectList(null);
        users.forEach(System.out::println);
    }

}
           

运行结果:

User(id=1, name=Jone, age=18, [email protected])

User(id=2, name=Jack, age=20, [email protected])

User(id=3, name=Tom, age=28, [email protected])

User(id=4, name=Sandy, age=21, [email protected])

User(id=5, name=Billie, age=24, [email protected])

结果运行成功

配置日志

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

控制台输出日志

功能扩展

插入功能

@Test
    void TestInsert(){
        User user = new User();
        user.setName("zhoulibo");
        user.setAge(3);
        user.setEmail("[email protected]");

        int insert = mus.insert(user);//结果自动生成id
        System.out.println(insert);
        System.out.println(user);
    }
           

结果:

MybatisPlus快速入门学习目标:学习内容:MybatisPlus功能快速上手配置日志功能扩展

mybatisPlus自动生成user ID补全数据,插入成功!!!

原因:分布式系统生成唯一主键ID方法汇总

主键生成策略

雪花算法(保证id全球唯一)

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看github雪花算法。

1、在po实体类中字段上添加注解@TableId(type=IdType.AUTO)

表示该属性为自增id

2、在数据库中对应字段也必须为自增类型,否则报错;

此时插入

MybatisPlus快速入门学习目标:学习内容:MybatisPlus功能快速上手配置日志功能扩展

update

测试插入

@Test
    void testUpdate(){
        User user = new User();
        //通过条件自动拼接动态sql
        user.setId(5l);
        user.setAge(3);
        user.setEmail("修改成功@qq.com");

        int insert = mus.updateById(user);
    }
           

通过条件自动拼接动态sql,完成更新;

MybatisPlus快速入门学习目标:学习内容:MybatisPlus功能快速上手配置日志功能扩展

自动填充字段

方式一:数据库级别

1、在表中新增字段create_time,mod_time,设置默认值dafault=CURRENT_TIMESTAMP;

此时插删改如果不设置这两个属性,数据库将自动修改;

MybatisPlus快速入门学习目标:学习内容:MybatisPlus功能快速上手配置日志功能扩展

2、代码级别

添加注解

@TableField(fill = FieldFill.INSERT_UPDATE)
    private Date modTime;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
           

编写处理器,处理注解

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
    log.info("start autoInsert fill");
    this.setFieldValByName("createTime",new Date(),metaObject);
    this.setFieldValByName("modTime",new Date(),metaObject);
    }
    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start autoUpdate fill");
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("modTime",new Date(),metaObject);
    }
}

           

乐观锁与悲观所

乐观锁:十分乐观,总认为不会发生并发冲突,所以做什么都不加锁就执行,等出现问题了再回滚加锁。

悲观锁:十分悲观,认为什么操作都会有冲突,所以都先加上锁再执行。

乐观锁实现方式:

取出记录时,获取当前version

更新时,带上这个version

执行更新时, set version = newVersion where version = oldVersion

如果version不对,就更新失败

使用:

1、数据库设置乐观锁字段version,默认值1,初始版本;

2、在po对象对应属性添加@version注解;

3、向容器添加乐观锁插件,配置类;

@MapperScan("com.example.dao")
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}
           

分页查询

@Test
    void testSelectByPage(){
        //参数一:当前页
        //参数二:页面大小
        Page<User> pa = new Page<>(1, 2);
        mus.selectPage(pa,null);
        pa.getRecords().forEach(System.out::println);
        System.out.println(pa.getSize());
    }
           

删除操作

//测试删除操作
    @Test
    void testDelete(){
    mus.deleteById(2);
    //批量删除1
        mus.deleteBatchIds(Arrays.asList(1,2,3));
        //批量删除e2
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","周立波");
        mus.deleteByMap(map);
    }
           

性能分析插件

分析每条sql语句执行时间,如果超过规定时间,mp会停止运行

1、导入插件

2、测试使用

条件构造器

@Test
    void testConditionConstructer(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper
                .isNotNull("name") //名字不为空
                .ge("age",12);//年龄大于12
        mus.selectList(userQueryWrapper);
    }
           

代码生成器

只能说太牛逼了,基于数据库中的表,自动生成xml,mapper,service,controller,entity,整个后台所有表的插查删改,具体业务逻辑只需修改各自的service即可,详细使用请看官方文档,使用这个可以快速把后台非业务逻辑部分自动生成,包括注释。但封装的这么好,一定有坑,一坑坑所有,不熟悉的情况下还是慎用。