MyBatisPlus基础入门笔记

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);  
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…

智慧工地源码:为施工企业提供专业落地的解决方案

智慧工地利用物联网、大数据、AI等核心技术&#xff0c;实时采集现场数据&#xff0c;自动分析&#xff0c;精准分析、智能决策、科学评价&#xff0c;形成一套数据驱动的新型管理模式。为施工企业提供生产提效、安全可控、成本节约的项目管理解决方案&#xff0c;提升项目部管…

每周一算法:树形动态规划

树形动态规划 树形动态规划一般用于处理求树上最优值的问题。大多数动态规划问题都是在一维二维这种规则的背景下的&#xff0c;可以解决的问题比较局限&#xff0c;而树作为一种特殊的图&#xff0c;可以描述比较复杂的关系&#xff0c;再加上树的递归定义&#xff0c;是一种…

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统&#xff08;DevFS&#xff09;的替代品&#xff0c;是 Linux 内核的设备管理器。总的来说&#xff0c;它取代了 devfs 和 hotplug&#xff0c;负责管理 /dev 中的设备节点。同时…

openHarmony添加system_basic权限安装报错

openHarmony添加system_basic权限安装报错 12/14 13:49:57: Install Failed: [Info]App install path:D:\huawei\project\FCTTest\entry\build\default\outputs\default\entry-default-signed.hap, queuesize:0, msg:error: failed to install bundle. error: install failed …

【ET8框架入门】0.ET框架介绍

ET8 新特性 多线程多进程架构,架构更加灵活强大&#xff0c;多线程设计详细内容请看多线程设计课程抽象出纤程(Fiber)的概念&#xff0c;类似erlang的进程&#xff0c;非常轻松的创建多个纤程&#xff0c;利用多核&#xff0c;仍然是单线程开发的体验纤程调度: 主线程&#xf…

LeetCode Hot100 23.合并K个升序链表

题目&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 方法&#xff1a;分治&#xff0c;类似于归并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return mer…

MySQL:从MySQL看主从架构高可用性实现

目录 1 主备延迟 1.1 主备延迟 1.2 主备延迟的来源 1.2.1 主备机性能有差距 1.2.2 备库压力大 1.2.3 大事务 1.3 主备延迟的排查思路 3&#xff09;查看MySQL状态 2 主备切换策略 2.1 可靠性优先策略 2.2 可用性优先策略 2.3 常见切换技术 从进入互联网时代开始&a…

深度学习第5天:GAN生成对抗网络

☁️主页 Nowl &#x1f525;专栏 《深度学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 一、GAN1.基本思想2.用途3.模型架构 二、具体任务与代码1.任务介绍2.导入库函数3.生成器与判别器4.预处理5.模型训练6.图片生成7.不同训练轮次的结果对比 一…

KylinV10 将项目上传至 Github

KylinV10 将项目上传至 Github 银河麒麟操作系统 V10 是在 Ubuntu 的基础上开发的&#xff0c;所以适用于 Ubuntu 的也适用于 KylinV10 一般上传至 GitHub&#xff0c;有两种方式&#xff0c;一种是 HTTPS&#xff0c;一种是 SSH&#xff0c;但是在 KylinV10 操作系统 HTTPS 的…

大数据----31.hbase安装启动

二.Hbase安装 先前安装&#xff1a; Zookeeper 正常部署 首先保证 Zookeeper 集群的正常部署&#xff0c;并启动之。 三台机器都执行&#xff1a;zkServer.sh startHadoop 正常部署 Hadoop 集群的正常部署并启动。 主节点上进行 &#xff1a;start-all.sh 1.HBase 的获取 一定…

【Python网络爬虫入门教程1】成为“Spider Man”的第一课:HTML、Request库、Beautiful Soup库

Python 网络爬虫入门&#xff1a;Spider man的第一课 写在最前面背景知识介绍蛛丝发射器——Request库智能眼镜——Beautiful Soup库 第一课总结 写在最前面 有位粉丝希望学习网络爬虫的实战技巧&#xff0c;想尝试搭建自己的爬虫环境&#xff0c;从网上抓取数据。 前面有写一…

c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标以便控制电机移动

c#读取XML文件实现晶圆wafermapping显示 功能&#xff1a; 1.读取XML文件&#xff0c;显示mapping图 2.在mapping视图图标移动&#xff0c;实时查看bincode,x,y索引与计算的电机坐标 3.通过设置wafer放在平台的位置x,y轴电机编码值&#xff0c;相机在wafer的中心位置&#…

IDEA删除最近打开的文件记录

IDEA删除最近打开的文件记录 遇见问题&#xff1a;如何删除IDEA中最近打开的文件记录 解决方法 先关闭IDEA 找到 recentProjects.xml 文件 windows 位置&#xff1a;&#xff08;AppData是隐藏文件夹&#xff09; 1.C:\Users\电脑用户名\AppData\Roaming\JetBrains\IntelliJIde…

jpa 修改信息拦截

实现目标springbootJPA 哪个人&#xff0c;修改了哪个表的哪个字段&#xff0c;从什么值修改成什么值 Component // 必须加 Slf4j Configurable(autowire Autowire.BY_TYPE) public class AuditingEntityListener {// 线程变量&#xff0c;保存修改前的 objectprivate Thre…

SpringBoot运维中的高级配置

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

Navicat16 无限试用 亲测有效

Navicat16 无限试用 亲测有效 亲测有效&#xff01;&#xff01;&#xff01; 吐槽下&#xff0c;有的用不了&#xff0c;有的是图片&#xff0c;更甚者还有收费的&#xff0c;6的一批 粘贴下面的代码&#xff0c;保存到桌面&#xff0c;命名为 trial-navicat16.bat echo off…

Web安全-SQL注入常用函数(二)

★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、MySQL数据库构成 初始化安装MySQL数据库后(…

从零开始搭建企业管理系统(七):RBAC 之用户管理

RBAC 之用户管理 创建表&#xff08;Entity&#xff09;用户表角色表权限表用户角色表关系注解ManyToMany 角色权限表 接口开发UserControllerUserServiceUserServiceImplUserRepository 问题解决update 更新问题懒加载问题JSON 循环依赖问题 根据上一小结对表的设计&#xff0…

基于ssm高校食堂订餐系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本高校食堂订餐系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…