当前位置: 首页 > article >正文

MyBatis-Plus之BaseMapper

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

/*
 * Copyright (c) 2011-2022, baomidou (jobob@qq.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
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.Constants;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/*

               :`
                    .:,
                     :::,,.
             ::      `::::::
             ::`    `,:,` .:`
             `:: `::::::::.:`      `:';,`
              ::::,     .:::`   `@++++++++:
               ``        :::`  @+++++++++++#
                         :::, #++++++++++++++`
                 ,:      `::::::;'##++++++++++
                 .@#@;`   ::::::::::::::::::::;
                  #@####@, :::::::::::::::+#;::.
                  @@######+@:::::::::::::.  #@:;
           ,      @@########':::::::::::: .#''':`
           ;##@@@+:##########@::::::::::: @#;.,:.
            #@@@######++++#####'::::::::: .##+,:#`
            @@@@@#####+++++'#####+::::::::` ,`::@#:`
            `@@@@#####++++++'#####+#':::::::::::@.
             @@@@######+++++''#######+##';::::;':,`
              @@@@#####+++++'''#######++++++++++`
               #@@#####++++++''########++++++++'
               `#@######+++++''+########+++++++;
                `@@#####+++++''##########++++++,
                 @@######+++++'##########+++++#`
                @@@@#####+++++############++++;
              ;#@@@@@####++++##############+++,
             @@@@@@@@@@@###@###############++'
           @#@@@@@@@@@@@@###################+:
        `@#@@@@@@@@@@@@@@###################'`
      :@#@@@@@@@@@@@@@@@@@##################,
      ,@@@@@@@@@@@@@@@@@@@@################;
       ,#@@@@@@@@@@@@@@@@@@@##############+`
        .#@@@@@@@@@@@@@@@@@@#############@,
          @@@@@@@@@@@@@@@@@@@###########@,
           :#@@@@@@@@@@@@@@@@##########@,
            `##@@@@@@@@@@@@@@@########+,
              `+@@@@@@@@@@@@@@@#####@:`
                `:@@@@@@@@@@@@@@##@;.
                   `,'@@@@##@@@+;,`
                        ``...``

 _ _     /_ _ _/_. ____  /    _
/ / //_//_//_|/ /_\  /_///_/_\      Talk is cheap. Show me the code.
     _/             /
 */

/**
 * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
 * <p>这个 Mapper 支持 id 泛型</p>
 *
 * @author hubin
 * @since 2016-01-23
 */
public interface BaseMapper<T> extends Mapper<T> {

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

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

    /**
     * 根据实体(ID)删除
     *
     * @param entity 实体对象
     * @since 3.4.4
     */
    int deleteById(T entity);

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

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

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

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

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,查询一条记录
     * <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    default T selectOne(@Param(Constants.WRAPPER) 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");
            }
            return ts.get(0);
        }
        return null;
    }

    /**
     * 根据 Wrapper 条件,判断是否存在记录
     *
     * @param queryWrapper 实体对象封装操作类
     * @return
     */
    default boolean exists(Wrapper<T> queryWrapper) {
        Long count = this.selectCount(queryWrapper);
        return null != count && count > 0;
    }

    /**
     * 根据 Wrapper 条件,查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     */
    <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

一、插入一条记录

/*
* 插入一条记录
* */
@Test
public void insert(){
    User user=new User(null, "王五", 18, "234@qq.com");
    int result=userMapper.insert(user);
    //INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
    System.out.println("受影响行数:"+result);
    //受影响行数:1
    System.out.println("id自动获取:"+user.getId());
    //id自动获取:1585451009
}

在这里插入图片描述

在这里插入图片描述

最终执行的结果,所获取的id为:1585451009

这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id(可以在application.yml配置文件里改)

二、删除

1.根据id删除(主键)

/*
* 根据id删除
* */
@Test
public void delete(){
    //DELETE FROM user WHERE id=?
    int result=userMapper.deleteById(1522577409);
    System.out.println("受影响行数:"+result);
}

在这里插入图片描述

在这里插入图片描述

2.根据实体(id)删除

/*
* 根据实体(ID)删除
* */
@Test
public void delete2(){
    User user=new User();
    user.setId(2084577282);
    //DELETE FROM user WHERE id=?
    int result=userMapper.deleteById(user);
    System.out.println("受影响行数:"+result);
}

先插一条再删,id是2084577282

在这里插入图片描述

3.根据 columnMap 条件,删除记录

在这里插入图片描述

/*
* 根据 columnMap 条件,删除记录
* */
@Test
public void testDeleteByMap(){
    //根据map集合中所设置的条件删除记录
    //DELETE FROM user WHERE name = ? AND age = ?
    Map<String, Object> map = new HashMap<>();
    map.put("age", 23);
    map.put("name", "张三");
    int result = userMapper.deleteByMap(map);
    System.out.println("受影响行数:"+result);
}

在这里插入图片描述

在这里插入图片描述

4.根据 entity 条件,删除记录(QueryWrapper)

在这里插入图片描述

/*
* 根据 entity 条件,删除记录
* queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
* */
@Test
public void testDelete(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","李四"); //等于
    int rows = userMapper.delete(queryWrapper);
    System.out.println("影响的行数: "+rows);
}

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

5.删除(根据ID或实体 批量删除)

在这里插入图片描述

/*
* 删除(根据ID或实体 批量删除)
* */
@Test
public void testDeleteBatchIds(){
    //根据id批量删除
    //DELETE FROM user WHERE id IN ( ? , ? , ? )
    List<Integer> ids = Arrays.asList(6, 7);
    int result = userMapper.deleteBatchIds(ids);
    System.out.println("受影响行数:"+result);
}

在这里插入图片描述

三、修改

1.根据id修改

在这里插入图片描述

/*
* 根据 ID 修改
* */
@Test
public void testUpdateById(){
    User user=new User();
    user.setId(6);
    user.setName("李四");
    //UPDATE user SET name=? WHERE id=?
    int result=userMapper.updateById(user);
    System.out.println("受影响行数:"+result);
}

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

2.根据 whereEntity 条件,更新记录(updateWrapper)

/*
* 根据 whereEntity 条件,更新记录
* updateWrapper
* */
@Test
public void testUpdate(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("id", 6).set("age", 2);//用set的方式写,不用再创建实体类了,下面就是null
    //UPDATE user SET age=? WHERE (id = ?)
    int result=userMapper.update(null, updateWrapper);
    System.out.println("受影响行数:"+result);
}

四、查询

1.根据id查询

/*
* 根据id查询
* */
@Test
public void testSelectById(){
    User user=userMapper.selectById(6);
    //SELECT id,name,age,email FROM user WHERE id=?
    System.out.println(user);
    //User(id=6, name=李四, age=2, email=123@qq.com)
}

2.根据id批量查询

/*
* 根据id批量查询
* */
@Test
public void testSelectBatchIds(){
    List<Integer> ids = Arrays.asList(6, 7);
    List<User> users = userMapper.selectBatchIds(ids);
    //SELECT id,name,age,email FROM user WHERE id IN ( ? , ? )
    users.forEach(System.out::println);
   /* User(id=6, name=李四, age=2, email=123@qq.com)
    User(id=7, name=张三, age=10, email=123@qq.com)*/
}

3.通过map条件查询

/*
* 查询(根据 columnMap 条件)
* map
* */
@Test
public void testSelectByMap(){
    Map<String, Object> map = new HashMap<>();
    map.put("age", 2);
    map.put("name", "李四");
    //SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
    List<User> list = userMapper.selectByMap(map);
    list.forEach(System.out::println);
    //User(id=6, name=李四, age=2, email=123@qq.com)
}

4.根据 entity 条件,查询一条记录(queryWrapper)

/*
* 根据 entity 条件,查询一条记录
* queryWrapper
* */
@Test
public void testSelectOne(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","李四").lt("age", 5); //eq:等于  lt:<
    //SELECT id,name,age,email FROM user WHERE (name = ? AND age < ?)
    User user = userMapper.selectOne(queryWrapper);
    //User(id=6, name=李四, age=2, email=123@qq.com)
    System.out.println(user);
}

5.根据wrapper条件,判断是否存在记录

/*
* 根据 Wrapper 条件,判断是否存在记录
* */
@Test
public void testExist(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","李四").lt("age", 5); //eq:等于  lt:<
    //SELECT COUNT( * ) FROM user WHERE (name = ? AND age < ?)
    boolean result = userMapper.exists(queryWrapper);
    System.out.println("是否存在:"+result);
    //是否存在:true
}

6.根据wrapper条件,查询总记录数

/*
* 根据 Wrapper 条件,查询总记录数
* */
@Test
public void testCount(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.le("age", 20); //le:<=小于等于
    //SELECT COUNT( * ) FROM user WHERE (age <= ?)
    Long result = userMapper.selectCount(queryWrapper);
    System.out.println("总记录数:"+result);
    //总记录数:3
}

7.根据 entity 条件,查询全部记录

/*
* 根据 entity 条件,查询全部记录
* 第一个测试也是,只不过没有条件,所以写的null
* */
@Test
public void testSelectList1() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.le("age", 20);//le:<=小于等于
    //SELECT id,name,age,email FROM user WHERE (age <= ?)
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

8.根据wrapper条件,查询全部记录(List<Map<>>)

/*
* 16.根据 Wrapper 条件,查询全部记录
* List<Map<>>
* */
@Test
public void testSelectList2() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.le("age", 20).like("name", "J");//le:<=小于等于
    //SELECT id,name,age,email FROM user WHERE (age <= ? AND name LIKE ?)
    List<Map<String, Object>> list = userMapper.selectMaps(queryWrapper);
    //list.forEach(System.out::println);
    System.out.println(list);
    //[{name=Jone, id=1, age=18, email=test1@baomidou.com}, {name=Jack, id=2, age=20, email=test2@baomidou.com}]
}

9.根据wrapper条件,查询全部记录

只返回第一个字段的值

/*
* 根据 Wrapper 条件,查询全部记录
* 只返回第一个字段的值
* */
@Test
public void testSelectList3() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.le("age", 20).like("name", "J");//le:<=小于等于
    //SELECT id,name,age,email FROM user WHERE (age <= ? AND name LIKE ?)
    List<Object> list = userMapper.selectObjs(queryWrapper);
    list.forEach(System.out::println);
    //1
    //2(1   2是id值,因为只返回第一个字段的值,第一个字段是id)
}

http://www.kler.cn/a/516537.html

相关文章:

  • STM32_SD卡的SDIO通信_基础读写
  • “腾讯、钉钉、飞书” 会议开源平替,免费功能强大
  • 除了基本的事件绑定,鸿蒙的ArkUI
  • MySQL训练营-慢查询诊断问题
  • 【2024年华为OD机试】(A卷,200分)- 优雅子数组 (JavaScriptJava PythonC/C++)
  • Lsky-Pro在线图片搭建教程(Docker部署方式)
  • 关于为什么java中nextInt()和nextLine()不能混用 | nextInt()和nextInt()之类的可以一起用
  • 设计模式Python版 简单工厂模式
  • OpenEuler学习笔记(十):用OpenEuler搭建web服务器
  • 【MCU】DFU、IAP、OTA
  • cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】
  • Mac 查看 Java SDK 和 Android SDK 的路径
  • 输入网址到网页显示,发生了什么--讲述
  • linux静态库+嵌套makefile
  • 【深度学习】 自动微分
  • python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算
  • Caesar
  • 【java】IP来源提取国家地址
  • PHP校园助手系统小程序
  • React 前端框架开发详细操作
  • 【AIGC提示词系统】赛博朋克·韵律:一个融合科技与艺术的对话系统设计
  • 如何构建一个简单的React应用?
  • 202009 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • 使用qwen作为基座训练分类大模型
  • JAVA EE
  • 概率论里的特征函数,如何用卷积定理去理解