MyBatisPlus基础操作之增删改查

news2024/9/24 7:16:31

目录

一、基本使用

1.1 插入数据

1.2 删除操作

1.3 更新操作

二、条件构造器Wrapper

2.1 常用AbstractWrapper方法

2.1.1 示例一

2.2.2 示例二

2.2.3 示例三

 2.2 常用QueryWrapper方法

2.2.1 示例一

2.2.2 示例二 

2.2.3 示例三(常用)

2.3 常用UpdateWrapper方法

2.3.1 示例一

三、 Lambda条件构造器

3.1 示例一

 四、实现自定义SQL

4.1 准备工作

 4.2 Mybatis方法


一、基本使用

下列涉及的User表如下所示:

1.1 插入数据

我们可以使用insert方法来实现数据的插入。

示例:

    @Test
    public void testInsert(){
        User user = new User();
        user.setUserName("fff33");
        user.setPassword("77888");
        int r = userMapper.insert(user);
        System.out.println(r);
    }

1.2 删除操作

我们可以使用deleteXXX方法来实现数据的删除。

示例:

    @Test
    public void testDelete(){
        List<Integer> ids = new ArrayList<>();
        ids.add(5);
        ids.add(6);
        ids.add(7);
        int i = userMapper.deleteBatchIds(ids);
        System.out.println(i);
    }
    @Test
    public void testDeleteById(){
        int i = userMapper.deleteById(8);
        System.out.println(i);
    }
    @Test
    public void testDeleteByMap(){
        Map<String, Object> map = new HashMap<>();
        map.put("name","提姆");
        map.put("age",22);
        int i = userMapper.deleteByMap(map);
        System.out.println(i);
    }

这里的deleteByMap实际执行的操作如下:

1.3 更新操作

我们可以使用updateXXX方法来实现数据的删除。

示例:

    @Test
    public void testUpdate(){
        //把id为2的用户的年龄改为14
        User user = new User();
        user.setId(2L);
        user.setAge(14);
        int i = userMapper.updateById(user);
        System.out.println(i);
    }

二、条件构造器Wrapper

概述 :我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 Wrapper 。使用它可以让我们非常方便的构造条件。 其继承体系如下:

在其子类 AbstractWrapper 中提供了很多用于构造Where条件的方法。 

AbstractWrapper 的子类 QueryWrapper 则额外提供了用于针对Select语法的 select 方法。可以用来设置查询哪些列。

AbstractWrapper 的子类 updateWrapper 则额外提供了用于针对Set语法的set方法。可以用来设置对哪些列进行更新。

2.1 常用AbstractWrapper方法

eq:equals,等于 =

gt:greater than ,大于 >

ge:greater than or equals,大于等于≥

lt:less than,小于<

le:less than or equals,小于等于≤

between:相当于SQL中的BETWEEN

like:模 糊匹配。like("name","黄"),相当于SQL的name like '%黄%'

likeRight:模糊匹配右半边。 likeRight("name","黄"),相当于SQL的name like '黄%'

likeLeft:模糊匹配左半边。 likeLeft("name","黄"),相当于SQL的name like '%黄'

and:SQL连接符AND

or:SQL连接符OR

in: in(“age",{1,2,3})相当于 age in(1,2,3)

groupBy: groupBy("id","name")相当于 group by id,name

orderByAsc :orderByAsc("id","name")相当于 order by id ASC,name ASC

orderByDesc :orderByDesc ("id","name")相当于 order by id DESC,name DESC

2.1.1 示例一

SQL语句如下:

SELECT 
    id,user_name,PASSWORD,NAME,age,address 
FROM 
    USER 
WHERE 
    age > 18 AND address = '狐山'

如果用Wrapper写法如下: 

 @Test
 public void testWrapper01(){
     QueryWrapper<User> wrapper = new QueryWrapper<>();
     wrapper.gt("age",18);
     wrapper.eq("address","狐山");
     List<User> users = userMapper.selectList(wrapper);
     System.out.println(users);
 }

我们可以通过调试来验证这一观点,调用wrapper的getCustomSqlSegment方法: 

2.2.2 示例二

SQL语句如下:

SELECT 
    id,user_name,PASSWORD,NAME,age,address 
FROM 
    USER 
WHERE 
    id IN(1,2,3) AND 
    age BETWEEN 12 AND 29 AND 
    address LIKE '%山%'

如果用Wrapper写法如下:

    @Test
    public void testWrapper02(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.in("id",1,2,3);
        wrapper.between("age",12,29);
        wrapper.like("address","山");
        List<User> users = userMapper.selectList(wrapper);
        System.out.println(users);
    }

2.2.3 示例三

SQL语句如下:

SELECT 
    id,user_name,PASSWORD,NAME,age,address 
FROM 
    USER 
WHERE 
    id IN(1,2,3) AND 
    age > 10 
    ORDER BY 
    age DESC

如果用Wrapper写法如下:

@Test
 public void testWrapper03(){
     QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.in("id",1,2,3);
     queryWrapper.gt("age",10);
     queryWrapper.orderByDesc("age");
     List<User> users = userMapper.selectList(queryWrapper);
     System.out.println(users);
 }

 2.2 常用QueryWrapper方法

QueryWrapper的 select 方法可以设置要查询的列。

2.2.1 示例一

select(String... sqlSelect) 方法的测试为要查询的列名

SQL语句如下:

SELECT 
    id,user_name
FROM 
    USER 

MP写法如下:

@Test
 public void testSelect01(){
     QueryWrapper<User> queryWrapper = new QueryWrapper<>();
     queryWrapper.select("id","user_name");
     List<User> users = userMapper.selectList(queryWrapper);
     System.out.println(users);
 }

2.2.2 示例二 

select(Class entityClass, Predicate predicate)

方法的第一个参数为实体类的字节码对象,第二个参数为Predicate类型,即函数式接口,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

SELECT 
    id,user_name
FROM 
    USER 

MP写法如下:

    @Test
    public void testSelect02(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select(User.class, new Predicate<TableFieldInfo>() {
            @Override
            public boolean test(TableFieldInfo tableFieldInfo) {
                return "user_name".equals(tableFieldInfo.getColumn());
            }
        });
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }

分析: 

第一次循环(id是默认有的,所以不参与):

第二次循环:

这个方法内部其实就是遍历数据库中相对应的User表,tableFieldInfo的column属性会通过循环的方式拿到每个表的属性,然后进行匹配,如果匹配结果为true,就返回这个属性所对应的结果。  

2.2.3 示例三(常用)

select(Predicate predicate)

方法第一个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

 SQL语句如下:

SELECT 
    id,user_name,PASSWORD,NAME,age 
FROM 
    USER

 就是不想查询address这列,其他列都查询了。

MP写法如下:

 @Test
    public void testSelect03(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(new User());
        queryWrapper.select(new Predicate<TableFieldInfo>() {
            @Override
            public boolean test(TableFieldInfo tableFieldInfo) {
                return !"address".equals(tableFieldInfo.getColumn());
            }
        });
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }

分析: 

这是由于这个select方法需要传递entity对象,没有传递无法调用。

2.3 常用UpdateWrapper方法

我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列及对应的值。但是如 果需要更新的列比较少时,创建这么一个对象显的有点麻烦和复杂。

我们可以使用UpdateWrapper的set方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper 去指定更复杂的更新条件。

2.3.1 示例一

SQL语句如下:

UPDATE 
    USER
SET 
    age = 99
where 
    id > 1

我们想把id大于1的用户的年龄修改为99,则可以使用如下写法:

@Test
 public void testUpdateWrapper(){
     UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
     updateWrapper.gt("id",1);
     updateWrapper.set("age",99);
     userMapper.update(null,updateWrapper);
 }

三、 Lambda条件构造器

我们前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法 性。

所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就 可以弥补上述缺陷。 

3.1 示例一

要执行的查询对应的SQL如下:

SELECT 
    id,user_name,PASSWORD,NAME,age,address 
FROM 
    USER 
WHERE 
    age > 18 AND address = '狐山'

 如果使用之前的条件构造器写法如下:

@Test
 public void testLambdaWrapper(){
     QueryWrapper<User> queryWrapper = new QueryWrapper();
     queryWrapper.gt("age",18);
     queryWrapper.eq("address","狐山");
     List<User> users = userMapper.selectList(queryWrapper);
 }

如果使用Lambda条件构造器写法如下:

@Test
 public void testLambdaWrapper2(){
     LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
     queryWrapper.gt(User::getAge,18);
     queryWrapper.eq(User::getAddress,"狐山");
     List<User> users = userMapper.selectList(queryWrapper);
 }

 四、实现自定义SQL

4.1 准备工作

 SQL文件:

CREATE TABLE `orders` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `price` int(11) DEFAULT NULL COMMENT '价格',
 `remark` varchar(100) DEFAULT NULL COMMENT '备注',
 `user_id` int(11) DEFAULT NULL COMMENT '用户id',
 `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
 `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
 `version` int(11) DEFAULT '1' COMMENT '版本',
 `del_flag` int(1) DEFAULT '0' COMMENT '逻辑删除标识,0-未删除,1-已删除',
 `create_by` varchar(100) DEFAULT NULL COMMENT '创建人',
 `update_by` varchar(100) DEFAULT NULL COMMENT '更新人',
 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `orders`(`id`,`price`,`remark`,`user_id`,`update_time`,`create_time`,`version`,`del_flag`,`create_by`,`update_by`) 
VALUES (1,2000,'无',2,'2021-08-24 21:02:43','2021-08-24 21:02:46',1,0,NULL,NULL),
       (2,3000,'无',3,'2021-08-24 21:03:32','2021-08-24 21:03:35',1,0,NULL,NULL),
       (3,4000,'无',2,'2021-08-24 21:03:39','2021-08-24 21:03:41',1,0,NULL,NULL);

创建实体类:

package com.fox.mp.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Orders  {
      private Long id;
      /**
      * 价格
      */
      private Integer price;
      /**
      * 备注
      */
      private String remark;
      /**
      * 用户id
      */
      private Integer userId;
      /**
      * 更新时间
      */
      private LocalDateTime updateTime;
      /**
      * 创建时间
      */
      private LocalDateTime createTime;
      /**
      * 版本
      */
      private Integer version;
      /**
      * 逻辑删除标识,0-未删除,1-已删除
      */
      private Integer delFlag;

 }

 4.2 Mybatis方法

定义方法

public interface UserMapper extends BaseMapper<User> {
    User findMyUser(Long id);
}

在Mapper接口中定义方法,这里没用@Mapper注解的原因是因为在启动类上设置了扫描组件: 

创建XML文件

 先在yml文件中配置xml文件的存放目录:

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml

创建对应的xml映射文件,这里我们是使用MybatisX这个插件快速生成对应的xml文件:

 在xml文件中书写对应的SQL语句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.fox.mp.mapper.UserMapper">

    <select id="findMyUser" resultType="com.fox.mp.domain.User">
        select * from tb_user where id = #{id}
    </select>
</mapper>

 

 

 

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

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

相关文章

PgSQL技术内幕 - case when表达式实现机制

PgSQL技术内幕 - case when表达式实现机制 CASE表达式如同 C语言中的if/else语句一样&#xff0c;为SQL添加了条件逻辑处理能力&#xff0c;可以根据不同条件返回不同结果。PgSQL支持两种语法&#xff1a;简单表达式和搜索表达式。 1、搜索表达式 语法如下&#xff1a; CASE WH…

android studio下开发flutter

文章目录 1. 配置环境 https://flutter.cn/docs/get-started/install2. android studio下开发flutter 1. 配置环境 https://flutter.cn/docs/get-started/install 2. android studio下开发flutter 打开Android Studio -> File -> Settings -> Plugins 搜索Dart插件 …

java_error_in_pycharm.hprof文件是什么?能删除吗?

java_error_in_pycharm.hprof文件是什么&#xff1f;能删除吗&#xff1f; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;hprof格式文件介绍&#x1f333;&#x1f333;java_error_in_pycharm.hprof文件什么情况下能删除&#x1f333;&…

简化版SpringMVC

简化版SpringMVC web.xml xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&quo…

科技王座“座次变更”:英伟达超越亚马逊在即,距离谷歌也不远

英伟达的市值即将超过亚马逊&#xff0c;为二十年来首次。 截至2月7日收盘&#xff0c;英伟达市值达到1.73万亿美元&#xff0c;逼近亚马逊1.77万亿美元的市值&#xff0c;距离谷歌1.82万亿美元的市值也不远。 对人工智能的热情推升英伟达的股价去年以来一路飙涨&#xff0c;受…

【开源】基于JAVA+Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

nginx登录用户验证配置

我们的nginx端口一般都是对外开放的&#xff0c;所以有一定程度上有被别人扫描的风险&#xff0c;所以为了减少被扫描的风险&#xff0c;我们可以配置一个nginx的用户登录验证&#xff1b; 用户验证登录需要nginx的一个模块&#xff1a;ngx_http_auth_basic_module 我们使用…

MySQL 时间索引的选择

背景 MySQL 在使用过程中经常会对时间加索引&#xff0c;方便进行时间范围的查询&#xff0c;常见的时间类型有 data、datetime、long、timestamp 等&#xff0c;在此分析下这几种时间类型的索引大小&#xff0c;以找到比较合适的时间类型。 时间类型对比 常用的索引类型是 …

SolidWorks学习笔记——入门知识2

目录 建出第一个模型 1、建立草图 2、选取中心线 3、草图绘制 4、拉伸 特征的显示与隐藏 改变特征名称 5、外观 6、渲染 建出第一个模型 1、建立草图 图1 建立草图 按需要选择基准面。 2、选取中心线 图2 选取中心线 3、草图绘制 以对称图形举例&#xff0c;先画出…

市场复盘总结 20240207

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 75% 最常用…

优化 IT 支出和消除浪费的 8 种主要方法

不懈追求最佳 IT 支出对于任何组织的长期可持续发展和成功都至关重要。在这个技术快速进步的时代&#xff0c;您必须做出明智的决策&#xff0c;消除浪费&#xff0c;同时最大限度地提高技术投资的价值。 从进行 IT 成本分析到采用敏捷预算和技术标准化&#xff0c;这些策略对…

算法学习——LeetCode力扣链表篇2

算法学习——LeetCode力扣链表篇2 24. 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&…

C语言特殊指针

1 野指针 概念&#xff1a;指向一块未知区域的指针&#xff0c;被称为野指针。野指针是危险的。 危害&#xff1a; 引用野指针&#xff0c;相当于访问了非法的内存&#xff0c;常常会导致段错误&#xff08;segmentation fault&#xff09;引用野指针&#xff0c;可能会破坏系…

CRNN介绍:用于识别图中文本的深度学习模型

CRNN&#xff1a;用于识别图中文本的深度学习模型 CRNN介绍&#xff1a;用于识别图中文本的深度学习模型CRNN的结构组成部分工作原理 CRNN结构分析卷积层&#xff08;Convolutional Layers&#xff09;递归层&#xff08;Recurrent Layers&#xff09;转录层&#xff08;Transc…

day7(2024/2/8)

mainui.h(第二个界面) #ifndef MAINUI_H #define MAINUI_H#include <QWidget>namespace Ui { class MainUi; }class MainUi : public QWidget {Q_OBJECTpublic:explicit MainUi(QWidget *parent nullptr);~MainUi();public slots:void main_ui();private:Ui::MainUi *u…

【Godot4.2】文件系统自定义控件 - FileSystemTree

FileSystemTree B站【Godot4.2】文件系统自定义节点 - FileSystemTree 概述 在Godot设计编辑器插件或应用程序时&#xff0c;可能需要涉及文件系统的显示&#xff0c;比如文件夹或文件的树形列表。 我们可以用Godot的Tree控件快速书写相应的功能&#xff0c;但是为了复用到…

如何内网映射到外网访问?

内网映射到外网访问是一种常见的网络技术&#xff0c;它允许内部网络的资源通过公网进行访问。在某些情况下&#xff0c;我们可能想要访问内部服务器或设备&#xff0c;但由于网络环境的限制&#xff0c;无法直接通过公网访问。此时&#xff0c;内网映射就成为一种解决方案。 天…

Unity BuffSystem buff系统

Unity BuffSystem buff系统 一、介绍二、buff系统架构三、架构讲解四、框架使用buff数据Json数据以及工具ShowTypeBuffTypeMountTypeBuffOverlapBuffShutDownTypeBuffCalculateType时间和层数这里也不过多说明了如何给生物添加buff 五、总结 一、介绍 现在基本做游戏都会需要些…

开源项目的三年,我的项目经历了哪些变化?

0.前言 自己一个项目写了三年&#xff0c;到底写了什么东西了&#xff0c;这个项目经历了哪些变化呢&#xff1f;其中的心路历程如何&#xff1f; 兄弟们&#xff0c;要是感觉我的项目有价值&#xff0c;去b站给俺点点关注呐。我更新的更快。点击下面的了解就可以跳转去b站。…

电路设计(14)——奥运纪念日显示装置的proteus仿真

1.设计要求 北京奥运于2008年8月8日开幕&#xff0c;假设倒计时还剩69天&#xff0c;请你&#xff0c;制作一个电子作品&#xff0c;用以显示上述意思 采用三个数码管&#xff0c;其中一个数码管反复显示2008 8.8&#xff1b;该数码管下方并排放置另两个数码管&#xff0c;这二…