MyBatisPlus ---- 基本CRUD

news2024/11/20 4:52:32

MyBatisPlus ---- 基本CRUD

  • 1. BaseMapper
  • 2. 插入
  • 3. 删除
    • a>通过id删除记录
    • b>通过id批量删除记录
    • c>通过map条件删除记录
  • 4. 修改
  • 5. 查询
    • a>根据id查询用户信息
    • b>根据多个id查询多个用户信息
    • c>通过map条件查询用户信息
    • d>查询所有数据
  • 6. 通用Service
    • a>IService
    • b>创建Service接口和实现类
    • c>测试查询记录
    • d>测试批量插入

1. BaseMapper

MyBatis-Plus 中的基本 CRUD 在内置的 BaseMapper 中都已得到了实现,我们可以直接使用,接口如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteById(T entity);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> queryWrapper);

    int deleteBatchIds(@Param("coll") Collection<?> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    default T selectOne(@Param("ew") Wrapper<T> queryWrapper) {
        List<T> ts = this.selectList(queryWrapper);
        if (CollectionUtils.isNotEmpty(ts)) {
            if (ts.size() != 1) {
                throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records", new Object[0]);
            } else {
                return ts.get(0);
            }
        } else {
            return null;
        }
    }

    default boolean exists(Wrapper<T> queryWrapper) {
        Long count = this.selectCount(queryWrapper);
        return null != count && count > 0L;
    }

    Long selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    <P extends IPage<T>> P selectPage(P page, @Param("ew") Wrapper<T> queryWrapper);

    <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param("ew") Wrapper<T> queryWrapper);
}

2. 插入

    @Test
    public void testInsert(){

        User user = new User();
        user.setId(null);
        user.setName("张三");
        user.setAge(23);
        user.setEmail("zhangsan@qq.com");
        int result = userMapper.insert(user);
        System.out.println("result:" + result);
        System.out.println("id:" + user.getId());

    }

不仅返回受影响的行数,也将自动生成的 id 赋值给了 user 对象 这里的 id不是自增生成的,是按照雪花算法生成的(雪花算法:一种随机数算法)

在这里插入图片描述
在这里插入图片描述

3. 删除

a>通过id删除记录

    @Test
    public void testDeleteById(){

        //通过id删除用户信息
        //DELETE FROM user WHERE id=?
        int result = userMapper.deleteById(1577302903974060034L);
        System.out.println(result);

    }

在这里插入图片描述

b>通过id批量删除记录

    @Test
    public void testDeleteBatchIds(){

        //通过多个id批量删除
        //DELETE FROM user WHERE id IN ( ? , ? , ? )
        List<Long> list = Arrays.asList(1L, 2L, 3l);
        int result = userMapper.deleteBatchIds(list);
        System.out.println(result);

    }

在这里插入图片描述

c>通过map条件删除记录

    @Test
    public void testDeleteByMap(){

        //根据map集合中所设置的条件删除记录
        //DELETE FROM user WHERE name = ? AND age = ?
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", 23);
        map.put("name", "张三");
        int result = userMapper.deleteByMap(map);
        System.out.println(result);

    }

在这里插入图片描述

map 中放的就是删除的条件

4. 修改

    @Test
    public void testUpdateById(){

        User user = new User();
        user.setId(4L);
        user.setName("admin");
        user.setAge(22);
        user.setEmail(null);
        //根据id修改用户信息
        //UPDATE user SET name=?, age=? WHERE id=?
        int result = userMapper.updateById(user);
        System.out.println(result);

    }

在这里插入图片描述

5. 查询

a>根据id查询用户信息

    @Test
    public void testSelectById(){

        //根据id查询用户信息
        //SELECT id,name,age,email FROM user WHERE id=?
        User user = userMapper.selectById(4L);
        System.out.println(user);

    }

在这里插入图片描述

b>根据多个id查询多个用户信息

    @Test
    public void testSelectBatchIds(){

        //根据多个id查询多个用户信息
        //SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
        List<Long> list = Arrays.asList(4L, 5L);
        List<User> users = userMapper.selectBatchIds(list);
        users.forEach(user -> System.out.println(user));

    }

在这里插入图片描述

c>通过map条件查询用户信息

    @Test
    public void testSelectByMap(){

        //通过map条件查询用户信息
        //SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", 22);
        map.put("name", "admin");
        List<User> users = userMapper.selectByMap(map);
        users.forEach(user -> System.out.println(user));

    }

在这里插入图片描述

d>查询所有数据

    @Test
    public void testSelectList(){

        //查询所有用户信息
        //SELECT id,name,age,email FROM user
        List<User> users = userMapper.selectList(null);
        users.forEach(user -> System.out.println(user));

    }

在这里插入图片描述

通过观察 BaseMapper 中的方法,大多方法中都有 Wrapper 类型的形参,此为条件构造器,可针对与 SQL 语句设置不同的条件,若没有条件,则可以为该形参赋值 null,即查询(删除/修改)所有数据

6. 通用Service

说明:

  • 通用 Service CRUD 封装 IService 接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 通过的基类

a>IService

MyBatis-Plus 中有一个接口 IService 和其实现类 ServiceImpl,封装了常见的业务层逻辑
详情查询源码 IService 和 ServiceImpl

在这里插入图片描述
在这里插入图片描述

b>创建Service接口和实现类

在这里插入图片描述

package com.fickler.mybatisplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.fickler.mybatisplus.pojo.User;

/**
 * @author dell
 * @version 1.0
 */
public interface UserService extends IService<User> {
}

package com.fickler.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fickler.mybatisplus.mapper.UserMapper;
import com.fickler.mybatisplus.pojo.User;
import com.fickler.mybatisplus.service.UserService;

/**
 * @author dell
 * @version 1.0
 */
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

c>测试查询记录

    @Test
    public void testGetCount(){

        long count = userService.count();
        System.out.println(count);

    }

在这里插入图片描述

d>测试批量插入

    @Test
    public void testSaveBatch(){

        //SQL长度有限制,海量数量插入单条SQL无法实现
        //因此MP将批量插入放在了通用Service实现,而不是通用Mapper
        ArrayList<User> users = new ArrayList<>();
        for (int i = 0; i < 5; i ++ ){
            User user = new User();
            user.setName("ybc" + i);
            user.setAge(20 + i);
            users.add(user);
        }
        //INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )
        userService.saveBatch(users);

    }

在这里插入图片描述

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

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

相关文章

RK3588平台开发系列讲解(Display篇)开机视频的设置

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、开机视频功能介绍二、使用方法2.1、开启与关闭2.2、视频放置位置2.3、编译结果2.4、视频素材要求2.5、参数控制说明沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台开机视频的使用方法…

ARM64内存虚拟化分析(7)stage2异常处理

当虚拟机访问内存或虚拟机访问寄存器时&#xff0c;由于并没有分配真实的物理地址&#xff0c;并没有建立stage2映射&#xff0c;因此这两种情况会产生stage2异常处理&#xff0c;其中第一种情况为真实的stage2缺页&#xff0c;第二种情况为MMIO处理。同时如果在stage2产生外部…

零膨胀负二项回归案例分析

零膨胀负二项回归分析 计数研究模型中&#xff0c;常用泊松回归模型&#xff0c;但泊松回归模型理论上是要求平均值与标准差相等&#xff0c;如果不满足&#xff0c;则可使用负二项回归模型&#xff0c;负二项回归放宽了平均值标准差这一理论假定。 在实际研究中&#xff0c;…

网络协议类型

网络协议是一组规则、约定和数据结构&#xff0c;用于规定设备如何跨网络交换数据。换句话说&#xff0c;网络协议可以等同于两个设备必须理解的语言&#xff0c;以实现信息的无缝通信&#xff0c;无论其基础设施和设计差异如何。 OSI 模型&#xff1a;网络协议的工作原理 要…

Oracle数据库安装配置详细教程汇总(含11g、12c、18c、19c、21c)

不论你是数据库小白&#xff0c;还是久经沙场的技术专家&#xff0c;你接触和运维Oracle数据库的第一步可能都是安装配置。并且随着软硬件的升级、替换以及业务场景的变化&#xff0c;数据库安装也将是你常常会进行的操作之一。 这里先为大家附上Oracle各版本支持的生命周期及…

阶段性回顾(2)

1. 移位操作符的对象只能是整数&#xff0c;只能对整数的二进制位进行移动。 2. 二进制是数值的一种表示形式。一个整数占了四个字节&#xff0c;相当于一个整数可以用32位二进制位序列表示&#xff0c;那么这时候该如何判断正负呢?规定&#xff1a;这32位二进制序列的头一位如…

第二十二讲:神州路由器OSPF单区域路由的配置

实验拓扑图如下所示 设备 端口 IP 子网掩码 网关 Router-A F0/0 172.16.1.1 255.255.255.0 无 F0/3 172.16.0.1 255.255.255.0 无 Router-B F0/0 172.16.1.2 255.255.255.0 无 F0/3 172.16.2.1 255.255.255.0 无 PC1 172.16.0.2 255.255.255.0 172.1…

解决docker容器因报错无法启动的问题,检查、修复容器错误并重启

问题复现 使用&#xff1a; sudo docker ps -a查看当前的docker容器&#xff1a; 我们想启动name为【docker-mongo】的这个容器&#xff0c;因此要执行 sudo docker start docker-mongo但是执行后仍旧没有重启&#xff0c;大概率是重启的时候报错了&#xff0c;查看日志&a…

Spring Boot骚操作-多数据源Service层封装

mysql, es, mongodb 三个数据源用配置文件方式连接&#xff0c;JPA只是正对dao做了封装&#xff0c;本文主要介绍如何对service层进行封装。 Spring Boot - 多个数据源Service层封装 类关系图 封装的一些配置 application.yml pom.xml 封装后使用 MySQL 动态数据访问 Mong…

坦克大战1.0,java时间处理机制

1.java 绘图坐标体系 1.1 坐标体系-介绍 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向,距离坐标原点y个像素。…

金融业务如何高性能传输数据

对系统要求高&#xff0c;通常按金融级标准设计。金融数据传输要求速度快&#xff0c;流量大&#xff0c;极强容灾。 案例分析 简化版券商算法交易平台对接交易所&#xff1a; 涉及场景多。既有事务数据&#xff0c;也有市场数据模型简单。只涉及到2个主体复杂度可选。连接交…

【结构型】装饰模式(Decorator)

目录装饰模式(Decorator)适用场景装饰模式实例代码&#xff08;Java&#xff09;装饰模式(Decorator) 动态地给一个对象添加一些额外的职责。就增加功能而言&#xff0c;装饰模式 (Decorator) 比生成子类更加灵活。 适用场景 在不影响其他对象的情况下&#xff0c;以动态、透…

2023让工作效率直线飞升

2022年马上就要过去&#xff0c;过去的一年&#xff0c;腾讯云HiFlow和众多腾讯系应用也帮助了许多企业完成数字化转型&#xff0c;许多没有代码基础的业务人员也能通过搭建工作流&#xff0c;高效的处理生活&工作的繁杂事务&#xff0c;时间精力节省50%。把时间花在更重要…

开源 | 携程机票跨端 Kotlin DSL 数据库框架 SQLlin

作者简介禹昂&#xff0c;携程机票移动端资深工程师&#xff0c;专注于 Kotlin 移动端跨平台领域&#xff0c;Kotlin 中文社区核心成员&#xff0c;图书《Kotlin 编程实践》译者。一、背景2022年9月 Kotlin 1.7.20 发布之后&#xff0c;Kotlin Multiplatform Mobile&#xff08…

【计算机图形学入门】笔记7:Shading着色1(光照与基本着色模型)

07Shading着色&#xff08;光照与基本着色模型&#xff09;1.深度缓冲Z-buffering1.画家算法&#xff1a;先把远处的东西画在屏幕上&#xff0c;再画近处的&#xff0c;从而近处物体覆盖远处物体。&#xff08;油画家&#xff09;2.深度缓冲2.Shading着色1.我们目前学了哪些知识…

CleanMyMacX2023系统清理优化工具使用评测

如果你的macbook有点年头空间不够开始卡顿了&#xff0c;或者你是windows用户刚转来的&#xff0c;我强烈建议你安装一个cleanmymac&#xff01;Mac电脑清理是可以直接使用储存空间管理&#xff08;关于本机->储存空间->管理&#xff09;来清理&#xff0c;但是这里的其他…

Android开发笔记(一百九十)增强了日志功能的第二版Logcat

从Android Studio Dolphin开始&#xff0c;查看应用日志的Logcat全面升级&#xff0c;堪称Logcat 2.0版本。下面就让我们看看LogcatV2.0究竟带来了什么新特性吧。 对于Android Studio的老用户来说&#xff0c;小海豚版本新出的LogcatV2.0在用法上有不小的差异&#xff0c;一开始…

Fisher卡方全流程汇总

Fisher卡方 卡方检验研究数据的独立性&#xff0c;在分析样本量较少&#xff08;比如小于40&#xff09;&#xff0c;也或者期望频数出现小于5时&#xff0c;此时使用fisher卡方检验较为适合。SPSSAU医学研究模块中的卡方检验时&#xff0c;有提供2*2即4表格时提供fisher卡方检…

魔方(14)133魔方、一阶鬼魔魔方、双心魔方

目录 133魔方 1&#xff0c;魔方三要素 2&#xff0c;复原方法 一阶鬼魔魔方 1&#xff0c;魔方三要素 2&#xff0c;复原方法 双心魔方 133魔方 1&#xff0c;魔方三要素 &#xff08;1&#xff09;组成部件 9个块&#xff0c;1个中心块&#xff0c;4个棱块&#xff…

ZYNQ - 以太网远程更新SD卡应用程序

写在前面 对于ZYNQ系列的板卡固化&#xff0c;可以通过JTAG接口&#xff0c;使用SDK固化到FLASH中&#xff0c;或者可将SD卡取出将SD卡中保存的固化工程进行修改&#xff0c;但在很多情况下&#xff0c;离线更新会很不方便&#xff0c;本文借鉴网上常见的远程更新QSPI FLASH的…