(一)MybatisPlus简介
1.为什么要学习MybatisPlus?
学习MyBatis-Plus之前要先学MyBatis–>Spring—>SpringMVC
MyBatisPlus可以节省我们大量的时间,所有CRUD代码都可以自动完成
JPA, tk-mapper ,MyBatisPlus
偷懒用的!
2.介绍MybatisPlus
3.MybatisPlus特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
(二)、Mybatis使用
1.MybatisPlus快速入门💲
地址: 快速入门网址
使用第三方插件:
- 导入对应的依赖
- 研究依赖如何配置
- 代码如何编写
- 提高扩展技术能力
步骤
- 创建数据库 mybatis_plus
- 创建数据库
创建表
CREATE DATABASE mybatis_plus; USE mybatis_plus; 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) );
真实开发中一个表中要存在以下这四个字段。version(乐观锁)、deleted(逻辑删除)、gmt_create、gmt_modfied.
- 插入数据
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');
- 编写项目,初始化项目! 使用SpringBoot初始化!
- 导入依赖
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </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>
说明:我们使用mybatis-plus 可以节省我们大量的代码,尽量不要同时导入mybatis和mybatis-plus因为版本有差异!
- 连接数据库!这一步和mybatis相同!
# 配置数据源 spring: datasource: name: root password: 121788 url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver
6.传统的方式pojo-dao(连接mybatis,配置mapper.xml文件)-service-controller
- 使用mybatis_plus之后,不需要mapper.xml和yaml配置
编写pojo实体类
package com.jsxs.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class user { // bigint->Long private Long id; private String name; // int->Integer private Integer age; private String email; }
编写userMapper.java接口层
如果我们这里在mapper层添加了@mapper的注解,那么我们就不用在主类下面编写@MapperScan("com.jsxs.mapper")。这里的实现的方法是我们继承的BaseMapper类中的方法。并且要填写需要被CRUD类的泛型。
package com.jsxs.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.jsxs.pojo.user; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; // 当我们使用了Mybatis_plus之后,在对应的Mapper上面继承基本的类 BaseMapper @Repository @Mapper //如果我们在这里添加了@Mapper这个注解,那么我们就不用在主类下面写:@MapperScan("com.jsxs.mapper") public interface userMapper extends BaseMapper<user> { // mapper层选择我们要使用的方法 void selectList(); // 所有的CRUD操作都已经编写完成了 // 我们不需要像以前一样配置一大堆文件了。 }
测试:
这里又语法糖的语句
package com.jsxs; import com.jsxs.mapper.userMapper; import com.jsxs.pojo.user; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; import java.util.List; @SpringBootTest class MybatisPlusApplicationTests { @Resource userMapper userMapper; @Test void contextLoads() { // 参数: 参数是一个wrapper,条件构造器。我们不添加条件就是查询全部信息 List<user> users = userMapper.selectList(null); // 语法堂便利信息 users.forEach(System.out::println); } }
思考问题
- sql谁帮我们写的?—mybatis-plus
- 方法谁帮我们写的?—mybatis-pluss
2.配置日志输出
我们所有的sql是不可见的,我们希望知道他是怎么执行的,所以我们必须看日志!
application.xml
# 配置日志 (默认控制台输出) mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置完日志之后你会喜欢上mybatis-plus!
(三)、CRUD扩展
1.插入数据💲
实体类
package com.jsxs.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class user { // bigint->Long private Long id; private String name; // int->Integer private Integer age; private String email; }
测试类
// 测试插入 @Test public void testInsert(){ user user = new user(); user.setName("吉士先生"); user.setAge(21); user.setEmail("979748385@qq.com"); int insert = userMapper.insert(user); System.out.println(insert); }
注意点:数据库插入的id默认值为:全局的唯一id
2.主键生成策略(MybatisPlus默认_雪花算法)
默认的全局ID -> Mybatis_plus @TableId(type = IdType.ID_WORKER)
对应数据库中的主键(uuid.自增id.雪花算法.redis.zookeeper)
分布式系统唯一id生成:https://www.cnblogs.com/haoxinyue/p/5208136.html
雪花算法😦Twitter的snowflake算法)
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0.可以保证几乎全球唯一
3.其他主键策略
主键自增
我们如果要配置主键自增:
- 实体类字段上
@TableId(type = IdType.AUTO)
- 数据库字段一定要是自增!
- 在数据库对应的实体类主键上添加一个注解
package com.jsxs.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class user { // bigint->Long @TableId(type = IdType.AUTO) //设置成自增 private Long id; private String name; // int->Integer private Integer age; private String email; }