mybatis-plus的使用和讲解

mybatis-plus的使用和讲解

MyBatis-Plus官方网址

特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD
    操作,更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD
    操作

  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere ) 内置代码生成器:采用代码或者

  • 代码生成器可快速生成 Mapper 、 Model 、 Service 、 Controller
    层代码,支持模板引擎,更有超多自定义配置等您来使用

  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

  • 分页插件支持多种数据库:支持
    MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

核心功能:

  • 代码生成器
  • CRUD接口
  • 条件构造器
  • 分页插件
  • Sequence主键
  • 自定义ID生成器

快速使用Mybtis-plus

  1. 首先使用Spring Initializr 快速创建一个springboot项目
  2. 在pom文件中导入mybatis-plus的依赖坐标
   <!-- 数据库驱动 -->
   <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   </dependency>
   <!-- lombok插件 -->
   <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   </dependency>
   <!-- mybatis-plus -->
   <dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.0.5</version>
   </dependency>
  1. 准备一个数据表
DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);
DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
  1. 在application.properties中配置数据库连接
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  1. 创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
    @TableId(value = "id")
    private Long id;
    @TableField("name")
    private String name;
    @TableField("age")
    private Integer age;
    @TableField("email")
    private String email;
}

@TableName是表名注解
@TableId是主键注解
@TableField是表中的字段注解

6.创建mapper接口

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

只需要继承BaseMapper接口,泛型T代表操作的对象类型

  1. 在启动类上添加@MapperScan(“mapper包路径”)扫描Mapper包下面的所有接口
  2. 测试类中测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserMapperTest {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelectList(){
        List<User> res = userMapper.selectList(null);
        for(User e :res){
            System.out.println(e);
        }
    }
}

测试结果:
测试结果

主键生成策略

插入数据查看生成的主键
测试:

    @Test
    public void testInsert(){
        //不设置id的值 mp使用默认的主键生成策略自动生成
        User user = new User();
        user.setName("lll");
        user.setAge(20);
        user.setEmail("fff@163.com");

        userMapper.insert(user);
        //查看生成的主键id user自动回填
        System.out.println(user);
    }

测试结果
测试结果
mybatis-plus默认的主键生成策略是ID_WORKER 全局唯一id
该策略使用了 雪花算法

mybatis-plus提供了五种主键生成策略

public enum IdType {
AUTO(0), // 自增
NONE(1), // 没有设置主键
INPUT(2), // 插入数据时必须手动设置id的值
ID_WORKER(3), // 全局唯一id
UUID(4), // 全局唯一id uuid
ID_WORKER_STR(5); //ID_WORKER 字符串表示
}

可以通过在@TableId注解中指定要想使用主键生成策略
设置主键生成策略
!注意
当使用@TableId(value = “id”,type = IdType.AUTO)策略时 数据库中字段一定要设置为自增!

自动填充

mybatis-plus还提供了自动填充功能,当对数据库表进行操作时会同时执行你想要的自动操作
例如:想要清楚知道表中数据的creatTime和updateTime 这两个字段都需要自动填充

实现步骤

  1. 首先在数据库中添加两个字段creat_time和update_time同时将实体类也更新加上这两个属性
  2. 配置自动填充策略
    配置自动填充策略
  3. 编写策略处理器
@Component //将处理器加到ioc容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
    //执行插入操作时的 处理策略
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("create_time",new Date(),metaObject);
        this.setFieldValByName("update_time",new Date(),metaObject);
    }

    //执行更新操作时的 处理策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("update_time",new Date(),metaObject);
    }
}
  1. 测试插入测试更新 查看create_time和update_time字段
    插入:
    @Test
    public void testInsertAu(){
        User user = new User();
        user.setName("aaa");
        user.setAge(21);
        user.setEmail("aaa@163.com");

        userMapper.insert(user);
        System.out.println(user);
    }

结果:
插入测试结果
create_time和update_time字段都自动填充了

更新:

    @Test
    public void testUpdateAu(){
        User user = new User();
        user.setId(1354740420564897794L);
        user.setName("AAAAA");

        userMapper.updateById(user);

        System.out.println(user.getUpdate_time());
    }

结果:
更新测试结果

乐观锁

向数据库表中加入了一个version字段
在执行查询的修改操作时 先得到version字段的值然后再使用version执行更新操作version的值也进行了更新
具体实现如下:

  1. 现在数据库表中添加一个version字段 初始值为1
  2. 将实体类中添加一个Integer类型的version属性,使用@Version注解开启乐观锁
    开启乐观锁
  3. 新建一个配置类,注册乐观锁插件
@EnableTransactionManagement
@MapperScan("org.xupt.mp.mapper")
@Configuration
public class MybatisPlusConfig {

    //注册mybatis-plus中的乐观锁插件
    @Bean
    public OptimisticLockerInterceptor myOptimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}
  1. 测试
    @Test
    public void testOptimisticLock(){
        //首先查询信息 获得version值
        User user = userMapper.selectById(1354740420564897794L);
        user.setName("qqq");
        System.out.println("更新操作前version的值:"+user.getVersion());
        //使用version的值进行更新操作 同时修改version的值
        userMapper.update(user,null);
        System.out.println("更新操作后version的值:"+user.getVersion());
    }

测试结果:
测试结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值