Mybatis-Plus总结
mybatis-plus
-
mybatis-plus主键id生成使用的是雪花算法所以会比较长,使用bigint类型(在实体中是long类型)
-
MySQL驱动8就用:driver-class-name: com.mysql.cj.jdbc.Driver
-
MySQL驱动8需要加时区连接地址URL
-
MySQL驱动5就用:driver-class-name: com.mysql.jdbc.Driver
-
yml文件用#注释
-
wrapper就是mybatisplus的条件构造器
-
alt+enter生成对象(idea)
mybatis-plus控制台打印sql语句,在yml配置文件
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
一、常用注解
@TableId:将这个属性对应的字段作为主键,数据库一般把id作为主键
假如实体主键是id但是数据库主键id是uid,那么用注解加上value即可 @TableId("uid")
type属性:主键生成策略,@TableId(value = "uid", type = IdType.AUTO),默认是雪花算法
@TableName("user"):设置实体类所对应的表名,如果不加就用实体类决定
@TableField("user_name"):指定属性所对应的字段名
@TableLogic:逻辑删除,加了之后只会查出逻辑删除为0未删除得数据
@Repository在mapper上加上表明是持久层组件,在其他地方注入使用便不会报错
@EnumValue //将注解所标识的属性的值存储到数据库中
@DS("master") //在serviceimpl,指定数据源
@Service //在serviceimpl,表明是service组件
二、wapper构造器
三、baseMapper方法的增删改查
1. 查询操作
// 根据 ID 查询:
T selectById(Serializable id);
// 根据 entity 条件,查询一条记录:
T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);
// 查询(根据ID 批量查询):
List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 entity 条件,查询全部记录:
List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
// 查询(根据 columnMap 条件):
List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录:
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值:
List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);
// 根据 entity 条件,查询全部记录(并翻页):
IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页):
IPage<Map<String, Object>> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
// 根据 Wrapper 条件,查询总记录数:
Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);
// #参数类型说明:
Serializable: 主键ID
Wrapper :实体对象封装操作类(可以为 null)
Collection<? extends Serializable>:主键ID列表(不能为 null 以及 empty)
Map<String, Object>: 表字段 map 对象
IPage:分页查询条件(可以为 RowBounds.DEFAULT)
2. 插入操作:
插入一条记录: int insert(T entity);
插入类型T:实体对象
主键生成策略:
数据库插入的id为全局默认的id(ID_WORKER),我们需要配置主键自增,在实体类字段上添加注解: @TableId(type =IdType.AUTO),数据库字段一定要是自增的。
雪花算法:
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
3. 更新操作
// 根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
// #参数说明
类型 参数名 描述
T entity 实体对象 (set 条件值,可为 null)
Wrapper updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
乐观锁:顾名思义十分乐观,它总是被认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新测试。加上版本号version字段,更新数据次版本号就变,版本号不一致操作会不成功
悲观锁:顾名思义十分悲观,它总是出现问题,无论干什么都会上锁!再去操作!就是两个人同时操作一个数据,其中一个被锁死不能动在阻塞中,等到另外一个完成操作后,才可以操作
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时,set version=newVersion where version =oldVersion
如果version不对,就更新失败
4. 删除操作
物理删除 :从数据库中直接移出
逻辑删除:方便数据恢复和保护数据本身价值的一种方案,在数据库中没有被移出,而是通过一个变量来让他失效!deleted=0 ==>deleted =1(失效)
// 根据 entity 条件,删除记录:
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
// 删除(根据ID 批量删除):
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除:
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录:
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 参数类型说明:
Wrapper:实体对象封装操作类(可以为 null)
Collection<? extends Serializable>: 主键ID列表(不能为 null 以及 empty)
Serializable:主键ID
Map<String, Object>: 表字段 map 对象
四、mybatisX插件
- 代码生成
- mybatisX,alt+enter自动补全
五、代码自动生成器【待验证,未亲身实践过是否能正常生成代码】
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
基本使用:
新建一个springboot工程:
在pom.xml中添加相关依赖【以下依赖需要以正确格式加入】:
com.baomidou
mybatis-plus-generator
3.3.1
org.apache.velocity
velocity-engine-core
2.3
编写yml文件,直接使用之前的即可:
spring:
// #配置数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
// #设置开发环境
profiles:
active: dev
// #配置日志,我们所用的sql现在是不可见的,我们希望知道他是怎么执行的,所以我们必须要查看日志!【在控制台打印出运行的SQL语句】
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
// #全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-field: flag
// #逻辑已删除值(默认为 1)
logic-delete-value: 1
// #逻辑未删除值(默认为 0)
logic-not-delete-value: 0
server:
port: 8010
编写代码生成器:
编写代码生成器【点击查看代码】
/**
@Author: xxx
@Date: yyyy-MM-DD HH:MM:SS
*/
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
// 代码自动生成器
public class MyBatisPlusGenerator {
public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
//获取当前项目路径
String projectPath = System.getProperty(“user.dir”);
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor(“龙源lll”);
gc.setOpen(false);
gc.setFileOverride(false); // 是否覆盖
gc.setServiceName("%sService"); // 去Service的I前缀
gc.setIdType(IdType.AUTO);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
//2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(“jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8”);
dsc.setDriverName(“com.mysql.cj.jdbc.Driver”);
dsc.setUsername(“root”);
dsc.setPassword(“520992”);
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);