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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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);
    }
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 缓存 Java
mybaits 面试题总结(上)
MyBatis 是一款半 ORM 框架,简化了 JDBC 的繁琐操作,让开发者专注于 SQL 语句编写。它支持 XML 或注解配置,能将 POJO 映射至数据库记录,提供动态 SQL 功能。相比 JDBC,它大幅减少冗余代码,提升数据库兼容性,并与 Spring 融合良好。
36 1
|
SQL Java 数据库连接
MyBatis框架搭建及教程(详解)下
MyBatis框架搭建及教程(详解)
|
SQL Java 数据库连接
MyBatis框架搭建及教程(详解)上
MyBatis框架搭建及教程(详解)
|
Java 关系型数据库 MySQL
MyBatis(简化数据库操作的持久层框架)--快速入门[上]
MyBatis(简化数据库操作的持久层框架)--快速入门[上]
95 0
|
6月前
|
SQL Java 数据库连接
JDBC如何封装成Mybaits持久层框架只需4
本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。
34 0
|
SQL XML Java
MyBatis框架搭建及教程(详解)中
MyBatis框架搭建及教程(详解)
|
数据库
Mybaits-plus
pom文件 连接数据库yaml代码 创建pojo类 分页查询
93 0
|
SQL XML Java
自定义持久层框架—MyORMFramework(一)
自定义持久层框架—MyORMFramework(一)
135 1
|
XML SQL Java
mybaits-plus学习笔记整合(上)
mybaits-plus学习笔记整合
157 0
mybaits-plus学习笔记整合(上)
|
测试技术 数据库
mybaits-plus学习笔记整合(下)
mybaits-plus学习笔记整合
178 0
mybaits-plus学习笔记整合(下)