MyBatisPlus基础入门笔记

news2024/11/14 2:01:32

MyBatisPlus基础入门笔记,源码可见下载链接
大家阅读时可善用目录功能,可以提高大家的阅读效率
下载地址:MyBatisPlus源码+笔记


初识MyBatisPlus

入门案例

SpringBoot整合MyBatis(复习)

  1. 创建SpringBoot工程
  2. 勾选使用的到的技术
  3. 设置dataSource相关属性(JDBC参数)
  4. 定义数据层接口映射配置

SpringBoot整合MyBatisPlus(简称mp)

  1. 创建新模块,选择Spring初始化,并配置模块相关基础信息(SQL中只需要勾选MySQL Driver)
  2. 手动添加mp起步依赖
  3. 设置jdbc参数
  4. 制作实体类和表结构
  5. 定义数据接口,继承BaseMapper<>
  • pom.xml
    • 由于MyBaits的起步依赖中mybatis-spring的版本过低,所以在SpringBoot3.X的版本上无法运行
    • 所以需要再配置一个高版本的mybatis-spring来解决maven的依赖传递问题
<dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.4</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.20</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>3.0.3</version>
        </dependency>
    </dependencies>
  • UserDao
@Mapper
public interface UserDao extends BaseMapper<ABC> { }
  • domain/ABC
    • 如果表名和实体类名不一样,可以加上@TableName(“对应表名”)的注解
@TableName("user")
public class ABC {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
    //......
    //略去getter setter方法以及toString方法
}
  • application.yml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus_db
    username: root
    password: 123456
  • 测试类
@SpringBootTest
class MyBatisPlusApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void testGetAll() {
        List<ABC> Users = userDao.selectList(null);
        System.out.println(Users);
    }
}

MyBatisPlus概述

  • MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发,提高效率
  • 国内组织开发的技术

在这里插入图片描述


标准数据层开发

mp提供的接口

在这里插入图片描述

Lombok

  • lombok,一个Java类库,提供了一组注解,简化POJO实体类的开发

  • 常用@Data:注解在类上,提供get、set、equals、hashCode、canEqual、toString、无参构造方法,没有有参构造

  • pom.xml

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <scope>provided</scope>
</dependency>
  • 实体类
@Data
//如果表名和实体类名不一样,可以加上@TableName("对应表名")的注解
@TableName("user")
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}

MP分页查询功能

  1. 设置分页拦截器作为Spring管理的bean
  2. 执行分页查询
  3. 开启日志(可选)
  • config/Mpconfig
@Configuration
public class Mpconfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1.定义mp拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2.在mp拦截器中添加具体拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
  • 测试类
@SpringBootTest
class MyBatisPlusApplicationTests {

  @Autowired
  private UserDao userDao;
  @Test
  void testGetByPage(){
    IPage page = new Page(1,5);
    userDao.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());
  }
}
  • application.yml —— 开启日志(可选)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

DQL编程控制

条件查询

四种常见查询方式

  • lambda的格式,也就是方法引用,有点类似匿名函数
    • User::getId 也就是 (User) -> user.getId()
    • 作用等同于 new User().getId()
@SpringBootTest
class MyBatisPlusApplicationTests {

  @Autowired
  private UserDao userDao;
  @Test
  void testGetAll() {
    //方式一:按条件查询 
//        QueryWrapper qw = new QueryWrapper<>();
//        qw.lt("age",300);
//        List<User> Users = userDao.selectList(qw);
//        System.out.println(Users);

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


    //方式三:lambda格式按条件查询(推荐)
//        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
//        qw.lt(User::getAge,200);
//        List<User> Users = userDao.selectList(qw);
//        System.out.println(Users);

    //方式四: lambda格式按条件查询(推荐)
    LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
//        qw.lt(User::getAge,600).gt(User::getAge,300); //可以链式编程
    qw.gt(User::getAge, 600).or().lt(User::getAge, 100); //可以链式编程
    List<User> Users = userDao.selectList(qw);
    System.out.println(Users);
  }
}

空值处理

  • 条件参数控制
@SpringBootTest
class MyBatisPlusApplicationTests {

  @Autowired
  private UserDao userDao;

  @Test
  void testGetAll() {
      UserQuery uq = new UserQuery();
//        uq.setAge(100);
//        uq.setAge2(300);
    //null判定,先判断条件是否为true
    LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
    qw.gt(null != uq.getAge(), User::getAge, uq.getAge());
    qw.lt(null != uq.getAge2(), User::getAge, uq.getAge2());
    List<User> Users = userDao.selectList(qw);
    System.out.println(Users);
  }
}

查询投影

  • 查询包含模型类中部分属性
  • 查询结果包含模型类中未定义的属性
// 包含模型类中部分属性,不是所有的聚合函数都支持
@SpringBootTest
class MyBatisPlusApplicationTests {
    
  @Autowired
  private UserDao userDao;

  @Test
  void testGetAll() {
    QueryWrapper<User>  qw = new QueryWrapper<>();
    qw.select("count(*) count");
    List<Map<String, Object>> Users = userDao.selectMaps(qw);
    System.out.println(Users);
  }
}
// 包含模型类中中未定义的属性
@SpringBootTest
class MyBatisPlusApplicationTests {
    
  @Autowired
  private UserDao userDao;

  @Test
  void testGetAll() {
    QueryWrapper<User>  qw = new QueryWrapper<>();
    qw.select("count(*) count,age");
    qw.groupBy("age");
    List<Map<String, Object>> Users = userDao.selectMaps(qw);
    System.out.println(Users);
  }
}

查询条件

  • eq(字段,“值”) 等值匹配
  • le ge between 闭区间匹配[]
  • like 模糊匹配
  • … 更多可去官方文档查询

字段映射与表名映射

问题一: 表字段与编码属性设计不同步

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

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

  • @TableField
    • 类型: 属性注解
    • 位置: 模型类属性定义上方
    • 作用: 设置当前属性对应的数据库表中的字段关系
    • 属性:
      • value —— 设置数据库的字段名称
      • exist —— 设置属性在数据库表中字段是否存在,默认为true。此属性无法与value合并使用
      • select —— 设置属性是否参与查询,此属性与select映射不冲突
  • @TableName
    • 类型: 类注释
    • 位置: 模型类定义上方
    • 作用: 设置当前类对应于数据库标关系
    • 属性:
      • value —— 表名称
@TableName("user")
public class User {
  private Long id;
  private String name;
  @TableField(value = "password",select = false)
  private String pwd;
  private Integer age;
  private String tel;
  @TableField(exist = false)
  private Integer online;
}

DML编程控制

基础增删语句

@SpringBootTest
class MyBatisPlusApplicationTests {

  @Autowired
  private UserDao userDao;

  @Test
  void add() {
    User user = new User();
    user.setName("LonelySnow");
    user.setPwd("LonelySnow");
    user.setAge(123);
    user.setTel("LonelySnow");
    userDao.insert(user);
  }

  @Test
  void delete() {
    LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
    qw.eq(User::getName, "lonelysnow");
    userDao.delete(qw);
  }
}

id生成策略控制

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

雪花算法 —— 生成一个64位的二进制数(必须用long型装)

  • 占位符(第一位):0
  • 时间戳(41位)
  • 机器码(5+5位)
  • 序列号(12位)

配置文件统一添加

mybatis-plus:
  global-config:
    db-config:
      #id策略
      id-type: assign_id
      #所有实体类名前拼接前缀,相当于@TableName
      table-prefix: tbl_

逻辑删除

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

逻辑删除步骤

  1. 数据库表中添加逻辑删除标记字段
  2. 实体类中添加对应的字段,并设置当前字段为逻辑删除字段
  3. 配置逻辑删除字面值
//单独设置
@TableName("user")
public class User {
//    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    @TableField(value = "password",select = false)
    private String pwd;
    private Integer age;
    private String tel;
    @TableLogic(value = "0",delval = "1")
    private Integer deleted;
}
//配置通用配置
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-not-delete-value: 0
      logic-delete-value: 1

乐观锁

  • 业务并发现象带来的问题: 秒杀

乐观锁添加步骤

  1. 数据库表中添加锁标记字段
  2. 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
  3. 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration
public class Mpconfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1.定义mp拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2.在mp拦截器中添加具体拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //添加乐观锁拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
@SpringBootTest
class MyBatisPlusApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void update(){
        //1. 修改前先查询要修改的数据
        User user = userDao.selectById(2L);
        //2.将想要修改的属性值传进去
        user.setName("snow");
        userDao.updateById(user);  
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1311418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式——适配器模式(结构型)

引言 适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。 问题 假如你正在开发一款股票市场监测程序&#xff0c; 它会从不同来源下载 XML 格式的股票数据&#xff0c; 然后向用户呈现出美观的图表。 在开发过程中&#xff0c; 你决定在程序…

使用qt实现四则运算计算机项目

这是我们要包含的头文件 #include <QWidget> #include<QStack> #include<string.h> #include<string> 这是我在ui界面创建的计算机基础框架。 接下来要实现按住每个按钮在白框内显示&#xff1b; 因此我们要定义一个QString 类型的变量 QString e…

nginx服务前端访问查看无响应的问题

问题 nginx 启动之后&#xff0c;前端访问无数据&#xff0c;F12 查看&#xff0c;提示挂起。 以为是配置问题&#xff0c;查看配置文件&#xff0c;未发现配置的有问题。 原因 通过查看配置文件&#xff0c;发现转发的服务地址为127.0.0.1&#xff0c;手动ping 127.0.0.1&a…

AI人工智能与云原生:创新科技的完美结合

人工智能&#xff08;AI&#xff09;是当今科技领域的热门话题&#xff0c;而云原生则是一种新兴的软件开发和部署模式。AI人工智能与云原生的结合&#xff0c;为现代技术创新提供了无限的可能性。本文将探讨AI与云原生的关系&#xff0c;并介绍其如何在实际应用中实现协同效应…

谷歌宣布向云计算客户开放 Gemini Pro,开发者可用其构建应用

12 月 14 日消息&#xff0c;美国时间周三&#xff0c;谷歌宣布了一系列升级的人工智能&#xff08;AI&#xff09;功能&#xff0c;旨在为其云计算客户提供更好的服务。这家科技巨头正试图赶上竞争对手&#xff0c;比如微软和 OpenAI&#xff0c;它们都在积极利用人工智能的热…

docker安装最新版SQL Server并还原备份的数据库

docker安装数据库 拉取微软官方最新版镜像 docker pull mcr.microsoft.com/mssql/server 拉去镜像并创建容器 docker run -e "ACCEPT_EULAY" -e "SA_PASSWORDsa_password_123456" -p 1433:1433 -v /opt/:/opt --name sqlserver -d mcr.microsoft.com/ms…

〖大前端 - 基础入门三大核心之JS篇(54)〗- 原型和原型链

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

LOF基金跟股票一样吗?

LOF基金&#xff0c;全称为"上市型开放式基金"&#xff0c;是一种可以在上海证券交易所认购、申购、赎回及交易的开放式证券投资基金。投资者可以通过上海证券交易所场内证券经营机构或场外基金销售机构进行认购、申购和赎回基金份额。 LOF基金的特点是既可以像股票…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

微服务 Nacos服务注册与发现

一、Nacos 功能介绍 在微服务架构下&#xff0c;一个业务服务会被拆分成多个微服务&#xff0c;各个服务之间相互通信完成整体的功能。另外&#xff0c;为了避免单点故障&#xff0c;微服务都会采取集群方式的高可用部署&#xff0c;集群规模越大&#xff0c;性能也会越高&…

linux磁盘空间清理

查看磁盘使用情况 查看磁盘分区上可以使用的磁盘空间 $ df -h若要查看文件类型和block&#xff0c;使用下面的命令 $ df -T查看每个文件和目录的磁盘使用空间&#xff0c;也就是文件的大小。 $ sudo du -sh /* $ sudo du -h --max-depth1 /清理旧的 Snap 包版本以释放磁盘空…

智能优化算法应用:基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于乌燕鸥算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.乌燕鸥算法4.实验参数设定5.算法结果6.参考文…

Yum仓库架构解析与搭建实践

1.Yum仓库搭建 1.1本地Yum仓库图解 1.2Linux本地仓库搭建 配置本地光盘镜像仓库 1&#xff09;挂载 [roothadoop101 ~]# mount -t iso996 /dev/cdrom/mnt 2&#xff09;查看 [rooothadoop101 ~] # df -h | |grep -i mnt /dev/sr0 4.6G 4.4G 3&#xf…

机器视觉【1】相机的成像(畸变)模型

零、前言 很久没写文章&#xff0c;简单唠一唠。 不知道巧合还是蜀道同归&#xff0c;部门领导设定了些研究课题&#xff0c;用于公司部门员工的超前发展&#xff0c;该课题是“2D to 3D的三维重建”&#xff0c;这一块刚好是我个人看中的一个大方向&#xff0c;所以就有了这…

使用Docker本地安装部署Draw.io绘图工具并实现远程访问协作办公

前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0c;并且因为其功能强大&#xff0c;导致安装需要很多的系统内存&#xff0c;并且是不可跨平台使用。所以&#xff0c;今天给…

docker小白第三天

docker小白第三天 docker为什么会比虚拟机快 1、docker有着比虚拟机更少的抽象层。不需要Hypervisor实现硬件资源虚拟化&#xff0c;运行在docker容器上的程序直接使用的都是实际物理机的硬件资源&#xff0c;因此在CPU、内存利用率上docker将会在效率上有明显优势。 2、dock…

CSS盒模型 盒子尺寸问题

什么是盒模型 CSS盒模型分为用来放置内容的content区域&#xff0c;用来调整内容和边框距离的padding区域。用来限制盒子边界的border区域以及用于调整盒子之间距离的margin区域。现在去掉margin&#xff0c;只考虑盒子内部的尺寸问题。 我们先来制作一个盒子。 <!DOCTYPE…

PTA✨C语言 求e的近似值

7-1 求e的近似值 分数 15 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 自然常数 e 可以用级数 11/1!1/2!⋯1/n!⋯ 来近似计算。本题要求对给定的非负整数 n&#xff0c;求该级数的前 n1 项和。 输入格式: 输入第一行中给出非负整数 n&#xff08;≤1000&#xff0…

读书笔记-《数据结构与算法》-摘要6[快速排序]

快速排序 核心&#xff1a;快排是一种采用分治思想的排序算法&#xff0c;大致分为三个步骤。 定基准——首先随机选择一个元素最为基准划分区——所有比基准小的元素置于基准左侧&#xff0c;比基准大的元素置于右侧递归调用——递归地调用此切分过程 快排的实现与『归并排…

【图论】普利姆算法,最小生成树

一次加入一个节点到我们的最下生成树中。加入哪个&#xff1f;跟着下面的步骤走一遍你就会了。 1. 把第一个节点A添加进来 2. 看两条边<A,B>,<A,E>,一个长度是3&#xff0c;一个长度是4&#xff0c;把长度短的边的另一个节点添加进来&#xff0c;也就是B 3. 再看A,…