MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

CRUD

官方文档:https://baomidou.com/
(建议多看看官方文档,每种功能里面都有讲解)【本文章使用的mybatisplus版本为3.5.2】

条件构造器

一般都是用service层的方法,因为比mapper层的全。 十分重要:Wrapper 记住查看输出的SQL进行分析

相当于创建一个构造器对象,然后讲需要 查询or 更新的条件写在里面,最后打包给 mapperor service层的插入、更新方法

下图是 Wapper的子类, QueryWrapperUpdateWrapper是一般的Wrapper, AbstractLambdaWrapper是lambda语法糖的链式操作(两者选择一种使用即可)

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

下图是wrapper的条件方法,就不一一介绍了,下面举了六个就基本例子

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

1、测试一

@Test
public void testWrapper1() {
    //参数是一个wrapper ,条件构造器,和刚才的map对比学习!
    //查询name不为空,email不为空,age大于18的用户
    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper
        .isNotNull("name")
        .isNotNull("email")
        .ge("age",18);
    List userList = userMapper.selectList(wrapper);
    userList.forEach(System.out::println);
}

测试二

@Test
public void testWrapper2() {
    //查询name=wsk的用户
    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.eq("name","wsk");
    //查询一个数据selectOne,若查询出多个会报错
    //Expected one result (or null) to be returned by selectOne(), but found: *
    //若出现多个结果使用list或map
    User user = userMapper.selectOne(wrapper);//查询一个数据,若出现多个结果使用list或map
    System.out.println(user);
}

测试三

@Test
public void testWrapper3() {
    //查询age在10-20之间的用户
    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.between("age", 10, 20);//区间
    Integer count = userMapper.selectCount(wrapper);//输出查询的数量selectCount
    System.out.println(count);
}

测试四

@Test
public void testWrapper4() {
    //模糊查询
    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper
        .notLike("name","s")
        .likeRight("email","qq");//qq%  左和右?
    List> maps = userMapper.selectMaps(wrapper);
    maps.forEach(System.out::println);
}

测试五

@Test
public void testWrapper5() {
    //模糊查询
    // SELECT id,name,age,email,version,deleted,create_time,update_time
    //FROM user
    //WHERE deleted=0 AND id IN
    //(select id from user where id wrapper = new QueryWrapper<>();
    //id 在子查询中查出来
    wrapper.inSql("id","select id from user where id objects = userMapper.selectObjs(wrapper);
    objects.forEach(System.out::println);
}

测试六

@Test
public void testWrapper6() {
    QueryWrapper wrapper = new QueryWrapper<>();
    //通过id进行降序排序
    wrapper.orderByDesc("id");
    List userList = userMapper.selectList(wrapper);
    userList.forEach(System.out::println);
}

CRUD接口

基本配置:

0、创建数据库

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    version INT(10) NOT NULL DEFAULT 1 COMMIT '乐观锁版本号',
    DELETED INT(10) NOT NULL DEFAULT 0 COMMIT '逻辑删除',
    CREATE_TIME DATE COMMIT '创建时间',
    modify_time DATE COMMIT '更新时间',
    PRIMARY KEY (id)
);

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, '工藤新一','test1@baomidou.com'),
(2, '毛利兰','est2@baomidou.com'),
(3, '柯南', 28, 'test3@baomidou.com'),
(4, '灰原哀', 21, 'test4@baomidou.com'),
(5, '工藤有希子', 24, 'test5@baomidou.com');

1、创建项目,导入依赖


            org.springframework.boot
            spring-boot-starter-web

            org.springframework.boot
            spring-boot-starter-test
            test

            org.projectlombok
            lombok

            mysql
            mysql-connector-java
            8.0.26

            com.baomidou
            mybatis-plus-boot-starter
            3.5.2

2、yaml

#设置开发环境
spring:
  datasource:
    username: root
    password: 123456
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf

#配置日志  log-impl:日志实现
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    Long id;
    String name;
    int age;
    String email;
    @Version//乐观锁version注解
    private Integer version;
    private Integer isDelete;

    @TableField(fill = FieldFill.INSERT)
    private Date cTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date upTime;
}

4、写Mapper

@Repository
public interface UserMapper extends BaseMapper {

}

5、写Service接口和实现类

//Service接口
public interface UserService extends IService { //别忘了继承这个父类

}

//实现类
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {   //记得继承父类

}

6、之后就可以测试了

Mapper CRUD接口

顾名思义这个只有mapper层对象才有的方法

Insert

写数据库的时候id设置了主键自增的话,插入的时候不需要加入id,因为MP会自动添加并且自增的。
注:数据库写了id自增的话,在实体类设置主键生成策略是没用的,因为数据库设置了自增,数据库优先级高于代码

@Test//测试插入
public void insertTest(){
    User user = new User();
    user.setName("wsk");
    user.setAge(18);
    user.setEmail("2803708553@qq.com");
    Integer result = userMapper.insert(user); //会帮我们自动生成id
    System.out.println(result); //受影响的行数
    System.out.println(user); //通过日志发现id会自动回填(id是由雪花算法生成的,在主键生成策略部分有讲到)
}

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

数据库插入的id的默认值为:全局的唯—id

Update

@Test//测试更新
public void updateTest(){
    User user = new User();
    user.setId(2L);//怎么改id??
    //通过条件自动拼接动态Sql
    user.setName("root");
    user.setAge(12);
    user.setEmail("root@qq.com");
    int i = userMapper.updateById(user);//updateById,但是参数是个user
    System.out.println(i);
}

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

Select

  • 通过id查询单个用户
@Test//通过id查询单个用户
public void testSelectById(){
    User user = userMapper.selectById(1L);
    System.out.println(user);
}

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
  • 通过id查询多个用户
@Test//通过id查询多个用户
public void testSelectBatchIds(){
    List users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
    users.forEach(System.out::println);
    //System.out.println(users);
}

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
  • 条件查询 通过map封装
@Test//通过条件查询之一  map(这里的map,相当于where后面的 name="conan"等条件)
public void testMap(){
    HashMap map = new HashMap<>();
    //自定义要查询的
    map.put("name","www");  //查询名字是www的数据
    map.put("name","111");  //查询名字是111的数据   最后的结果是取两者交集
    map.put("age",18);
    List users = userMapper.selectByMap(map);
    users.forEach(System.out::println);
}

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

Delete

基本的删除任务:

MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
@Test
public void testDeleteById(){
    userMapper.deleteById(1359507762519068681L);
}
@Test
public void testDeleteBatchIds(){
  userMapper.deleteBatchIds(Arrays.asList(1359507762519068675L,1359507762519068676L));
}
@Test
public void testD(){
    HashMap map = new HashMap<>();
    map.put("age","18");
    map.put("name","lol");
    userMapper.deleteByMap(map);
}

Service CRUD接口

顾名思义这是Service层才有的方法

Save

为了区分mapper层和service层的方法,所以service层的插入方法取名为save

@Test
void test(){
    User user = new User();
    user.setName("Conan");
    user.setAge(18);
    user.setEmail("毛利侦探事务所");
    //插入单条数据
    userService.save(user);
    // 插入(批量)
    userService.saveBatch(Arrays.asList(user));
}

Remove

service层删除方法取名为remove

 @Test
    void test(){
        User user = new User();
        user.setName("Conan");
        user.setAge(18);
        user.setEmail("毛利侦探事务所");

        HashMap map = new HashMap<>();
        map.put("name","Conan");

        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("name","毛利小五郎");

        userService.remove(wrapper);    //根据条件构造器删除数据
        userService.removeById(16L);    //根据id删除数据,也可以根据实体类对象删除数据
        userService.removeByMap(map);   //根据map的条件删除记录
        userService.removeBatchByIds(Arrays.asList(user));  //批量删除
    }

Update

@Test
    void test(){
        User user = new User();
        user.setName("Conan");
        user.setAge(18);
        user.setEmail("毛利侦探事务所");

        HashMap map = new HashMap<>();
        map.put("name","Conan");

        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("name","毛利小五郎")
                .ge("age",18);

        userService.update(wrapper);    //根据条件构造器更新
        userService.updateById(user);   //根据传入的实体类id确定需要更新的数据,更新为传入的实体类对象
        userService.updateBatchById(Arrays.asList(user));   //批量更新
    }

Get

该方法只能查询一条数据,所以不推荐。查询用list方法

@Test
    void test(){
        User user = new User();
        user.setName("Conan");
        user.setAge(18);
        user.setEmail("毛利侦探事务所");

        HashMap map = new HashMap<>();
        map.put("name","Conan");

        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("name","毛利小五郎")
                .ge("age",18);

        userService.getById(12L);   //根据id查询一条数据
        userService.getMap(wrapper);    //根据构造器查询一条数据,返回Mapper集合
    }

List

查询多条数据

@Test
void test(){
    User user = new User();
    user.setName("Conan");
    user.setAge(18);
    user.setEmail("毛利侦探事务所");

    HashMap map = new HashMap<>();
    map.put("name","Conan");

    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.eq("name","毛利小五郎")
        .ge("age",18);

    userService.list(); //查询全部数据
    userService.listMaps(); //查询全部数据,以map形式返回
    userService.listByMap(map); //根据map查询数据
    userService.listByIds(Arrays.asList(10L,15L));   //根据id查询数据
}

SaveOrUpdate

运行逻辑:直接更新,更新0行的话;就select,查询出来是0行;则就插入

有传入id的情况会优先更新,如果更新不了,则会插入新的数据

记得在实体类写上@TableId!!!

@Test
void test(){
    User user = new User();
    user.setName("Conan");
    user.setAge(18);
    user.setEmail("毛利侦探事务所");

    HashMap map = new HashMap<>();
    map.put("name","Conan");

    UpdateWrapper wrapper = new UpdateWrapper<>();
    wrapper.eq("name","毛利小五郎")
        .ge("age",18);

    userService.saveOrUpdate(user); //传入的对象id存在则更新,否则插入新数据
    userService.saveOrUpdate(user,wrapper); //根据更新条件构造器,更细数据
    userService.saveOrUpdateBatch(Arrays.asList(user)); //批量修改插入
}

Count

统计符合条件的数据的数量

@Test
    void test(){
        User user = new User();
        user.setName("Conan");
        user.setAge(18);
        user.setEmail("毛利侦探事务所");

        HashMap map = new HashMap<>();
        map.put("name","Conan");

        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("name","毛利小五郎")
                .ge("age",18);

        userService.count();
        userService.count();
    }

Chain

链式调用,可以不用条件构造器完成 条件设置和增删改查。推荐!因为优雅!

Query
@Test
void test(){
    User user = new User();
    user.setName("Conan");
    user.setAge(18);
    user.setEmail("毛利侦探事务所");

    HashMap map = new HashMap<>();
    map.put("name","Conan");

    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.eq("name","毛利小五郎")
        .ge("age",18);

    List userList = userService.query()
        .eq("name", "工藤新一")
        .gt("age", 17)
        .list();
    for(User  user01: userList) {
        System.out.println(user);
    }
}
Update
@Test
void test(){
    User user = new User();
    user.setName("Conan");
    user.setAge(18);
    user.setEmail("毛利侦探事务所");

    HashMap map = new HashMap<>();
    map.put("name","Conan");

    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.eq("name","毛利小五郎")
        .ge("age",18);

    userService.update()
        .eq("name", "工藤新一")
        .gt("age", 17)
        .update();
}

Original: https://www.cnblogs.com/buchizicai/p/16607743.html
Author: 不吃紫菜
Title: MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578684/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • @EnableFeignClients注解源码解析

    转载请注明出处: @EnableFeignClients 注解定义的源码 这个注解通过@Import注解导入一个配置类FeignClientsRegistrar.class ;Fe…

    Linux 2023年6月14日
    096
  • .NET 6上的WebView2体验

    上次说为了不想在web端登录博客园,我想着还是继续使用 MarkWord编写博客,不过在使用的过程中,如果markdown文件的目录中有中文的话,Markdown预览就不能够显示粘…

    Linux 2023年6月6日
    0109
  • Linux 安装Apache2和PHP

    首先先更新系统 sudo apt update; sudo apt upgrade 然后下载Apache2和PHP主要程序以及它的插件 sudo apt install apach…

    Linux 2023年6月7日
    091
  • 正则表达式在grep中的使用

    GREP用法 grep "after" profile #查找文件内的包含after单词的行 grep -n "after" profile…

    Linux 2023年6月11日
    095
  • linux(Ubuntu)安装python

    提前安装一个依赖环境 (1)ubuntu/Debian: sudo apt-get install -y gcc make cmake build-essential libssl…

    Linux 2023年6月7日
    098
  • Nginx参数详解

    ​ 从配置文件到events之间的内容,主要会设置一些影响nginx服务器整体运行的配置命令。主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数…

    Linux 2023年6月11日
    095
  • 微信双开

    1、新建TXT文档 2、右击微信,点击属性,查看目标,复制目标路径 然后在txt文档写下如下内容 TASKKILL /F /IM wechat.exestart “&#…

    Linux 2023年6月13日
    084
  • Question03-查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

    * SELECT stu.SID, stu.Sname, CAST(AVG(sc.score) AS DECIMAL(18,2)) avg_score FROM Student s…

    Linux 2023年6月7日
    087
  • Ubuntu18上面一个非常有用的配置工具【gnome-tweaks】

    Ubuntu 18.04 LTS的Gnome桌面UI主打简约,但是相比前几个发行版本上的UI功能, 18.04默认的UI已经阉割掉了。其实 Ubuntu官方将我们上面所说的UI功能…

    Linux 2023年5月27日
    0106
  • [转帖]bash shell学习之变量

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    090
  • 个人超级计算机

    这篇文章是回答一位用户的问题。 问:站长,我是一个在读研究生,正在学习分布式计算、高性能集群计算方面的知识,Laxcus分布式操作系统也是我的学习模板之一,但是我发现,无论是编程开…

    Linux 2023年6月6日
    087
  • Linux 下统计文件夹下文件的数量

    1、查看当前目录下的文件数量(不包含子目录中的文件) 2、查看当前目录下的文件数量(包含子目录中的文件) 3、 查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上述理,如…

    Linux 2023年6月13日
    0102
  • Redis快速度特性及为什么支持多线程及应用场景

    转载请注明出处: 1.Redis 访问速度快特性 正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能;Redis使用了…

    Linux 2023年5月28日
    091
  • alpinelinux镜像安装中文字体

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 编辑dockerfile,先切换国内镜像源,默认alpinelinux是国外源,下载包会很慢 vim Dockerfile FR…

    Linux 2023年6月7日
    0106
  • MySQL的主从复制+双主模式

    部署环境: MySQL master 192.168.40.21 MySQL slave 192.168.40.22 思路: I/O线程是对主MySQL上二进制日志文件进行读取,读…

    Linux 2023年6月8日
    0104
  • Java刷题笔记7.25

    一个类构造方法的作用是什么? &#x4E3B;&#x8981;&#x662F;&#x5B8C;&#x6210;&#x5BF9;&am…

    Linux 2023年6月7日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球