mybaits-plus学习笔记整合(中)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: mybaits-plus学习笔记整合

mybaitsplus通用CRUD


通过前面的学习,我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作,接下来我们将详细讲解这 些操作,下图是BaseMapper的各各方法:



插入操作


方法定义


/**
* 插入一条记录 
* ** 
* @param entity 实体对象 
*/ 
int insert(T entity);


该方法返回的result是受影响的行数,并不是自增后的id


测试用例


    //插入
    @Test
    public void testInsert(){
        User user = new User();
    // user.setId(100L);
        user.setName("曹操");
        user.setPassword("111111");
        user.setAge(20);
        user.setUserName("caocao");
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-DD HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse("1990-01-01 00:00:00", dateTimeFormatter);
        user.setBirthday(localDateTime);
        int i = userMapper.insert(user);
        System.out.println(i);
        //自增后的id会回填到对象中
        System.out.println(user.getId());
    }



mybaitsplus主键生成策略


上例中Mybatis-plus自动生成ID,如何设置id的生成策略呢?


MP支持的id策略如下:


package com.baomidou.mybatisplus.annotation; 
import lombok.Getter;
/**
 *生成ID类型枚举类
 *
 *@author hubin
 * @since 2015‐11‐10
 */ @Getter
public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),
    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);
    private final int key;
    IdType(int key) {
        this.key = key;
    }
}


在对象类中添加对应注解即可,例如下面这样



下面我们具体说一下每个主键:


设置自增主键


设置完全采用数据库自增主键方式。


  1. 设置mysql数据库主键为自增


  1. 修改User对象:


@TableId(value = "ID", type = IdType.AUTO) 
private Long id;
或:
@TableId(value = "ID") 
private Long id;


  1. 程序中不用设置主键


设置输入主键:


手动设置主键值。


  1. mysql数据库主键为自增或不是自增都可以


  1. 修改User对象:


@TableId(value = "ID",type = IdType.INPUT) 
private Long id;


  1. 程序中需要设置主键


UUID


生成全局唯一ID。


  1. mysql数据库主键为字符串类型,不是自增类型。


  1. 修改User对象。


@TableId(value = "ID",type = IdType.UUID) 
private String id;


  1. 程序中不用设置主键


ID_WORKER_STR:


采用雪花片算法(雪花算法生成的ID是纯数字且具有时间顺序,适合分布式场景)生成全局唯一ID,字符串类型。


  1. mysql数据库主键为字符串类型,不是自增类型。


  1. 修改User对象。


@TableId(value = "ID",type = IdType.ID_WORKER_STR) 
private String id;


  1. 程序中不用设置主键


ID_WORKER:


采用雪花片算法生成全局唯一ID,数值类型。


  1. mysql数据库主键为数值类型,不是自增类型。


  1. 修改User对象。


@TableId(value = "ID",type = IdType.ID_WORKER) 
private Long id;


  1. 程序中不用设置主键


更新操作


根据id更新


方法定义:


/**
*根 据 ID 修 改
*
*@param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);


方法步骤


根据id更新操作步骤:


  1. 首先需要设置对象的主键属性值。


  1. 再设置要更新的属性值。


  1. 根据主键找到对象,更新设置属性值。


  1. 返回影响的记录数。


注意:只能将对象中不为NULL的属性更新到表中。


测试案例:


    @Test
    public void testUpdate(){
        User user = new User();
        //更新记录的主键值
        user.setId(2L);
        user.setAge(100);//要更新的值
        user.setPassword("12222");//要更新的值
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.updateById(user);
        System.out.println(i);
        System.out.println(user);
    }


运行结果:



数据库更新结果:




根据条件更新


方法定义:


/**
*根据 whereEntity 条件,更新记录
*
*@param entity  实体对象 (set 条件值,可以为 null)
*@param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(
  @Param(Constants.ENTITY) T entity, 
  @Param(Constants.WRAPPER) Wrapper<T> updateWrapper
);


根据ID更新一次只能更新一条记录,根据条件更新可实现批量更新。


更新步骤:


根据条件更新步骤:


  1. 在对象中设置要更新的属性值。


  1. 设置QueryWrapper,设置更新条件,可以设置多个。


  1. 返回影响的记录数。


注意:只能将对象中不为NULL的属性更新到表中。


测试用例:下次将name等于“曹操”的记录全部更新。


    //根据条件进行更新
    @Test
    public void testUpdate2(){
        User user = new User();
        user.setAge(100);//要更新的值
        user.setPassword("12222");//要更新的值
        //设置条件
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("name","曹操");
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(user,queryWrapper);
        System.out.println(i);
    }


数据库更新结果:



根据条件更新(可以更新NULL)


上边根据id更新 根据条件更新的方法只能将对象中不为NULL的属性更新到表中,下边通过UpdateWrapper进行更新,将birthday字段更新为NULL。


    //根据条件进行更新,可以将为NULl的值更新到数据库
    @Test
    public void testUpdate3(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","曹操").set("birthday",null);
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(null,updateWrapper);
        System.out.println(i);
    }



还可以同时更新多个属性


    //根据条件进行更新,可以将为NULl的值更新到数据库
    @Test
    public void testUpdate4(){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","曹操").set("age", 999).set("birthday",null);
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(null,updateWrapper);
        System.out.println(i);
    }



删除操作


根据id删除


方法定义:


/**
*根 据 ID 删 除
*
*@param id 主键ID
*/
int deleteById(Serializable id);


删除步骤:


  1. 指定要删除记录的主键值。


  1. 调用deleteById方法执行删除。


测试用例:


@Test
public void testDeleteById() {
//执行删除操作
  int result = this.userMapper.deleteById(6L); 
  System.out.println("result = " + result);
}


根据 entity 条件删除


方法定义:


/**
*根据 entity 条件,删除记录
*
*@param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);


删除步骤:


根据条件删除步骤:


  1. 定义对象,设置属性值,指定删除条件 ,可指定多个删除条件注意:删除条件只匹配对象中不为NULL的属性值


  1. 设置QueryWrapper


  1. 执行删除


测试案例:


    @Test
    public void testDelete(){
        //设置条件
        User user = new User();
        user.setAge(999);
        user.setName("曹操1");
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>(user);
        //根据条件删除
        int delete = userMapper.delete(queryWrapper);
        System.out.println(delete);
    }


注意:定义QueryWrapper可以不包装模型对象,手动设置条件,如下:


    @Test
    public void testDelete(){
        //设置条件
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("age",999);
        queryWrapper.eq("name","曹操1");
        //根据条件删除
        int delete = userMapper.delete(queryWrapper);
        System.out.println(delete);
    }


上面两种写法是一样的,运行结果如下:



影响了一行,看一下数据库前后,确实删掉了:




根据ID 批量删除


方法定义:


/**
*删除(根据ID 批量删除)
*
*@param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);


删除步骤:


批量删除操作步骤:


  1. 指定 id列表


  1. 执行删除


测试案例:


删除id为101、102、103的


    //批量删除
    @Test
    public void testDelete2(){
        //根据条件删除
        int delete = userMapper.deleteBatchIds(Arrays.asList(101L,102L,103L));
        System.out.println(delete);
    }
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
安全 Linux 定位技术
Curl访问Kerberos SPNEGO保护的HTTP资源
最后,记住,虽然Kerberos的魔法强大且久经考验,但它仍需你谨慎掌握。SPNEGO的舞步看似复杂,但一旦跳起来,你会发现自己在安全和便捷的旋律中翩翩起舞。而Curl,这一灵活敏捷的小工具,它的确有能力成为你施展这些魔法的得力助手。
222 14
|
6月前
|
数据采集
美团外卖商家数据采集软件,提取电话号手机号评分地址,销量评价内容【autojs版】
这是一款基于AutoJS开发的美团外卖商家数据采集工具,可自动抓取商家名称、电话、评分、地址、月销量及评价内容等信息。支持多页滚动加载与详细数据采集
|
6月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
399 5
|
JavaScript API UED
Vue3使用触摸滑动插件(Swiper)
本文介绍如何在Vue2项目中使用Swiper插件实现触摸滑动功能,并封装了两种轮播图展示形式:首页轮播图(`type: banner`)和走马灯轮播图(`type: carousel`),以及信息展播模式(`type: broadcast`)。支持自定义轮播图片、区域尺寸、动画效果等属性。通过示例代码展示了不同切换动画及自定义效果,并提供了在线预览。适用于多种应用场景,提升用户体验。
881 1
Vue3使用触摸滑动插件(Swiper)
Vue3标签页(Tabs)
该组件提供可自定义的标签页功能,支持居中显示、不同尺寸与样式,并能设置当前激活选项。其主要属性包括标签页数组、居中显示、尺寸、样式、间隙及激活键值。示例展示了基本使用、卡片式标签页、禁用选项、左右滑动等功能。组件基于Vue3开发,并利用`useResizeObserver`等技术实现。[在线预览](https://themusecatcher.github.io/vue-amazing-ui/guide/components/tabs.html)。
920 0
Vue3标签页(Tabs)
|
Oracle Java iOS开发
JDK的选型、安装与配置
JDK的选型、安装与配置
360 1
|
XML Java 数据库连接
MyBatis-Plus
MyBatis-Plus
429 0
|
XML SQL 算法
【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门(下)
3.常见注解 在刚刚的入门案例中,我们仅仅引入了依赖,继承了BaseMapper就能使用MybatisPlus,非常简单。但是问题来了: MybatisPlus如何知道我们要查询的是哪张表?表中有哪些字段呢?
332 0
|
XML JSON Rust
go vet中的那些检测项(2)
go vet中的那些检测项(2)
428 0
|
SQL 算法 关系型数据库
(四)mybatisPlus中表的三种主键和列的两种映关系,使用“雪花算法“提供分布式主键使用方案
😄看本博客之前,建议先看 1️⃣Mybatis-plus(MP)中CRUD操作保姆级笔记 2️⃣mybatisPlus实现ActiveRecord(AR)操作笔记 3️⃣mybatisPlus自定义Sql语句 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
476 0
(四)mybatisPlus中表的三种主键和列的两种映关系,使用“雪花算法“提供分布式主键使用方案

热门文章

最新文章