光速入门MyBatis-Plus

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了光速入门MyBatis-Plus相关的知识,希望对你有一定的参考价值。

光速入门MyBatis-Plus

0.特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 mysql、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

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');
    
  • 导入依赖包

    <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.2</version>
            </dependency>
    
    
    
  • 配置数据源(在application.properties)

# DataSource Config
spring.datasource.username=root
spring.datasource.password=xxxxxxx
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 配置打印日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  • 写一个Pojo实体类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
  • 写对应的Mapper

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

    @Autowired
        private UserMapper userMapper;
        @Test
        void contextLoads() {
            System.out.println(("----- selectAll method test ------"));
            List<User> users = userMapper.selectList(null);
            users.forEach(System.out::println);
    
        }
    
  • 运行结果

在这里插入图片描述

2.注解

1.主键策略@TableId

在这里插入图片描述

2.@TableField 非主键字段注解


	@​TableField("myName")
	private String myName;		

可用于解决字段名包含大写字母问题,这样使用注解就不会有问题。

3.CRUD

//insert
User user = new User();
        user.setName("Herio");
        user.setAge(18);
        user.setEmail("1479898695@qq.com");

        int result = userMapper.insert(user);

//update
User user = new User();
        user.setId(6L);
        user.setAge(50);
        int i = userMapper.updateById(user);
        System.out.println(i);

4.自动填充功能

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("插入时间完毕");
        this.strictInsertFill(metaObject,"start_time", Date.class,new Date());
        this.strictInsertFill(metaObject,"update_time", Date.class,new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject,"update_time",Date.class,new Date());
    }
}


//对应的POJO 类的属性

	@TableField(fill= FieldFill.INSERT)
    private Date start_time;
    @TableField(fill= FieldFill.INSERT_UPDATE)
    private Date update_time;

5.乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
  • 写元对象处理配置类

    @Slf4j
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("插入时间完毕");
            this.strictInsertFill(metaObject,"start_time", Date.class,new Date());
            this.strictInsertFill(metaObject,"update_time", Date.class,new Date());
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            this.strictUpdateFill(metaObject,"update_time",Date.class,new Date());
        }
    }
    
    //对应的pojo的属性添加version
     @Version
        private Integer version;
    
    
    // 测试
        void test3(){
            User user= userMapper.selectById(1L);
            user.setAge(50);
            user.setName("小张");
    
            //模拟插队线程
            User user1= userMapper.selectById(1L);
            user1.setName("xxxxxx");
            user1.setAge(100);
            userMapper.updateById(user1);
    
            //没有乐观锁会覆盖掉插队线程
            userMapper.updateById(user);
        }
    

在这里插入图片描述

以上是关于光速入门MyBatis-Plus的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib光速入门-从安装到常用实战

Matplotlib光速入门-从安装到绘图实战

10分钟带你光速入门运维工具之-Puppet

10分钟带你光速入门运维工具之-Puppet

一SpringBoot 整合 Dubbo 光速入门

Mybatis-Plus入门学习笔记