[SSM]MyBatisPlus高级

这篇具有很好参考价值的文章主要介绍了[SSM]MyBatisPlus高级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

四、高级篇

4.1主键策略

  • 主键的作用就是唯一标识,我们可以通过这个唯一标识来定位到这条数据。
  • 对于表数据中的主键,我们可以自己设计生成规则,生成主键。但是在更多的场景中,没有特殊要求的话,我们每次自己手动生成的比较麻烦,我们可以借助框架提供好的主键生成策略来生成主键,这样比较方便。
  • 在MybatisPlus中提供了一个注解,是@TableId,该注解提供了各种的主键生成策略,我们可以通过使用该注解来对于新增的数据指定主键生成的策略。那么在以后新增数据的时候,数据就会按照我们指定的主键生成策略来生成对应的主键。
4.1.1AUTO策略
  • 该策略为跟随数据库表的主键递增策略,前提是数据库表的主键要设置为自增。
  • 实体类添加主键,指定主键生成策略。
//设置主键自增
@TableId(type = IdType.AUTO)
private Long id;
  • 插入数据
@Test
void primary() {
    User user = new User();
    user.setName("Mary");
    user.setAge(30);
    user.setEmail("mary@qq.com");

    userMapper.insert(user);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

4.1.2INPUT策略
  • 该策略表示,必须由我们手动的插入id,否则无法添加数据。
  • 由于不使用AUTO了,所以将数据库中的自动递增去掉。
//手动设置主键值
@TableId(type = IdType.INPUT)
private Long id;
@Test
void primary() {
    User user = new User();
    user.setId(8L);
    user.setName("Mary");
    user.setAge(30);
    user.setEmail("mary@qq.com");

    userMapper.insert(user);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

4.1.3ASSIGN_ID策略
  • 如果我们将来一张表的数据量很大,我们需要进行分表。
  • 常见的分表策略有两种:
  1. 水平拆分

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

  • 水平拆分就是将一个大的表按照数据量进行拆分
  1. 垂直拆分

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

  • 垂直拆分就是将一个大的表按照字段进行拆分

  • 其实对于拆分后的数据,有三点需求,以水平拆分为例:

    • 之前的表的主键是有序的,拆分后还是有序的。
    • 虽然做了表的拆分,但是每条数据还需要保证主键的唯一性
    • 主键最好不要直接暴露数据的数量,这样容易被外界知道关键信息
  • 那就需要有一种算法,能够实现这三个需求,这个算法就是雪花算法。

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

    • 1位的符号位,固定值为0
    • 41位的时间戳
    • 10位的机器码,包含5位机器id和5位服务id
    • 12位的序列号

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

  • 使用雪花算法可以实现有序、唯一且不直接暴露排序的数字。
//使用雪花算法,默认为type = IdType.ASSIGN_ID,可省略
@TableId(type = IdType.ASSIGN_ID)
private Long id;
@Test
void primary() {
    User user = new User();
    user.setName("Mary");
    user.setAge(30);
    user.setEmail("mary@qq.com");

    userMapper.insert(user);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

  • 在插入后发现一个19位长度的id,该id就是雪花算法生成的id,这是二进制的十进制表示形式。
4.1.4NONE策略
//不指定主键生成策略
@TableId(type = IdType.NONE)
private Long id;
  • NONE策略表示不指定主键生成策略,当我们没有指定主键生成策略或者主键策略为NONE的时候,他跟随的是全局策略。
#主键生成策略全局配置(默认为assign_id)
mybatis-plus.global-config.db-config.id-type=assign_id
  • 全局配置中id-type是用于配置主键生成策略的,id-type默认值为IdType.ASSIGN_ID
4.1.5ASSIGN_UUID策略
  • UUID是全局唯一标识符,定义一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全唯一的系统信息。
  • UUID的编码规则:
    • 1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性
    • 9~16位采用底层的IP地址,在服务器集群中的唯一性
    • 17~24位采用当前对象的HashCode值,在一个内部对象上的唯一性
    • 25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的唯一性
  • 通过以上4中策略可以保证唯一性,在系统中需要用到随机数的地方都可以考虑采用UUID算法。
  • 使用UUID需要将数据库表的字段类型改为varchar(50),将实体类的属性类型改为String,并指定主键生成策略。
//主键采用ASSIGN_UUID策略
@TableId(type = IdType.ASSIGN_UUID)
private String id;
  • 完成数据的添加
@Test
void primary() {
    User user = new User();
    user.setName("Mary");
    user.setAge(30);
    user.setEmail("mary@qq.com");

    userMapper.insert(user);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

4.2分页

  • 在MybatisPlus中的查询语句有两种实现方式
    • 通过MybatisPlus提供的方法来实现条件查询
    • 通过自定义SQL语句的方式来实现查询
4.2.1分页插件
  • 在大部分情况下,如果我们的SQL没有这么复杂,是可以直接通过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;
    }
}

2.实现分页效果查询

@Test
void selectPage() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    //指定分页对象,分页对象包含分页信息 IPage
    Page<User> userPage = new Page<>(2, 3);
    //执行查询
    userMapper.selectPage(userPage, lambdaQueryWrapper);
    //获取分页查询的信息
    System.out.println("当前页:" + userPage.getCurrent());
    System.out.println("每页显示条数:" + userPage.getSize());
    System.out.println("总页数:" + userPage.getPages());
    System.out.println("总条数:" + userPage.getTotal());
    System.out.println("分页数据:" + userPage.getRecords());
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

4.2.2自定义分页插件
  • 在某些场景下,我们需要自定义SQL语句来进行查询。

1.在UserMapper.xml映射配置文件中提供查询语句

<mapper namespace="com.hhb.mp02.mapper.UserMapper">
    <select id="selectByName" resultType="com.hhb.mp02.domain.User" parameterType="String">
        select * from t_user where username=#{name}
    </select>
</mapper>

2.在Mapper接口中提供对应的方法,方法中将Page对象作为参数传入

@Mapper
public interface UserMapper extends BaseMapper<User> {
    Page<User> selectByName(Page<User> page, String name);
}

3.实现分页查询效果

@Test
void selectPage2() {
    Page<User> userPage = new Page<>(1, 2);
    userMapper.selectByName(userPage,"Mary");
    System.out.println("当前页:" + userPage.getCurrent());
    System.out.println("每页显示条数:" + userPage.getSize());
    System.out.println("总页数:" + userPage.getPages());
    System.out.println("总条数:" + userPage.getTotal());
    System.out.println("分页数据:" + userPage.getRecords());
}

4.3ActiveRecord模式

1.实体类继承Model

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends Model<User> {
    private Long id;
    @TableField("username")
    private String name;
    private Integer age;
    private String email;
    @TableField("`desc`")
    private String desc;
}
  • 我们可以看到,Model类中提供了一些增删改查的方法,这样的话我们就可以直接使用实体类对象调用这些增删改查方法了,简化了操作的语法,但是他的底层依然是需要UserMapper的,所以持久化层接口并不能省略。

2.测试ActiveRecord模式的增删改查

@SpringBootTest
public class ActiveRecordTest {

    //添加操作
    @Test
    void activeRecordAdd() {
        User user = new User();
        user.setName("张三");
        user.setEmail("zhang@qq.com");
        user.setAge(33);
        user.insert();
    }

    //删除操作
    @Test
    void activeRecordDelete() {
        User user = new User();
        user.setId(9L);
        user.deleteById();
    }

    //修改操作
    @Test
    void activeRecordUpdate() {
        User user = new User();
        user.setId(10L);
        user.setName("李四");
        user.setAge(26);
        user.setEmail("lisi@qq.com");
        user.updateById();
    }

    //查询操作
    @Test
    void activeRecordSelect() {
        User user = new User();
        user.selectAll();
    }
}

4.4SimpleQuery工具类

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

基于字段封装集合

@Test
void testList() {
    List<Long> list = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getId);
    System.out.println(list);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

对于封装后的字段进行lambda操作

@Test
void testList2() {
    List<String> list = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getName, new Consumer<User>() {
        @Override
        public void accept(User user) {
            //map转化
           Optional.of(user.getName()).map(String::toLowerCase).ifPresent(user::setName);
        }
    });
    System.out.println(list);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

4.4.2map

将所有的对象以id=实体类的方式封装为Map集合

@Test
void testMap() {
    Map<Long, User> map = SimpleQuery.keyMap(new LambdaQueryWrapper<User>(), User::getId);
    System.out.println(map);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

将单个对象以id=实体类的方式封装为Map集合

@Test
void testMap2() {
    Map<Long, User> map = SimpleQuery.keyMap(new LambdaQueryWrapper<User>().eq(User::getId, 1L), User::getId);
    System.out.println(map);
}

由id和name组成的map

@Test
void testMap3() {
    Map<Long, String> map = SimpleQuery.map(new LambdaQueryWrapper<User>(), User::getId, User::getName);
    System.out.println(map);
}

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis

4.4.3Group
@Test
    void testGroup() {
        Map<String, List<User>> maps = SimpleQuery.group(new LambdaQueryWrapper<User>(), User::getName);
        for (Map.Entry<String, List<User>> stringListEntry : maps.entrySet()) {
            System.out.println(stringListEntry);
        }
    }

[SSM]MyBatisPlus高级,java,mybatisplus,mybatis文章来源地址https://www.toymoban.com/news/detail-697735.html

到了这里,关于[SSM]MyBatisPlus高级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【mybatis和mybatisplus的区别】

    MyBatis 和 MyBatis Plus 都是 Java 语言的持久层框架,但它们之间有以下几个区别: MyBatis 是一个基于 XML 配置文件和 SQL 语句的 ORM 框架,提供了数据持久化的基本功能,如 SQL 映射、缓存管理等。而 MyBatis Plus 在 MyBatis 的基础上进行了扩展,提供了更加丰富的功能特性,如分页插

    2024年02月11日
    浏览(48)
  • MyBatis-Plus 引入依赖导致的Error creating bean和java.lang.NoClassDefFoundError: com/baomidou/mybatisplus问题

     使用mybatis-plus出现的一些问题记录。 问题错误截图 问题原因: 依赖冲突 项目主pom文件中引入了mybatis-plus-boot-start依赖,版本为 3.5.3 业务包中引入mybatis-plus代码生成器依赖版本为 3.4.1 导致mybatis-plus-core核心包存在两个版本,导致冲突   解决办法 修改业务包中mybatis-plus代码

    2024年02月09日
    浏览(53)
  • mybatisplus 使用mybatis中的配置、mapper配置文件

    即在和application.properties同级目录下的mybatis目录中创建mybatis的配置文件mybatis-config.xml 其内容如下 方式一的目录结构: 1、在application.properties中再添加一行mapper映射地址 修改mapper映射的配置文件路径,这次不用在和mapper接口的路径一一对应,只需要在resource/mybatis/mapper/UserMa

    2023年04月08日
    浏览(43)
  • 实战系列(三)| Mybatis和MybatisPlus区别,包含详细代码

    MyBatis 和 MyBatisPlus 都是基于 MyBatis 的扩展库,用于简化 MyBatis 的开发。MyBatisPlus 是在 MyBatis 的基础上进行封装,提供了一套通用的 CRUD 操作接口,而 MyBatis 是一个底层的持久层框架。 MyBatis 是一个持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有

    2024年02月09日
    浏览(37)
  • springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

    mybatisplus实际上只对单表查询做了增强(速度会更快),从传统的手写sql语句,自己做映射,变为封装好的QueryWrapper。 本篇文章的内容是有两张表,分别是用户表和订单表,在不直接在数据库做表连接的情况下,通过后台代码完成①查询订单的同时查到该订单所属的用户,②

    2024年02月07日
    浏览(49)
  • 【Mybatis-Plus】mybatisplus更新时,实体字段为空,数据库不更新的解决方案

    项目技术栈:jdk (1.8) + spring boot (2.1.0) + mybatis-plus (3.5.1) 数据库: MySQL 字段类型:varchar 和 Integer 从前端传过来的数据实体字段, convertType 和 step 设为null时,使用mybatis-plus 的 updateById方法往数据库中更新时,这两个字段不更新,数据不为空可以插入。 mybatis-plus在更新的时候做

    2024年01月16日
    浏览(63)
  • Java开发 - MybatisPlus框架初体验

    目录 前言 MyBatisPlus 什么是MyBatisPlus 特性 Spring Boot整合MyBatisPlus 创建项目

    2023年04月10日
    浏览(38)
  • java之SpringBoot基础、前后端项目、MyBatisPlus、MySQL、vue、elementUi

    在基础篇中,我给学习者的定位是先上手,能够使用 SpringBoot 搭建基于 SpringBoot 的 web 项目开发,所以内容设置较少,主要包含如下内容: 1、 SpringBoot 快速入门 2、 SpringBoot 基础配置 3、基于 SpringBoot 整合 SSMP 学习任意一项技术,首先要知道这个技术的作用是什么,不然学完

    2024年02月10日
    浏览(44)
  • Mybatisplus报错 field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass

    Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not “opens java.lang.invoke” to unnamed module @6dc17b83 其实是Mybatisplus和Java的版本兼容出现了问题。 这个错误是因为在 Java 9 及之后的版本中,模块化系统 (Module System) 引入了访问限

    2024年02月04日
    浏览(57)
  • SpringBoot+MyBatisPlus+MySql+vue2+elementUi的案例、java访问数据库服务、java提供接口服务

    1、项目不使用前后端分离。 2、在创建 SpringBoot 的时候要注意各个插件间的版本问题。 3、后端技术 SpringBoot + MyBatisPlus + MySql 。 4、前端技术 vue2 + elementUi 。 简单介绍 1、数据库名称 ssm_db 2、表名称 tbl_book 数据表对象文件(Book.java) 配置文件(application.yml) 创建项目后,在 resou

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包