栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MybatisPlus笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MybatisPlus笔记

MybatisPlus没有对Mybatis做功能上的优化,只是简化了开发。 1、创建mybatis_plus项目步骤

①创建数据库,创建数据库表,添加数据,用于mp操作。

②创建springboot工程,2.2.1版本。

③pom.xml引入相关依赖。


    
        org.springframework.boot
        spring-boot-starter
    

    
        org.springframework.boot
        spring-boot-starter-test
        test
        
            
                org.junit.vintage
                junit-vintage-engine
            
        
    

    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.0.5
    

    
    
        mysql
        mysql-connector-java
        8.0.20
    

    
    
        org.projectlombok
        lombok
    

④安装lombok插件。

⑤配置application.properties文件(数据库)。

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=

⑥编写代码。

2、使用mp插入数据

mp 会自动生成 id(主键)值,数值为19位。mp 的 insert 方法返回的是影响的行数。

// 添加操作
    @Test
    public void addUser() {
        User user = new User();
        user.setName("jianjian");
        user.setAge(23);
        user.setEmail("jianjian@qq.com");

        // insert 为影响的行数; mp 自动生成 id(主键),19位
        int insert = userMapper.insert(user);
        System.out.println("insert: " + insert);
    }
3、主键策略

①数据库自增长序列或字段。优点是排序方便。缺点是需要获取上一张表的最后一个数据的 id 值,麻烦。

②UUID:每次生成随机唯一的值。优点是不需要获取上一张表的最后一个数据的 id 值。缺点是排序不方便。

③redis 生成 id。redis 是单线程的,可以使用 redis 集群来获取更高的吞吐量。假设一个集群中有5 台 redis,可以初始化每台redis的值分别为1,2,3,4,5,然后步长都是 5,结果如下图。

④mybatis_plus 自带策略:snowflake 算法。

4、主键类型代码解释:TableId(type = IdType.AUTO)

①AUTO:自动增长。

②INPUT:自己设置id值。

③NONE:没有生成策略,自己输入id值。

④UUID:生成随机唯一id值。

⑤ID_WORKER:mp 自带策略,生成 19 位值,数字类型使用这种策略。

⑥ID_WORKER_STR:mp 自带策略,生成 19 位值,字符串类型使用这种策略。

5、mp实现自动填充

①在自动填充属性上面加上注解:TableField(fill = ..)。

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

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

②创建类(handler 包,不要忘记在类上面加上 Component 注解),实现接口 MetaObjectHandler,实现接口里面的方法。

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 使用 mp 实现添加操作,该方法会执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);
    }

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

}

6、mp实现乐观锁

①表中添加字段 version,对应实体类添加版本号属性。

②在实体类版本号属性添加注解(@Version)。

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

③配置乐观锁插件,建议专门写一个配置类。

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

③测试。在修改之前,MybatisPlus会判断根据 id 得到的版本号和数据库中的版本号是否一致,如果一致就会修改成功,否则修改失败。

// 测试乐观锁
    @Test
    public void testOptimisticLocker() {
        // 根据 id 查询数据
        User user = userMapper.selectById(1522543846976765953L);
        // 进行修改
        user.setAge(200);
        userMapper.updateById(user);
    }
7、mp实现分页

①配置分页插件。

// 分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

②编写代码。

// 分页查询
    @Test
    public void testPage() {
        // 创建 page 对象
        // 传入两个参数:当前页 和 每页显示记录数
        Page page = new Page<>(1, 3);

        // 调用 mp 分页查询的方法
        // 调用 mp 分页查询过程中,底层封装
        // 把分页所有数据封装到 page 对象里面
        userMapper.selectPage(page, null);

        // 通过 page 对象获取分页数据
        System.out.println(page.getCurrent()); // 当前页
        System.out.println(page.getRecords()); // 每页数据 list 集合
        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()); // 是否有上一页
    }
8、删除

①物理删除:真实删除,将对应数据从数据库中删除,数据库表中再也没有此条数据。

②逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

逻辑删除步骤:

第一步:表中添加逻辑删除字段,对应实体类添加属性,属性添加注解(TableLogic)。

@TableLogic // 逻辑删除
private Integer deleted;

第二步:配置逻辑删除的插件。

// 逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

第三步:测试。如果配置成功,那么执行下面的删除方法时,只会把数据库中的相应数据的 deleted 字段改为 1。

// 测试逻辑删除
    @Test
    public void testDeleteLogic() {
        int result = userMapper.deleteById(2L);
        System.out.println(result);
    }

 补充:deleted 字段默认没有删除时为 0,删除时为 1。也可以通过将下面的代码写到配置文件当中,自己设定删除和未删除的值。

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/865036.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号