首页 > 其他分享 >MyBatisPlus学习笔记

MyBatisPlus学习笔记

时间:2023-04-19 20:26:11浏览次数:48  
标签:MyBatisPlus System 笔记 学习 products println new id out

MyBatisPlus

一、MyBatisPlus简介

MyBatisPlus ( 简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率。

  1. 创建入门案例
  • 创建新模块,选择Spring Initailizer,并配置模块相关基础信息
  • 勾选MySQL Driver
  • 手动添加mp起步依赖(由于mp并未被收录到idea的系统内置配置,无法直接选择加入)
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>
  • 设置jdbc参数(application.yml)
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/springboot_demo
    username: root
    password: root
  • 定义数据接口,继承BaseMapper
@Mapper
public interface ProductsDao extends BaseMapper<Products> {
}
  • 测试类注入dao接口,测试功能
@SpringBootTest
class MybatisplusApplicationTests {

    @Autowired
    private ProductsDao productsDao;

    @Test
    void testGetAll() {
        List<Products> products = productsDao.selectList(null);
        System.out.println(products);
    }
}

二、标准数据层开发

  1. 标准数据层CRUD功能

image-20230419143222659

  1. lombok

一个Java类库,提供了一组注解,简化POJO实体类开发;常用注解@Data

<dependency>
    <groupId>org.project1ombok</groupId>
    <artifactId>1ombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>
  1. 分页查询
  • 设置分页拦截器作为Spring管理的bean
package com.shine.config;

@Configuration
public class MpConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1.定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.添加具体拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}
  • 执行分页查询
@Test
void testPage() {
    IPage page = new Page(1 ,2);
    productsDao.selectPage(page, null);
    System.out.println("当前页码值"+ page.getCurrent());
    System.out.println("每页显示数"+ page.getSize());
    System.out.println("一共多少页"+ page.getPages());
    System.out.println("一共多少条数据"+ page.getTotal());
    System.out.println("数据"+ page.getRecords());
}
  • 开启日志(查看sql语句,主要作调试时用)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

三、DQL编程控制

  1. 条件查询

MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

  • 常规格式
//方式1:按条件查询
QueryWrapper qw = new QueryWrapper();
qw.lt("price", 1000);
List<Products> products = productsDao.selectList(qw);
System.out.println(products);
  • lambda格式(推荐)
//方式2:lambda格式按条件查询
QueryWrapper<Products> qw = new QueryWrapper<Products>();
qw.lambda().gt(Products::getPrice, 1000);
List<Products> products = productsDao.selectList(qw);
System.out.println(products);

//方式3:lambda格式按条件查询
LambdaQueryWrapper<Products> lqw = new LambdaQueryWrapper<Products>();
lqw.eq(Products::getCategory_id, "c001");
List<Products> products = productsDao.selectList(lqw);
System.out.println(products);
  1. 查询投影
  • 查询结果包含模型类中部分属性
LambdaQueryWrapper<Products> lqw = new LambdaQueryWrapper<Products>();
lqw.select(Products::getPname, Products::getPrice, Products::getCategory_id);
List<Products> products = productsDao.selectList(lqw);
System.out.println(products);
  • 查询结果包含模型类中未定义的属性
QueryWrapper qw = new QueryWrapper();
qw.select("count(*) as count");
qw.groupBy("category_id");
List<Map<String, Object>> products = productsDao.selectMaps(qw);
System.out.println(products);
  1. 字段映射和表名映射
  • 问题1:表字段和编码属性设计不同步

  • 问题2:编码中添加了数据库中未定义的属性

  • 问题3:采用默认查询开放了更多的字段查看权限

  • 问题4:表名与编码开发设计不同步

image-20230419163124011

四、DML编程控制

  1. id生成策略控制
  • 不同的表 应用不同的id生成策略

    • 日志:自增(1,2,3,4, ...)
    • 购物订单:特殊规则 (FQ23948AK3843)
    • 外卖单:关联地区日期等信息(10 04 20200314 34 91)
    • 关系表:可省略id
    • ……
  • 生成策略

    • AUTO(0):使用数据库id自增策略控制id生成
    • NONE(1):不设置id生成策略
    • INPUT(2):用户手工输入id
    • ASSIGN_ ID(3):雪花算法生成id (可兼容数值型与字符串型)
    • ASSIGN_ UUID(4):以UUID生成算法作为id生成策略

    @TableId(type = IdType.ASSIGN_ID)

  • 全局配置

mybatis-plus:
  global-config:
    db-config:
      id-type: auto
      table-prefix: tbl_
  1. 逻辑删除

删除操作业务问题:业务数据从数据库中丢弃
逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中

  • 数据库表中添加逻辑删除标记字段
  • 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段 @TableLogic
  1. 乐观锁

业务并发现象带来的问题:秒杀(比如大量用户同时抢购某种商品)

  • 数据库表中添加锁标记字段
  • 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段 @version
  • 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mpInterceptor;
    }
}
  • 使用乐观锁机制在修改前必须先获取到对应数据的version方可正常进行(先查询一次)

五、快速开发

利用代码生成器

  1. 添加依赖
<!--代码生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>

<!--velocity模板引擎-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>
  1. 核心代码
//1.获取代码生成器的对象
AutoGenerator autoGenerator = new AutoGenerator();
......
autoGenerator.execute();
  1. 设置数据库相关配置
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springboot_demo");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
  1. 设置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
globalConfig.setOpen(false);
globalConfig.setAuthor("Shine");
globalConfig.setFileOverride(true);
globalConfig.setMapperName("%sDao");
autoGenerator.setGlobalConfig(globalConfig);
  1. 设置包名相关配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.shine");
packageConfig.setEntity("domain");
packageConfig.setMapper("dao");
autoGenerator.setPackageInfo(packageConfig);
  1. 策略设置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setRestControllerStyle(true);
//strategyConfig.setInclude("products", "book");//设置当前生成的表名,为可变参数
//strategyConfig.setTablePrefix("tbl_"); //设置数据库表的前缀名称,模块名=数据库名-前缀名
//strategyConfig.setVersionFieldName("version");//设置乐观锁字段名
//strategyConfig.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名
strategyConfig.setEntityLombokModel(true);//设置是否启用lombok
autoGenerator.setStrategy(strategyConfig);

标签:MyBatisPlus,System,笔记,学习,products,println,new,id,out
From: https://www.cnblogs.com/Shine-Gan/p/17334412.html

相关文章

  • 再次学习malloc()
    在力扣做题,发现给的函数是char**fizzBuzz(intn,int*returnSize)这种类型的,也就是返回的是一个二级指针题目给你一个整数n,找出从1到n各个整数的FizzBuzz表示,并用字符串数组answer(下标从1开始)返回结果,其中:answer[i]=="FizzBuzz"如果i同时是3和5的倍......
  • Ubuntu搭建SFTP服务器笔记
    说明:server01为sftp服务端;client01为客户端【在server01上操作】1、强力卸载openssh-serverapt-getremove--purgeopenssh-server2、安装openssh-server1)更新apt-get源apt-getupdate2)安装openssh-serverapt-getinstallopenssh-server【在client01上操作】3、使用......
  • PyTorch实现联邦学习堆叠自编码器
    联邦学习是一种用于训练分布在不同设备或地点的模型的技术,其中数据分布在不同的设备上,且不会离开设备。每个设备只训练其本地数据的模型,并将更新的模型参数传递给服务器,服务器对这些更新进行聚合以更新全局模型。由于不共享原始数据,因此联邦学习能够提供更好的数据隐私和安全性......
  • 数据结构与算法学习01
    学习要点一、预习页码:2-27二、预习内容1、数据结构基本定义:数据、数据元素、数据项、数据对象,重点理解数据结构的定义。2、理解逻辑结构。集合、线性结构、树形结构、图形结构。数学描述方法。3、理解存储结构。顺序存储结构、链式存储结构、索引存储结构和哈希存储结构。4......
  • 数据结构与算法学习02
    学习要点一、复习内容重点及难点:算法的时间复杂度分析。过程:(1)找寻循环中的最内层语句(2)分析该语句的执行次数。二、预习内容1、预习页码:21-22,30,32-422、具体预习内容(1)算法的平均时间复杂度分析。不能用最好和最坏的极端情况分析算法,应该用等概率的平均时间复杂度来进行分析......
  • 数据结构与算法学习04
    学习要点1、预习页码:47-542、预习内容:(1)单链表建立的头插法和尾插法。(重点)两种方法的不同级效果。(2)线性表的基本运算在单链表中的实现。(9个算法)重点掌握在9个算法中,如何计算单链表的长度(采用循环计数的方式),单链表越界的描述,单链表中节点的查找,单链表节点的插入和删除操作。(重点......
  • 数据结构与算法学习03
    学习要点一、预习页码:38-51二、预习内容1、顺序表应用实例——P38---例题2.3+例题2.4,练习题P71---6。2、线性表的实现——单链表(必须掌握),构造过程,见P43-图2.113、单链表的定义,见P44--最后四行4、熟练掌握单链表的插入删除操作。(重点掌握)——图2.14+图2.155、(重点掌握)单链表......
  • 数据结构与算法学习06
    学习要点一、预习页码:57-60、79-83二、预习内容1、理解双链表和单链表的区别,能熟练运用单链表算法改进并适用双链表。例如双链表插入和删除操作,双链表逆置操作(教材P57--例题2.9),双链表排序操作(教材P57--例题2.10),和教材P53--例2.8比较。2、循环链表(包含循环单链表和循环双链表)的......
  • 数据结构与算法学习05
    学习要点一、复习内容:单链表头插法和尾插法及核心代码,能运用头插法和尾插法完成基于单链表建表的算法应用问题。二、预习页码:52-60三、预习内容1、基于单链表查询的算法的设计过程。阅读代码P52--例2.7+2.8,能熟练掌握单链表的查找算法。2、双链表的基本构造(包括基本概念+画图......
  • docker学习
    镜像(image)镜像可以理解为一个模板,里边有一些东西,可以通过run命令来进行运行。通过某一个镜像可以创建多个容器(最终的服务或者是项目就是运行在容器里边的) 容器(container)Docker利用容器技术可以独立运行一个或者一组应用。可以通过镜像运行启动、停止、删除的基本命令目前可......