MyBatis-Plus基本操作

news2024/11/27 17:49:17

依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>

基础操作

DAO层

public interface UserMapper extends BaseMapper<User> {
}

注解

@TableName 找到数据库中对应的表

@TableId 表示为主键(type可以设置自增长,默认雪花算法)

@TableField 表示非主键字段

  • 字段和属性名不同时使用(驼峰无需使用)
  • bean中的属性在表中没有对应字段时 exist=false
  • 不想某个字段被查出 select = false
@TableName("sys_user")
public class User {
    @TableId(type = IdType.AUTO)  
    private Long id;
    @TableField
    private String name;
    @TableField(select = false)
    private Integer age;
    
    @TableField(value = "email")
    private String mail;
    
    @TableField(exist = false)
    private String address;
}

CRUD操作

image-20230116161049223

插入

@Test
public void testInsert() {
    User user = new User();
    user.setName("qiuyu");
    user.setAge(18);
    user.setMail("66");
    
    int i = userDao.insert(user);
    System.out.println(i);
}

如果要id自增记得给id加上@TableId(type = IdType.AUTO)

更新

UpdateById

根据传入的对象的ID属性来修改

@Test
public void testUpdatebyId() {
    User user = new User();
    user.setId(6L);
    user.setName("qiuyu666");
    user.setAge(99);
    user.setMail("77");
    userDao.updateById(user);

}

Update

条件更新,使用QueryWrapper

@Test
    public void testUpdate() {
        User user = new User();
        user.setName("qiuyu666");
        user.setAge(99);
        user.setMail("77");

        //建立一个条件
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //如果表中的id = 7
        queryWrapper.eq("id", 7L);
        //把对象放入表中
        userDao.update(user,queryWrapper);
    }

或者使用UpdateWrapper,不传入对象,直接set要改的属性

@Test
    public void testUpdate2() {
        //建立一个条件
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        //如果表中的id = 7,直接改
        updateWrapper
                .eq("id", 7L)
                .set("name","qiuyu9999");
        //执行修改
        userDao.update(null,updateWrapper);
    }
}

删除

deleteById

@Test
public void testDeleteById() {
    userDao.deleteById(9);
}

deleteByMap

多条件删除 须同时满足多个条件

@Test
public void testDeleteByMap() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("name", "qiuyu");
    map.put("age", 18);
    userDao.deleteByMap(map);
}

delete

条件删除,满足条件的全删了

//方法一 eq填的不是属性名而是表中的字段名
@Test
public void testDelete() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "qiuyu")
            .eq("age",18);
    userDao.delete(queryWrapper);
}

//方法二(推荐,无需写字段名)
@Test
public void testDelete2() {
    User user = new User();
    user.setAge(88);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
   
    userDao.delete(queryWrapper);
}

deleteBatchIds

@Test
public void testDeleteBatch() {
    userDao.deleteBatchIds(Arrays.asList(7,14));
}

查询

selectById

@Test
public void testSelectById() {
    User user = userDao.selectById(1);
    System.out.println(user);
}

selectBatchIds

批量按ID查询

@Test
public void testSelectBatch() {
    List<User> users = userDao.selectBatchIds(Arrays.asList(1, 2, 3));
    users.forEach(System.out::println);
}

selectOne 查一条

根据条件查询一条数据,如果结果超过一条会报错

@Test
public void testSelectOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","qiuyu666");
    User user = userDao.selectOne(queryWrapper);
    System.out.println(user);
}

selectList 查询多条

@Test
public void testSelectList() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","qiuyu666");
    List<User> users = userDao.selectList(queryWrapper);
    users.forEach(System.out::println);
}

selectCount 查询条数

@Test
public void testSelectCount() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","qiuyu666");
    Integer integer = userDao.selectCount(queryWrapper);
    System.out.println(integer);
}

分页查询

配置

配置了才能使用分页功能

package com.qiuyu.config;

@Configuration
public class MPConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

查询

@Test
public void testSelectPage() {
    IPage<User> page = new Page(2,3);
    
    QueryWrapper queryWrapper = new QueryWrapper();
    queryWrapper.like("name", "qiu");
    
    userDao.selectPage(page, queryWrapper);

    System.out.println(page.getPages()); //总页数
    System.out.println(page.getTotal()); //总数据条数
    System.out.println(page.getSize()); // 每页数量
    System.out.println(page.getCurrent()); //当前页
    
    //查出的数据
        for (User record : page.getRecords()) {
            System.out.println(record);
        }

}

配置

常用

mybatis-plus:
  mapper-locations: "classpath*:/mapper/**/*.xml" #加载mapper
  type-aliases-package: "com.qiuyu.bean" #别名
  configuration:
    use-generated-keys: true  
    map-underscore-to-camel-case: true  #驼峰映射
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #日志
  global-config:
    db-config:
      id-type: auto #id自增

基础配置

configLocation

导入mybatis的配置文件

mybatis-plus:
	config-location: classpath:mybatis-config.xml

mapperLocations

配置mapper对应的xml文件所在的位置

mybatis-plus:
	mapper-locations: "classpath*:/mapper/**/*.xml" #加载mapper

Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)

typeAliasesPackage

MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使
用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。

mybatis-plus:
	type-aliases-package: "com.qiuyu.bean" #别名

configuration配置

map-underscore-to-camel-case

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属
性名 aColumn(驼峰命名) 的类似映射。

注意:
此属性在 MyBatis 中原默认值为 false,在 MyBatis-Plus 中,此属性也将用于生成最终的 SQL 的 select body
如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名

mybatis-plus:
  	configuration:
    	map-underscore-to-camel-case: true  #驼峰映射

log

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

DB策略

idType

全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置。

mybatis-plus:
	global-config:
  		db-config:
    		id-type: auto

tablePrefix

表名前缀,全局配置后可省略@TableName()配置。

mybatis-plus:
	global-config:
    	db-config:
      		table-prefix: _tb

条件构造器Wrapper

image-20230116164614911

AllEq

//按照条件查询,如果map中有null,数据库中的值也得是null
allEq(BiPredicate<R, V> filter, Map<R, V> params)
//按照条件查询,如果map中有null,会忽略这个字段
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)

allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
@Test
public void testWrapper() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //设置条件
    Map<String,Object> params = new HashMap<>();
    params.put("name", "曹操");
    params.put("age", "20");
    params.put("password", null);
    
    //SELECT * FROM tb_user WHERE password IS NULL AND name = ? AND age = ?
    wrapper.allEq(params);
    
    //SELECT * FROM tb_user WHERE name = ? AND age = ?
    wrapper.allEq(params,false);
    
    //SELECT * FROM tb_user WHERE name = ? AND age = ?
    wrapper.allEq((k, v) -> (k.equals("name") || k.equals("age")), params);
    
    List<User> users = this.userMapper.selectList(wrapper);
    for (User user : users) {
    	System.out.println(user);
    }
}

基本比较

  • eq
    等于 =
  • ne
    不等于 <>
  • gt
    大于 >
  • ge
    大于等于 >=
  • lt
    小于 <
  • le
    小于等于 <=
  • between
    BETWEEN 值1 AND 值2
  • notBetween
    NOT BETWEEN 值1 AND 值2
  • in
    字段 IN (value.get(0), value.get(1), …)
  • notIn
    字段 NOT IN (v0, v1, …)
@Test
public void testEq() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //SELECT id,user_name,password,name,age,email FROM tb_user WHERE password = ? AND age >= ? AND name IN (?,?,?)
    wrapper.eq("password", "123456")
        .ge("age", 20)
        .in("name", "李四", "王五", "赵六");
    List<User> users = this.userMapper.selectList(wrapper);
    
    for (User user : users) {
    	System.out.println(user);
    }
}

模糊查询

  • like

    • LIKE ‘%值%’
    • 例: like(“name”, “王”) —> name like ‘%王%’
  • notLike

    • NOT LIKE ‘%值%’
    • 例: notLike(“name”, “王”) —> name not like ‘%王%’
  • likeLeft

    • LIKE ‘%值’
    • 例: likeLeft(“name”, “王”) —> name like ‘%王’
  • likeRight

    • LIKE ‘值%’
    • 例: likeRight(“name”, “王”) —> name like ‘王%’
@Test
public void testWrapper() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name LIKE ?
    //Parameters: %曹%(String)
    wrapper.like("name", "曹");
    List<User> users = this.userMapper.selectList(wrapper);
    for (User user : users) {
    	System.out.println(user);
    }
}

排序

  • orderBy

    • 排序:ORDER BY 字段, …

    • 例: orderBy(true, true, “id”, “name”) —> order by id ASC,name ASC

  • orderByAsc

    • 排序:ORDER BY 字段, … ASC
    • 例: orderByAsc(“id”, “name”) —> order by id ASC,name ASC
  • orderByDesc

    • 排序:ORDER BY 字段, … DESC
    • 例: orderByDesc(“id”, “name”) —> order by id DESC,name DESC
@Test
public void testWrapper() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //SELECT id,user_name,password,name,age,email FROM tb_user ORDER BY age DESC
    wrapper.orderByDesc("age");
    List<User> users = this.userMapper.selectList(wrapper);
    for (User user : users) {
    	System.out.println(user);
    }
}

逻辑查询

  • or

    • 拼接 OR
    • 主动调用or 表示紧接着下一个方法不是用and 连接!(不调用or 则默认为使用and 连接)
  • and

    • AND 嵌套
    • 例: and(i -> i.eq(“name”, “李白”).ne(“status”, “活着”)) —> and (name = ‘李白’ and status<> ‘活着’)
@Test
public void testWrapper() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //SELECT id,user_name,password,name,age,email FROM tb_user WHERE name = ? OR
    age = ?
    wrapper.eq("name","李四").or().eq("age", 24);
    List<User> users = this.userMapper.selectList(wrapper);
    for (User user : users) {
        System.out.println(user);
    }
}

查询指定字段

在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。

@Test
public void testWrapper() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //SELECT id,name,age FROM tb_user WHERE name = ? OR age = ?
    wrapper.eq("name", "李四")
        .or()
        .eq("age", 24)
        .select("id", "name", "age");
    List<User> users = this.userMapper.selectList(wrapper);
    for (User user : users) {
    	System.out.println(user);
    }
}

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

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

相关文章

nohup + 命令实现后台不挂断地运行程序

nohup&#xff1a; nohup&#xff1a;不挂断地运行程序&#xff0c;就是即便关闭终端的窗口&#xff0c;程序还会继续执行。 $ nohup python merge_reasons.py可以看到终端仍在被占用&#xff0c;同级目录下生成了一个nohup.out文件&#xff0c;本来输出到终端的信息&#xf…

python人工智能数据算法(下)

文章目录差分法逼近微分背景引入差分法简介差分的不同形式及其代码实现蒙特卡罗方法背景引入蒙特卡罗方法原理蒙特卡罗方法应用计算圆周率计算定积分梯度下降算法算法简介方向导数与梯度梯度下降基于梯度下降算法的线性回归算法总结差分法逼近微分 背景引入 几乎所有的机器学…

我收集的PDF电子书

刚出来&#xff0c;要整理一下自己的资源了&#xff0c;好多都没有了&#xff0c;需要下载的自行联系niunanniunan.net 目录 软件工程 构建之法&#xff08;第1版&#xff09; 实现领域驱动设计 领域驱动设计&#xff1a;软件核心复杂性应对之道 人月神话 算法 算法基础…

C语言文件操作(一)

我们之前写程序&#xff0c;得到运行结果&#xff0c;退出运行&#xff0c;运行结果就不见了&#xff0c;因为运行的结果放到了内存中&#xff0c;退出程序的时候数据就会消失&#xff0c;等下一次运行又要重新输入数据&#xff0c;这样就显得很麻烦。那么我们如何保存之前的运…

Opengl ES之RGB转NV21

前言 在上一篇理论文章中我们介绍了YUV到RGB之间转换的几种公式与一些优化算法&#xff0c;今天我们再来介绍一下RGB到YUV的转换&#xff0c;顺便使用Opengl ES做个实践&#xff0c;将一张RGB的图片通过Shader 的方式转换YUV格式图&#xff0c;然后保存到本地。 可能有的童鞋…

SSL协议未开启是什么意思?

SSL协议未开启是指服务器中的服务没有开启或者没有SSL模块。在互联网中&#xff0c;数据交互传输基于http明文协议&#xff0c;随着互联网的不断发展&#xff0c;http协议展现出它的缺陷&#xff0c;通过http协议传输的数据容易被攻击者窃取、篡改或仿冒。为适应新形势下的网络…

【C语言进阶】文件操作详解

文章目录一.文件指针1.什么是文件指针2.如何使用文件指针二.文件操作函数1.流与文件2.顺序读写函数三.文本文件和二进制文件四.文件缓冲区一.文件指针 1.什么是文件指针 文件指针其实是文件类型指针的简称&#xff0c;我们常常会使用文件保存数据&#xff0c;而每个被使用的文…

SMILEtrack:基于相似度学习的多目标跟踪

文章目录摘要1、简介2、相关工作2.1、Tracking-by-Detection2.1.1、检测方法2.1.2、数据关联方法2.2、Tracking-by-Attention3、方法3.1、体系结构概述3.2.1、图像切片注意(ISA)块3.2.3、Q-K-V注意力块3.3、基于相似匹配级联(SMC)的目标跟踪算法4、实验结果4.1、数据集4.2、MOT…

XMind导入Markdown(利用Typora导出opml)

安装Xmind XMind 是一款非常实用的商业思维导图软件 首先&#xff0c;安装Xmind并打开。通过"帮助"——>“关于Xmind”&#xff0c;可以获取到当前的版本号为 XMind 8 Update 9 在"文件"——>“导入”&#xff0c;可以看到Xmind支持的导入格式仅有…

get请求和post请求

get请求 1.get请求的特点 通过一个URL来访问一个地址&#xff0c;就比如说127.0.0.1:7001,这种请求方式就是get请求&#xff0c;get请求可以直接在URL中添加参数&#xff0c;通过URL来传递参数。 优点&#xff1a;使用简单&#xff0c;清晰有条理&#xff0c;比较适合网站和…

十五天学会Autodesk Inventor,看完这一系列就够了(三),拉伸命令

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

盘点2022年度A站UE神作top

A站大家都应该很熟悉了&#xff0c;在全球的CG行业都是属于专业化十分高的网站&#xff0c;平台内展示的内容包括影视、动画、娱乐等等板块&#xff0c;更是收录了众多大神艺术家的作品&#xff0c;多看看可以最直接的了解整个行业的审美趋势与技术动向。正好最近2022年A站人气…

数据结构:线性表的链式表示和实现

顺序表仅适用于不常进行插人和删除的线性表。因为在顺序存储表示的线性表中插入或删除一个数据元素,平均约需移动表中一半元素,这个缺陷是由于顺序存储要求线性表的元素依次“紧挨”存放造成的。因此对于经常需要进行插人和删除操作的线性表,就需要选择其他的存储表示方法。现在…

C进阶:文件的基础操作

本文主要讲解文件基础操作的知识。 目录 一.文件指针 二.文件的打开和关闭 1.文件的打开 打开文件我们需要使用到 fopen 函数&#xff1b; 注意&#xff08;文件扩展名&#xff09;&#xff1a; 2.文件的关闭 三.文件的读写 1.读与写&#xff0c;输出与输入的概念 ​编…

VueUse(中文)——简介

一、VueUse——简介 VueUse是由Anthony Fu等大佬写的基于Vue的自定义钩子集合。类似于基于React的 ahooks功能丰富&#xff1a;200功能无缝迁移&#xff1a;适用于Vue 3和Vue2.7版本之后支持tree shaking&#xff1a;只引入自己需要的那部分&#xff0c;打包会更小还有其他的亮…

Chrome V3版开发教程使用Vue 3.x+Ant构建项目

简介 ​ Google在2023年将会遗弃V2版本&#xff0c;而目前在CSDN平台上的大部分Chrome插件的开发教程都是基于V2版本的&#xff0c;V3版本和V2的版本上还是有很大的区别&#xff0c;就比如manifest.json中的写法差距就很大&#xff0c;所以对于即将要开发Chrome插件的小伙伴来…

机器学习的相关概念与建模流程

文章目录一、机器学习简介1. 机器学习的相关定义2. 一次简单的机器学习任务&#xff1a;鸢尾花分类二、数据与数据集相关概念1. 数据与数据集2. 特征与标签3. 连续变量和离散变量4. 模型类型三、机器学习建模一般流程1. 提出基本模型2. 确定损失函数3. 根据损失函数性质&#x…

Servlet —— Smart Tomcat,以及一些访问出错可能的原因

JavaEE传送门JavaEE HTTPS —— HTTPS的加密方式 Servlet —— Tomcat, 初学 Servlet 程序 目录Smart TomcatSmart Tomcat 的下载配置 Smart Tomcat 插件访问出错404405500无法访问此网站Smart Tomcat 在上一篇文章中, 我们手动拷贝 war 包到 Tomcat 中的过程比较麻烦, 我们…

解析 json,整理分散数据入库

【问题】在 json 文件中有以下内容&#xff1a;现在需要将 json 中分散的数据整理入库。“LIST”中包含多个子孙记录&#xff0c;主要目标是”GROUPNAME”、”SERVICES”。“GROUPNAME”值、”SERVICES”中的键编号对应了数据库表 _groups 的 Groupname 和 ID。“SERVICES”每个…

PicGo+Gitee+Typora实现markdown图床

PicGoGitee实现markdown图床 情景概要 写博客的时候&#xff0c;总是需要插入图片的&#xff0c;图片存在本地的话上传到博客网站去就没法显示了 就算一个图一个图的复制粘贴上去&#xff0c;想移植到其他的博客网站&#xff0c;图就会失效&#xff0c;我们就需要图床 图床 …