首页 > 图灵资讯 > 技术篇>正文

动力节点2023版MyBatisPlus教程【高级篇】

2023-04-19 16:09:27

  最新版本的MybatisPlus教程来自B站动力节点,整理了笔记-第四章高级文章4 4.1【高级篇】 主键策略4.1.1 主键生成策略介绍

  首先,我们应该知道什么是主键。主键的功能是唯一的标志。我们可以通过这个唯一的标志来定位这个数据。当然,对于表数据中的主键,我们可以自己设计生成规则,生成主键。然而,在更多的场景中,如果没有特殊要求,我们可以提供一个很好的主键生成策略来生成主键。在MybatisPlus中提供注释更方便快捷。@TableId,该注释提供了各种主键生成策略,我们可以使用该注释来指定新数据的主键生成策略。然后在未来添加数据时,数据将根据我们指定的主键生成策略生成相应的主键。4.1.2 AUTO策略

  该策略是跟随数据库表的主键递增策略,前提是数据库表的主键设置为自增

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架

  这里应该设置下次增加的数字

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架_02

  在实体类中添加注释,指定主要生成策略 @Data@AllArgsConstructor@NoArgsConstructorpublic class User {** **@TableId(type = IdType._AUTO_) private Long id; private String name; private Integer age; private String email;} @Testvoid primaryKey(){ User user = new User(); user.setName("Mary"); user.setAge(35); user.setEmail(test7@powernode.com"); userMapper.insert(user);}

  拼接SQL语句如下

动力节点2023版MyBatisPlus教程【高级篇】_spring_03

4.1.3 INPUT策略

  该策略表明,id必须手动插入,否则不能添加数据 @Data@AllArgsConstructor@NoArgsConstructorpublic class User {** **@TableId(type = IdType._INPUT_) private Long id; private String name; private Integer age; private String email;}

  因为我们不使用AUTO,所以我们删除了自动递增

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架_04

  如果我们省略不写id,我们会发现我们无法插入数据 @Testvoid primaryKey(){ User user = new User(); user.setName("Jerry"); user.setAge(38); user.setEmail(test8@powernode.com"); userMapper.insert(user);}

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架_05

  但我们自己指定了id,发现我们可以添加成功 @Testvoid primaryKey(){ User user = new User(); user.setId(8L); user.setName("Jerry"); user.setAge(38); user.setEmail(test8@powernode.com"); userMapper.insert(user);} 4.1.4 ASSIGN_ID策略

  让我们考虑一下,像以前这样的自动增长方式有什么问题?

  如果我们将来有大量的数据,我们需要分表。有两种常见的分表策略:[1]水平拆分

动力节点2023版MyBatisPlus教程【高级篇】_mybatis_06

  水平拆分是根据数据量拆分一个大表[2]垂直拆分

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架_07

  垂直拆分是根据字段拆分一个大表

  事实上,我们对拆分后的数据有三个要求。以水平拆分为例:[1]前表的主键有序,拆分后仍有序[2]。虽然表的拆分已经完成,但每个数据仍然需要确保主键的唯一性[3]主键最好不要直接暴露数据的数量,因此外界很容易知道关键信息,因此需要一种算法来实现这三个需求一种算法是雪花算法

  雪花算法由64位二进制组成,最后是Long类型的值。主要分为四部分存储

  [1]1位符号位,固定值为0[2]41位的时间戳[3]10位的机器代码,包括5位机器id和5位服务id[4]12位的序列号

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架_08

  有序、唯一、不直接暴露排序的数字可以通过雪花算法实现。 @Data@AllArgsConstructor@NoArgsConstructorpublic class User { @TableId(type = IdType._ASSIGN_ID_) private Long id; private String name; private Integer age; private String email;} @Testvoid primaryKey(){ User user = new User(); user.setName("Jerry"); user.setAge(38); user.setEmail(test8@powernode.com"); userMapper.insert(user);}

  插入后,我们可以找到一个19位长度的id,即雪花算法生成的id,这是二级十进制的表现形式

动力节点2023版MyBatisPlus教程【高级篇】_mybatis_09

4.1.5 NONE策略 @Data@AllArgsConstructor@NoArgsConstructorpublic class User { @TableId(type = IdType._NONE_) private Long id; private String name; private Integer age; private String email;}

  NONE策略意味着没有指定关键生成策略。当我们没有指定关键生成策略或关键策略是NONE时,他遵循整体策略。让我们看看他的整体战略默认情况是什么 id-type用于配置主键生成策略,我们可以看到id-type的默认值

动力节点2023版MyBatisPlus教程【高级篇】_ssm框架_10

动力节点2023版MyBatisPlus教程【高级篇】_mybatis_11

  通过查看源码发现,id-Type的默认值是雪花算法4.1.6 ASSIGN_UUID策略

  UUID(Universally Unique Identifier)全球唯一的识别符被定义为字符串的主键,由32位数组成,编码由16进制,定义了时间和空间中唯一的系统信息。UUID编码规则:[1]1~8位使用系统时间,确保系统时间的唯一性;

  [2]9~16位使用底层IP地址,服务器集群中的唯一性;[3]17~24位使用当前对象的HashCode值,在内部对象中的唯一性;[4]25~32位使用调用方法的随机数,在一个对象中的毫秒级。唯一性可以通过以上四种策略来保证。UUID算法可以考虑在系统中需要使用随机数的地方。如果我们想演示UUID的效果,我们需要改变表中的字段类型和物理属性类型,将数据库表中的字段类型改为varchar(50)

动力节点2023版MyBatisPlus教程【高级篇】_mybatis_12

  将实体类的属性类型改为String,并将主要生成策略指定为Idtype.ASSIGN_UUID @Data@AllArgsConstructor@NoArgsConstructorpublic class User { @TableId(type = IdType._ASSIGN_UUID_) private String id; private String name; private Integer age; private String email;}

  添加数据完成 @Testvoid primaryKey(){ User user = new User(); user.setName("Jerry"); user.setAge(38); user.setEmail(test8@powernode.com"); userMapper.insert(user);}

  我们会发现成功添加了一个数据,id是uuid类型

动力节点2023版MyBatisPlus教程【高级篇】_mybatisplus教程_13

4.1.7 小结

  本章解释了主键生成策略。我们可以通过指定主键生成策略生成不同的主键id,从而实现数据识别的唯一功能。4.2 分页

  分页操作在实际开发中非常常见,我们可以在各种平台和网站上看到分页的效果。例如:京东商城的分页效果

动力节点2023版MyBatisPlus教程【高级篇】_mybatisplus教程_14

  比如百度的分页效果

mybatisplus教程2023版动力节点_mybatisplus教程_15

  我们如何在Mybatisplus中配置分页?在这里,让我们思考如何实现Mybatisplus中的查询句。我们可以通过Mybatisplus提供的两种方式实现查询句[1]。条件查询[2]通过自定义SQL句实现查询。接下来,让我们展示如何实现这两个页面4.2.1 分页插件

  在大多数情况下,如果我们的SQL不那么复杂,我们可以通过Mybatisplus提供的方法直接查询。在这种情况下,我们可以通过配置分页插件来实现分页效果。分页的本质是设置拦截器,通过拦截器拦截SQL,通过在SQL语句结尾添加limit关键词来实现分页效果

动力节点2023版MyBatisPlus教程【高级篇】_spring_16

  接下来,让我们来看看配置步骤[1]通过配置类指定特定数据库的分页插件。由于不同数据库的方言不同,具体生成的分页句也会不同。在这里,我们将数据库指定为Mysql数据库 @Configurationpublic class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType._MYSQL_)); return interceptor; }}

  [2]实现分页查询效果 @Testvoid selectPage(){ **/1.创建QueryWraper对象 **LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); **//2.创建分页查询对象,指定当前页面和每页显示条数 **IPage 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());}

动力节点2023版MyBatisPlus教程【高级篇】_mybatisplus_17

4.2.2 定制分页插件

  在某些情况下,我们需要定制SQL语句进行查询。接下来,让我们在UserMapper中演示自定义SQL的分页操作[1].在xml映射配置文件中提供查询句 ___

  [2]在Mapper接口中提供相应的方法,该方法将IPage对象作为参数传输到 @Mapperpublic interface UserMapper extends BaseMapper { IPage selectByName(IPage page, String name);}

  [3]表数据为

动力节点2023版MyBatisPlus教程【高级篇】_mybatis_18

  [4]实现分页查询效果 @Testvoid selectpage2(){ **//1.创建分页查询对象,指定当前页面和每页显示条数 **IPage 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());} 4.2.3 小结

  在这里,我们学习了两种分页的配置方法。今后,我们可以在查询条件时使用分页的配置。4.3 Activerecord模式4.3.1 Activerecord介绍

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

  接下来我们来看看Activerecord的实现步骤[1],让实体类继承Model类 @Data@AllArgsConstructor@NoArgsConstructorpublic class User extends Model { private Long id; private String name; private Integer age; private String email;}

  我们可以看到,Model类提供了一些添加和删除的方法,这样我们就可以直接使用物理对象调用这些添加和删除的方法来简化操作语法,但他的底部仍然需要UserMapper,因此持久层接口不能省略[2]测试Activerecord模式的添加和删除添加数据 @Testvoid activeRecordAdd(){ User user = new User(); user.setName("wang"); user.setAge(35); user.setEmail("wang@powernode.com"); user.insert();}

  删除数据 @Testvoid activeRecordDelete(){ User user = new User(); user.setId(8L); user.deleteById();}

  修改数据 @Testvoid activeRecordUpdate(){ User user = new User(); user.setId(6L); user.setAge(50); user.updateById();}|

  查询数据 @Testvoid activeRecordSelect(){ User user = new User(); user.setId(6L); User result = user.selectById(); System._out_.println(result);} 4.4 SimpleQuery工具4.4.1 SimpleQuery介绍

  SimpleQuery可以用Stream流包装selectlist查询结果,使其返回一些指定结果,简化api的调用4.4.2 list

  演示基于字段封装集合 @Testvoid testList(){ List ids = SimpleQuery._list_(new LambdaQueryWrapper().eq(User::getName, "Mary"), User::getId); System._out_.println(ids);}

  演示lambda操作封装后的字段 @Testvoid testlist2(){ List names = SimpleQuery._list_(new LambdaQueryWrapper().eq(User::getName, "Mary"),User::getName,e -> Optional._of_(e.getName()).map(String::toLowerCase).ifPresent(e::setName)); System._out_.println(names);} 4.4.3 map

  演示以id和实体的形式将所有对象封装为Map集合 @Testvoid testMap(){ **///以Map的形式包装所有元素 **Map idEntityMap = SimpleQuery._keyMap_( new LambdaQueryWrapper<>(), User::getId); System._out_.println(idEntityMap);}

  演示以id和实体的形式将单个对象封装为Map集合 @Testvoid testmap2(){ **///以Map的形式包装单个元素 **Map idEntityMap = SimpleQuery._keyMap_( new LambdaQueryWrapper().eq(User::getId,1L), User::getId); System._out_.println(idEntityMap);}

  演示只需要由id和name组成的map @Testvoid testmap3(){ **///只想要由id和name组成的map **Map idNameMap = SimpleQuery._map_(new LambdaQueryWrapper<>(), User::getId, User::getName); System._out_.println(idNameMap);} 4.4.4 Group

  演示分组效果 @Testvoid testGroup(){ Map> nameUsersMap = SimpleQuery._group_(new LambdaQueryWrapper<>(), User::getName); System._out_.println(nameUsersMap);} 4.4.5 小结

  在本节中,我们演示了SimpleQuery提供的Stream流式操作方法,并通过这些操作继续为我们提供简化查询的功能

上一篇 2023最新动力节点MybatisPlus第四章—高级篇
下一篇 智能家居时代,如何选一把适合自己的智能锁

文章素材均来源于网络,如有侵权,请联系管理员删除。