MybatisPlus 3.3.2的基本使用

这个框架是mybatis的加强版,没有对mybatis侵入

一、基本配置

1、在SpringBoot中引入

 <dependency>
   <groupId>com.baomidougroupId>
    <artifactId>mybatis-plus-boot-starterartifactId>
    <version>3.3.2version>
dependency>

2、在配置文件中配置

# mysql连接数据库
spring.datasource.dirver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/xiang?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=

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

3、创建实体类 User
4、创建Mapper接口继承BaseMapper,这样就可以直接使用BaseMapper里面的方法了

@Repository
public interface UserMapper extends BaseMapper<User> {
}

5、在SpringBoot启动类中配置Mappe扫描

@SpringBootApplication
@MapperScan("com.xcm.mpdemo01.mapper")
public class Mpdemo01Application {

    public static void main(String[] args) {
        SpringApplication.run(Mpdemo01Application.class, args);
    }

}

6、测试

@SpringBootTest
class Mpdemo01ApplicationTests {

    @Autowired
    private UserMapper userMapper;


    // 查询user表中的所有数据
    @Test
    void findAll() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);

    }

	// 根据多个ID查询
    @Test
    void testFindByIds(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        System.out.println(users);
    }


    // 简单条件查询
    @Test
    void testFindByMany(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("username", "admin");
        map.put("status", 1);

        List<User> users = userMapper.selectByMap(map);

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

    // 添加操作
    @Test
    void addUser(){
        User user = new User();
        user.setUsername("熊出没");
        user.setEmail("[email protected]");

        int i = userMapper.insert(user);
        System.out.println("insert: " + i);
    }


    // 修改操作
    @Test
    void updateUser(){
        User user = new User();
        user.setId(4L);
        user.setBirthday(new Date());

        int i = userMapper.updateById(user);
        System.out.println("update: " + i);
    }

}

二、配置主键生成策略

@TableId(type = IdType.AUTO)  // 设置主键的生成策略

IdType.AUTO: 表示自增长
IdType.ID_WORKER: 默认的,使用snowflake算法生成,是一个19位的数字

三、配置自动填充

这个一般根据个人喜好决定是否使用

1、假定表中有一个创建时间(createTime)和一个更新时间(updateTime),首先加上字段的填充策略

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

2、实现具体的填充控制

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 使用MybatisPlus实现添加操作,这个方法就会执行
    @Override
    public void insertFill(MetaObject metaObject) {
        // metaObject, 表中的字段名称,字段类型都是元数据 (可以理解成数据的数据)
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    // 使用MybatisPlus实现修改操作,这个方法就会执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

四、乐观锁

主要解决: 丢失更新

问题:
如果不考虑事物的隔离性,就会产生读的问题:
脏读 不可重复读 幻读
写的问题:丢失更新的问题

案例:张三有500块的工资
财务A: 开始事物 —> 500 + 8000 —> 首先提交事物
财务B: 开始事物 —> 500 - 200 —> 之后提交事务
这样在开始事物的时候是同时进行的,但是提交事物的顺序是有先后的,这样就造成了更新丢失

解决方案:
1、悲观锁:串行,就是在A执行事物的时候其他人不许执行
2、乐观锁:在数据上加了一个version,提交事务的时候,会将当前的版本与数据库版本进行比较,如果版本一致,就会提交事物,然后更新版本

乐观锁的主要适用场景:
当要更新一条记录时,希望这条记录没有被别人更新,也就是说实现线程安全的更新

乐观锁的实现方式:

  1. 取出记录时,获取当前的version
  2. 更新时,带上这个version
  3. 执行更新时,set version = newVersion where version=oldVersion
  4. 如果版本不对,就更新失败

MybatisPlus中具体实现步骤
(1)首先在数据库添加version字段
(2)在实体类添加 version字段
并添加@Version注解

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;  // 版本号

(3)元对象接口处理器添加version的insert默认值

this.setFieldValByName("version", 1, metaObject);

(4)配置插件

@Configuration
@MapperScan("com.xcm.mpdemo01.mapper")
public class MpConfig {

    // 乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

五、逻辑删除

物理删除:从数据库中删除
逻辑删除:数据库中还存在,只是查不到或者不显示而已
注意事项:逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要再查出来就不应使用逻辑删除,而是以一个状态去表示

实现步骤:
1、数据库中添加字段 deleted
2、实体类中的字段添加 @TableLogic 标记

 @TableLogic
 private Integer deleted;

3、配置文件(也可以默认不写)

# 配置逻辑删除
# 全局逻辑删除字段值 3.3.0开始支持,但如果实体类上有 @TableLogic 则以实体上的为准,忽略全局。 即先查找注解再查找全局,都没有则此表没有逻辑删除。。
mybatis-plus.global-config.db-config.logic-delete-field=flag
# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

六、分页

1、配置插件

@Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }

2、测试

// 测试分页
    @Test
    void testSelectByPage(){
        // 1、创建page对象 (传入参数:当前页 和 每页显示记录数)
        Page<User> page = new Page<>(1, 3);
        // 2、调用分页查询的方法
        userMapper.selectPage(page, null);

        System.out.println("当前页:" + page.getCurrent());
        System.out.println("每页数据list集合:" + page.getRecords());
        System.out.println("每页显示记录数::" + page.getSize());
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());

        System.out.println("上一页:" + page.hasNext());
        System.out.println("下一页:" + page.hasPrevious());
    }

七、性能分析

注意: 测试这个功能时我用的3.3.2版本,要添加扩展,运行时还会有冲突,感觉不太好用

三种环境
dev:开发
test:测试
prod:生产

1、配置插件

 /**
     * SQL执行效率插件
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();eer
        performanceInterceptor.setMaxTime(100);  // ms, 超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true)
        return performanceInterceptor;
    }

2、SpringBoot环境设置

#环境设置(test dev prod)
spring.profiles.active=dev

八、复杂查询

使用顶层接口Wrapper下面的实现类,如QueryWapper
里面的方法:
ge gt le lt
eq ne
like
orderByDesc/Asc
between
select

你可能感兴趣的:(Mybatis,Java)