mybatisPlus高级篇

news2024/11/17 3:50:07

文章目录

  • 主键生成策略介绍
    • AUTO策略
    • INPUT策略
    • ASSIGN_ID策略
    • ASSIGN_UUID策略
    • NONE策略
  • MybatisPlus分页
    • 分页插件
    • 自定义分页插件
  • ActiveRecord模式
  • SimpleQuery工具类
    • SimpleQuery介绍
    • list
    • map
    • Group

主键生成策略介绍

  • 主键:在数据库中,主键通常用于快速查找和访问数据。主键是数据库表中的一列或一组列,用于唯一标识表中的每一行数据。主键必须具有唯一性,而且主键值不能为NULL。主键可以用来确保数据的完整性和一致性,还可以用于建立表之间的关系。
  • 在MybatisPlus中提供了一个注解,是@TableId,该注解提供了各种的主键生成策略,通过使用该注解来对于新增的数据指定主键生成策略。在新增数据的时候,数据就会按照指定的主键生成策略来生成对应的主键。

AUTO策略

  • 该策略为跟随数据库表的主键递增策略
  • 当使用AUTO策略(自动递增)来生成主键值时,数据库主键的类型应设置为整数类型(如INT、BIGINT等),以便能够自动递增并确保唯一性。这是因为自动递增主键会自动为每个新插入的行生成一个唯一的整数值,而整数类型可以更有效地存储和处理这些值。
  • 前提是数据库表的主键要设置为自增,此处要设置好下次递增的数字
    在这里插入图片描述
    在这里插入图片描述
  • 实体类添加注解,指定主键生成策略
    @TableId(type = IdType.AUTO)
    private Long id;

INPUT策略

  • 对于INPUT策略,数据库主键的类型可以是任何合适的数据类型,根据具体的需求来确定。
  • INPUT策略意味着主键的值是由用户手动输入或提供的,而不是由数据库自动生成。因此,主键可以是任何合法的数据类型,如整数、字符串、日期等,取决于业务需求和数据的特性。需要注意的是,需要确保主键的值在表中是唯一的,以维护数据的完整性和一致性。
    @TableId(type = IdType.INPUT)
    private Long id;

ASSIGN_ID策略

  • ASSIGN_ID策略是一种手动分配主键值的策略。主键的类型可以是任何合适的数据类型,根据具体的需求来确定。
  • 如果不设置类型值,默认则使用IdType.ASSIGN_ID策略(自 3.3.0 3.3.0 3.3.0起)。该策略会使用雪花算法自动生成主键ID,主键类型为长或字符串(分别对应的MySQL的表字段为BIGINTVARCHAR
  • 需要注意的是,需要确保主键的值在表中是唯一的,以维护数据的完整性和一致性。

  • 雪花算法是由一个64位的二进制组成的,最终就是一个Long类型的数值。主要分为四部分存储:
    1. 位的符号位,固定值为0
    2. 41位的时间戳
    3. 10位的机器码,包含5位机器id和5位服务id
    4. 12位的序列号
      在这里插入图片描述
 @TableId(type = IdType.ASSIGN_ID)
 private Long id;

ASSIGN_UUID策略

  • UUID(Universally Unique Identifier)全局唯一标识符,定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全唯一的系统信息。
  • UUID的编码规则:
    1. 1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性;
    2. 9~16位采用底层的IP地址,在服务器集群中的唯一性;
    3. 17~24位采用当前对象的HashCode值,在一个内部对象上的唯一性;
    4. 25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的唯一性。
  • 使用UUID作为MySQL主键时,主键类型应选择VARCHAR类型。UUID是一个36位的字符串,由32位的十六进制数字和4个连字符组成。因此,需要使用VARCHAR(36)来存储UUID。
  @TableId(type = IdType.ASSIGN_UUID)
  private String id;

NONE策略

  • NONE策略表示不指定主键生成策略,当我们没有指定主键生成策略或者主键策略为NONE的时候,跟随的是全局策略。全局默认配置id-type使用的是雪花算法。
 @TableId(type = IdType.NONE)
 private Long id;

MybatisPlus分页

分页插件

  • 分页的本质就是需要设置一个拦截器,通过拦截器拦截了SQL,通过在SQL语句的结尾添加limit关键字,来实现分页的效果。

  • 配置的步骤

  1. 通过配置类来指定一个具体数据库的分页插件,因为不同的数据库的方言不同,具体生成的分页语句也会不同。
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
  1. 实现分页查询效果
@Test
void selectPage(){
    //1.创建QueryWrapper对象
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //2.创建分页查询对象,指定当前页和每页显示条数
    IPage<User> page = new Page<>(1,3);
    //3.执行分页查询
    userMapper.selectPage(page, lambdaQueryWrapper);
    //4.查看分页查询的结果
    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());
}
  1. 查询语句查看
    在这里插入图片描述

自定义分页插件

在某些场景下,需要自定义SQL语句来进行查询。接下来演示一下自定义SQL的分页操作

  1. UserMapper.xml映射配置文件中提供查询语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.powernode.mapper.UserMapper">
     <select id="selectByName" resultType="com.powernode.domain.User">
        select * from powershop_user where name = #{name}
     </select>
</mapper>
  1. Mapper接口中提供对应的方法,方法中将IPage对象作为参数传入
@Mapper
public interface UserMapper extends BaseMapper<User> {
       IPage<User> selectByName(IPage<User> page, String name);
}
  1. 实现分页查询效果
@Test
void selectPage2(){
    //1.创建分页查询对象,指定当前页和每页显示条数
    IPage<User> page = new Page<>(1,2);
    //2.执行分页查询
    userMapper.selectByName(page,"Mary");
    //3.查看分页查询的结果
    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());
}

ActiveRecord模式

  • ActiveRecord(活动记录,简称AR),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
  • ActiveRecord 一直广受解释型动态语言( PHP 、 Ruby 等)的喜爱,通过围绕一个数据对象进行CRUD操作。而 Java 作为准静态(编译型)语言,对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索,仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅。

  • 实现步骤
  1. 让实体类继承Model类
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User extends Model<User> {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • Model类中提供了一些增删改查方法,可以直接使用实体类对象调用这些增删改查方法,简化了操作的语法,但底层依然是需要UserMapper,所以持久层接口并不能省略
  2. 测试ActiveRecord模式的增删改查
    • 添加数据
    @Test
    void activeRecordAdd(){
        User user = new User();
        user.setName("wang");
        user.setAge(35);
        user.setEmail("wang@powernode.com");
        user.insert();
    }
    
    • 删除数据
    @Test
    void activeRecordDelete(){
        User user = new User();
        user.setId(8L);
        user.deleteById();
    }
    
    • 修改数据
    @Test
    void activeRecordUpdate(){
        User user = new User();
        user.setId(6L);
        user.setAge(50);
        user.updateById();
    }
    
    • 查询数据
    @Test
    void activeRecordSelect(){
        User user = new User();
        user.setId(6L);
        User result = user.selectById();
        System.out.println(result);
    }
    

SimpleQuery工具类

SimpleQuery介绍

  • SimpleQuery可以对selectList查询后的结果用Stream流进行了一些封装,使其可以返回一些指定结果,简洁了api的调用

list

  • 演示基于字段封装集合
@Test
void testList(){
   //.list()方法执行查询,并返回符合条件的用户列表
   //使用.list(User::getId)来指定返回的字段为ID
    List<Long> ids = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getId);
    System.out.println(ids);
}
  • 演示对于封装后的字段进行lambda操作
@Test
void testList2(){
    /* e ->  Optional.of(e.getName()).map(String::toLowerCase).ifPresent(e::setName)
      额外的逻辑处理,即对返回的姓名进行转换
      Optional.of(e.getName())用于将姓名转换为Optional对象,以便进行后续的操作。
      接着,.map(String::toLowerCase)将姓名转换为小写形式。最后,.ifPresent(e::setName)将转换后的小写姓名设置回User对象的姓名属性。
    */
    List<String> names = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"),User::getName,e ->  Optional.of(e.getName()).map(String::toLowerCase).ifPresent(e::setName));
    System.out.println(names);
}

map

  • 演示将所有的对象以id,实体的方式封装为Map集合
@Test
void testMap(){
    //将所有元素封装为Map形式
    Map<Long, User> idEntityMap = SimpleQuery.keyMap(new LambdaQueryWrapper<>(), User::getId);
    System.out.println(idEntityMap);
}
  • 演示将单个对象以id,实体的方式封装为Map集合
@Test
void testMap2(){
    //将单个元素封装为Map形式
    Map<Long, User> idEntityMap = SimpleQuery.keyMap(
            new LambdaQueryWrapper<User>().eq(User::getId,1L), User::getId);
    System.out.println(idEntityMap);
}
  • 演示只想要id和name组成的map
@Test
void testMap3(){
    //只想要只想要id和name组成的map
    Map<Long, String> idNameMap = SimpleQuery.map(new LambdaQueryWrapper<>(), User::getId, User::getName);
    System.out.println(idNameMap);
}

Group

  • 演示分组效果
@Test
void testGroup(){
    Map<String, List<User>> nameUsersMap = SimpleQuery.group(new LambdaQueryWrapper<>(), User::getName);
    System.out.println(nameUsersMap);
}

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

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

相关文章

【MySQL】视图(十)

&#x1f697;MySQL学习第十站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 一.引入 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据…

python json保留汉字原始形式,而不是Unicode编码(Unicode码)(加ensure_ascii=False参数)

文章目录 问题解决办法测试 问题 如图&#xff0c;保存汉字的时候变成unicode码了。。。 代码是这样的&#xff1a; 解决办法 在Python中&#xff0c;可以使用json模块的ensure_ascii参数来控制是否将汉字转换为类似\u5730\u9707的Unicode编码。默认情况下&#xff0c;ensure…

会议OA项目之权限管理个人中心(修改个人信息,选择本地图片进行头像修改)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 数据表及分析 表数据 表分析 所谓的权限管理就是不同的人管理不同的事&#xff0c;拥有着管理不同事情的不同权力。那么第一张表--权限表&…

网络知识整理

网络知识整理 网络拓扑网关默认网关 数据传输拓扑结构层面协议层面 网络拓扑 网关 连接两个不同的网络的设备都可以叫网关设备&#xff0c;网关的作用就是实现两个网络之间进行通讯与控制。 网关设备可以是交换机(三层及以上才能跨网络) 、路由器、启用了路由协议的服务器、代…

P3818 小A和uim之大逃离 II

题目 思路 一眼bfs 好像需要记录的东西有点多啊&#xff0c;那就交给数组吧 s t i j 0 / 1 st_{ij0/1} stij0/1​表示用/没用特殊步走到(i,j)的步数&#xff0c;然后套bfs模板即可 代码 #include<bits/stdc.h> using namespace std; const int N1005; int n,m,d,r,st…

c++学习(c++11)[24]

c11 列表初始化 #include"iostream" using namepace std;int main() {int x1 1;int x2 { 2 };int x3 { 2 };vector<int> v1 {1,2,3,4,5,6};vector<int> v1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};au…

红黑树与平衡二叉树

文章目录 前言一、平衡二叉树二、红黑树区别 前言 数据库的底层用到了多种树结构&#xff0c;这里简单记录一下红黑树与平衡二叉树。 一、平衡二叉树 满足二叉树。任何节点的两个子树的高度最大差为1。如果对平衡二叉树进行删除和新增&#xff0c;那么会破坏平衡&#xff0c;…

Jmix 如何将外部数据直接显示在界面?

企业级应用中&#xff0c;通常一个业务系统并不是孤立存在的&#xff0c;而是需要与企业、部门或者是外部的已有系统进行集成。一般而言&#xff0c;系统集成的数据和接口交互方式通常有以下几种&#xff1a; 文件传输&#xff1a;通过文件传输的方式将数据传递给其他系统&…

C++设计模式笔记

设计模式 如何解决复杂性&#xff1f; 分解 核心思想&#xff1a;分而治之&#xff0c;将大问题分解为多个小问题&#xff0c;将复杂问题分解为多个简单的问题。 抽象 核心思想&#xff1a;从高层次角度讲&#xff0c;人们处理复杂性有一个通用的技术&#xff0c;及抽象。…

现在运动耳机什么牌子的好用、最好的运动耳机推荐

对于注重身体健康的小伙伴来说&#xff0c;每周必然都少不了有规律的运动&#xff0c;而运动的时候耳边没有音乐的陪伴总是稍显枯燥无味&#xff0c;很难让人提起干劲来。有些小伙伴觉得运动的时候戴着耳机&#xff0c;稍微跳动几下耳机就开始松动&#xff0c;随时都要分心提防…

【LeetCode】124.二叉树中的最大路径和

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

SQLserver 查询数据库表结构和说明简介信息

DECLARE tableName NVARCHAR(MAX ) SET tableName‘TK_Cargoowner’;–表名!!! SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE ‘’ END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ‘’) AS 列说明 , t.name AS 数据类型 , col.length A…

第十章:queue类

系列文章目录 文章目录 系列文章目录前言queue的介绍queue的使用成员函数使用queue 总结 前言 queue是容器适配器&#xff0c;底层封装了STL容器。 queue的介绍 queue的文档介绍 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器…

微信小程序实现日历功能、日历转换插件、calendar

文章目录 演示htmlJavaScript 演示 效果图 微信小程序实现交互 html <view wx:if"{{calendarArr.length}}"><view class"height_786 df_fdc_aic"><view class"grid_c7_104"><view class"font_weight_800 text_align…

多分类问题-Softmax Classifier分类器

概率分布&#xff1a;属于每一个类别的概率总和为0&#xff0c;且都>0&#xff0c;n组类别需要n-1个参数就能算出结果 数据预处理 loss函数 crossentropyloss()函数 CrossEntropyLoss <> LogSoftmax NLLLoss。也就是说使用CrossEntropyLoss最后一层(线性层)是不需要做…

Pytorch深度学习-----神经网络的卷积操作

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

软件外包开发测试管理工具

测试是软件工程中非常重要的一个环节&#xff0c;在上线前必须需要经过严格的测试才能确保上线后软件系统长时间运行。有大量的软件开发和测试管理工具&#xff0c;每一个工具都有自己的特点&#xff0c;今天和大家分享一些常见的工具&#xff0c;希望对大家有所帮助。北京木奇…

STM32 LWIP UDP 一对一 一对多发送

STM32 LWIP UDP通信 前言设置 IP 地址UDP函数配置实验结果单播发送&#xff0c;一对一发送广播发送&#xff0c;一对多发送 可能遇到的问题总结 前言 之前没有接触过网络的通信&#xff0c;工作需要 UDP 接收和发送通信&#xff0c;在网上没有找到一对一、一对多的相关例程&am…

Visual C++中的虚函数和纯虚函数(以外观设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…