MyBatisPlus

208 阅读3分钟

入门

  • springboot是简化spring的
  • MyBatisPlus是简化mybatis的,增强工具

创建MyBatisPlus工程的步骤

  1. 创建springboot的项目 勾选mysql选项,然后在pom.xml中加入MyBatisPlus坐标
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>
  1. 在自己写的dao的类里继承BaseMapper<>,之后就完成了,连方法也不用写。

1656041652(1).png

简介

1656042307.png

标志CRUD开发

1656042403(1).png

小工具 lombok

1656051493(1).png 下面这一堆注解可以由lombok的@Data代替(不包含构造器的注解) 921be457a6f9842db57ccaa4e6f7a18.png

分页功能开发

首先要写一个MyBatisPlus针对分页的拦截器(bean) d98773244d54b47c78c0b42d711ae61.png 之后按照mp提供的方法调用即可 1656053176(1).png

开启mybatisplus日志(输出到控制台)

1656211881(1).png

DQL编程控制(按条件查询)

8cd8571f5904c1a9d45b34c3d198f86.png

  • lt代表小于 gt代表大于
  • **LambdaQueryWrapper<>:用labda的方式建立条件封装类 最常用 **
方式一:按条件查询
QueryWrapper qw = new QueryWrapper();
qw.lt("age",18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

方式三:lambda格式按条件查询   (最常用)
//相当于方式二的
//QueryWrapper<User> qw = new QueryWrapper<User>();
//qw.lambda().lt(User::getAge, 10);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();  
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

多条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
并且关系:10到30岁之间
lqw.lt(User::getAge, 30).gt(User::getAge, 10); //链式编程
或者关系:小于10岁或者大于30岁
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

条件查询null判定

用户很多情况下设置的查询条件时,不会都有填,比如填写下界后就不填上界了 采用带判定的条件查询即可 1656125387(1).png

查询投影(查看自己设定的字段)

1656126787(1).png

QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count, tel"); //统计
lqw.groupBy("tel");   //分组
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);

如果有些查询语句mybatisPlus不支持,则需要回到dao中自己写

条件查询

各种条件语句官网 baomidou.com/pages/10c80…

条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//等同于=
lqw.eq(User::getName,"Jerry").eq(User::getPassword,"jerry");
User loginUser = userDao.selectOne(lqw);
System.out.println(loginUser);

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
lqw.between(User::getAge,10,30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

模糊查询

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//模糊匹配 like
lqw.like(User::getName,"J");       ===> J%
lqw.likeRight(User::getName,"J");  ===> J%
lqw.likeLeft(User::getName,"J");   ===%J
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

映射匹配兼容性

字段映射与表名映射

  • 问题一 1656136555(1).png 使用mp提供的属性注解解决 1451d20e99711f247bb0b5c248f39f0.png

1656136718(1).png

  • 问题二

1656136819(1).png 使用mp属性注解 @TableField

1656136934(1).png

1656136953(1).png

  • 问题三

1656137417(1).png 设定属性注解

1656137489(1).png

  • 问题4

1656138504(1).png

1656138706(1).png

DML编程

新增

id生成策略(不同类型的表,需要不同的id生成形式)

1656140158(1).png

1656140437(1).png

1656140518(1).png

1656141221(1).png 每次建立实体都需要自定id生成策略? 太麻烦了

1656141345(1).png 还可以使用配置文件全局的配置@TableName("tbl_user")

1656141485(1).png

多数据删除

1656142901(1).png

逻辑删除(不进行真正的删除)

当删除一个数据后会有他的关联数据,会损失数据 1656143015(1).png

  • 解决方法:增加逻辑删除字段

1656143902(1).png image.png 运行删除方法发现实际执行的是update语句

1656143980(1).png 查全局表时,发现其实是条件查询 1656144119(1).png 每个表都要配置太麻烦了 所以要进行全局配置

1656144320(1).png

修改操作 (乐观锁)

乐观锁 解决业务带来的并发问题

实质

update set abc=1,version=version+1 where version=1

步骤

369fadabec4c7c3e63764c08b44f996.png

fb57ab1c718c886b92142b01150696d.png

b90b15f0ed9ee7f64cd8eba7a2ea292.png

379f9ab40f708e4afec65aacf393be8.png

代码生成器

模板

1656214001(1).png

1656214097(1).png

  • 导入坐标 1656222602(1).png
  • 运行此代码后生成文件
public class CodeGenerator {
    public static void main(String[] args) {
        //1.获取代码生成器的对象
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java");    //设置代码生成位置
        globalConfig.setOpen(false);    //设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("黑马程序员");    //设置作者
        globalConfig.setFileOverride(true);     //设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sDao");    //设置数据层接口名,%s为占位符,指代模块名称
        globalConfig.setIdType(IdType.ASSIGN_ID);   //设置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.aaa");   //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageInfo.setEntity("domain");    //设置实体类包名
        packageInfo.setMapper("dao");   //设置数据层包名
        autoGenerator.setPackageInfo(packageInfo);

        //策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tbl_user");  //设置当前参与生成的表名,参数为可变参数
        strategyConfig.setTablePrefix("tbl_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
        autoGenerator.setStrategy(strategyConfig);
        //2.执行生成操作
        autoGenerator.execute();
    }
}

1656224373(1).png