使用Mybatis-plus进行基本的CRUD(增查改删)操作。

实体类(User)代码:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; @Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("tb_user")
public class User {
@TableId(type = IdType.AUTO) // 需要指定,否则无法新增后拿到回调的id,以及进行删除等操作
// 查询的时候不需要查出来的字段,默认true,和@TableId作用在同一个字段上时失效
@TableField(select = false)
private Integer uid;
private String uname;
// 用来解决数据库中的字段和实体类的字段不匹配问题
@TableField(value = "age",select = false)
private Integer uage; // 数据库中的字段为age
// 用来解决实体类中有的属性但是数据表中没有的字段
@TableField(exist = false) // 默认为true
private String address; // 这是一个数据库中不存在的字段 public User(String uname, Integer age) {
this.uname = uname;
this.uage = age;
}
}

1、增加操作:

代码如下:直接传入一个实体即可完成

@Test
public void test02(){ // 插入一条记录
// 1.构建要插入的对象
User user = new User();
user.setUname("zhangsan");
user.setUage(40);
// 数据库中不存在的字段,通过@TableField(exist = false)排除之
user.setAddress("beijing");
// 2.执行添加 返回值为受影响的行数
int result = userMapper.insert(user);
System.out.println("受影响的行数=" + result);
System.out.println("拿到自增的id=" + user.getUid());
}

2、更新操作:

方法一:int updateById(T entity);

测试代码:

@Test
public void test04(){ // 根据id进行更新
// 1.构建更新的对象
User user = new User();
// 2.根据id来进行更新
user.setUid(1007);
// 3.更新的内容值
user.setUname("小莉");
user.setUage(17);
// 4.执行更新
int result = userMapper.updateById(user);
System.out.println("受影响的行数=" + result);
}

方法二:

1-使用QueryWrapper,它只负责条件的匹配

测试代码:

@Test
public void test05(){ // 第一种:使用QueryWrapper,根据条件进行更新
// 1.设置更新的内容值
User user = new User();
user.setUname("王五");
user.setUage(45);
// 2.设置更新的匹配条件,可以叠加多个,类似于and
QueryWrapper<User> wapper = new QueryWrapper<>();
// 参数1:数据库中的字段名 参数2:字段名的值(匹配的值)
// 解读:把数据库中uid字段为1015和1016的值修改成user中的内容
wapper.eq("uid",1015);
wapper.or(); // 在查询中拼接or
wapper.eq("uid",1016);
// 语句还原:UPDATE tb_user SET uname='王五', age=45 WHERE uid = 1015 OR uid = 1016
// 3.开始更新,参数1:更新的内容 参数2:更新的匹配条件
int result = userMapper.update(user, wapper);
System.out.println("受影响的行数=" + result); //
}

2-使用UpdateWrapper进行更新操作

测试代码:

@Test
public void test06(){ // 第二种:使用UpdateWrapper,根据条件进行更新
// 1.定义一个UpdateWrapper对象
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
// 2.设置参数
// set(String column, Object val),参数1:数据库中的字段名 参数2:修改后的值
// eq(String column, Object val),参数1:数据库中的字段名 参数2:修改条件
// or(),使查询条件变成用or拼接
wrapper.set("uname","第五人格").set("age",28)
.eq("uid",1018).or().eq("uid",1019);
// 3.执行修改,使用UpdateWrapper,参数1指定为 null
int result = userMapper.update(null, wrapper);
System.out.println("受影响的行数=" + result); // 2
// SQL:UPDATE tb_user SET uname=?,age=? WHERE uid = ? OR uid = ?
}

注意两个条件直接如果要用OR拼接,则需要在两个条件之家插入or()方法。

3、删除操作:

1-根据id来删除

@Test
public void test03(){
// 1.直接根据id进行删除
int result = userMapper.deleteById(1014);
System.out.println("受影响的行数=" + result); //
}

2-根据map条件进行删除

@Test
public void test07(){ // 根据Map来进行删除,多条件之间是and关系
// 1.构建删除条件map
Map<String,Object> map = new HashMap<>();
// 2.设置删除条件的值,参数1:数据库中的字段名,参数2:条件值
map.put("uname","艾玛x");
map.put("age",80);
// 3.执行删除
int result = userMapper.deleteByMap(map);
System.out.println("受影响的行数=" + result); // 1
// SQL:DELETE FROM tb_user WHERE uname = ? AND age = ?
}

3-根据查询条件Wrapper进行删除:delete(Wrapper<T> wrapper)

使用QueryWrapper进行删除,测试代码:

@Test
public void test08(){
// 1.构建一个QueryWrapper对象
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 2.为QueryWrapper对象设置条件
wrapper.eq("uid",1010).eq("uname","小柳")
// 也可以设置OR条件
.or().eq("uid",1015);
// 3.执行删除
int result = userMapper.delete(wrapper);
System.out.println("受影响的行数=" + result); // 2
// SQL:DELETE FROM tb_user WHERE uid = ? AND uname = ? OR uid = ?
}

4-根据id集合实现批量删除:deleteBatchIds(Collection idList)

测试代码:

@Test
public void test09(){
// 根据集合进行删除(使用的是SQL中的in关键字)
// 1.构建一个存放id列表的集合
List<Integer> idList = new ArrayList<>();
// 2.存放要进行删除的id,存放了3个id
idList.add(1021);
idList.add(1022);
idList.add(1023);
// 3.执行删除
int result = userMapper.deleteBatchIds(idList);
System.out.println("受影响的行数=" + result); // 3
// SQL:DELETE FROM tb_user WHERE uid IN ( ? , ? , ? )
}

以上就是BaseMapper中增删改操作的方法。

接下来,介绍其查询方法,MybatisPlus(MP)提供了多种查询操作,包括根据id查询,批量查询、单挑记录查询、查询列表、分页查询等操作。

4、查询操作

1-根据id查询单个记录

测试代码:

@Test
public void test01(){// 根据id进行查询
// 1.执行查询操作
User user = userMapper.selectById(1018);
// 2.输出查询结果
System.out.println(user);
}

如果出现以下情况,则需要指定@TableId

2-根据id集合列表查询多个记录:selectBatchIds(Collection idList)

测试代码:

@Test
public void test02(){// 根据id集合进行批量查询
// 1.创建id列表并赋值
List<Integer> ids = new ArrayList<>();
ids.add(1016);
ids.add(1017);
ids.add(1018);
// 2.执行查询
List<User> users = userMapper.selectBatchIds(ids);
// 3.遍历查询结果集
for (User user : users) {
// 4.打印查询结果
System.out.println(user);
}
// SQL:SELECT uid,uname FROM tb_user WHERE uid IN ( ? , ? , ? )
}

3-根据条件进行查询,用map来封装查询条件

测试代码:

@Test
public void test03(){
// 1.构建查询条件
Map<String, Object> map = new HashMap<>();
map.put("uname","第五人格");
map.put("age",28); // 多个条件之间的SQL用and拼接
// 2.执行查询
List<User> users = userMapper.selectByMap(map);
// 3.打印输出
printUsers(users);
// SQL:SELECT uid,uname FROM tb_user WHERE uname = ? AND age = ?
}

4-查询单挑记录,若返回加过大于一个,抛出异常MybatisSystemException

测试代码:

@Test
public void test04(){ // 查询单条记录
// 1.定义查询条件对象
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 2.设置查询条件
wrapper.eq("uname","第五人格");
// 查询的记录>1个时,抛出异常MyBatisSystemException
User user = userMapper.selectOne(wrapper);
// 3.打印结果
System.out.println(user);
// SQL:SELECT uid,uname FROM tb_user WHERE uname = ?
}

5-查询符合条件的记录数,Integer selectCount(Wrapper<User> queryWrapper)

测试代码:

@Test
public void test05(){ // 查询记录数,类似于conut(*)
// 若需要设置条件可使用Wrapper对象,null表示查询所有
Integer count = userMapper.selectCount(null);
// 打印返回的记录数
System.out.println("记录数有 = " + count);
// SQL:SELECT COUNT( 1 ) FROM tb_user
}

6-查询符合条件的记录列表,List<User> selectList(Wrapper<User> queryWrapper)

若参数为null,则为查询所有

测试代码:

@Test
public void test06(){//根据查询条件查询列表
// 1.构建一个QueryWrapper对象
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 2.设置条件,参数1:数据库字段名,参数2:参数值
wrapper.eq("uname","第五人格");
// 3.执行查询
List<User> users = userMapper.selectList(wrapper);
//List<User> users = userMapper.selectList(null);// 查询所有
// 4.打印结果
printUsers(users);
}

7-根据条件把查询结果封装在Map和List中

List<Map<String, Object>> selectMaps(Wrapper<User> queryWrapper)

测试代码:

@Test
public void test07(){
List<Map<String, Object>> maps = userMapper.selectMaps(null);
for (Map<String, Object> map : maps) {
// 一个map对应一条记录
// 每个map的key都为字段名
// 每个map的值都为字段具体值
System.out.println(map);
}
}

8-分页查询

首先定义一个新的类为配置类(MybatisPlusConfig)

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class MybatisPlusConfig { // 分页插件
@Bean // 注入Spring容器中
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}

之后开始测试,代码如下:

@Test
public void test09(){ // 测试分页
// 1.查询条件,null则为查询所有
Wrapper<User> wrapper = null;
// 1.1 使用其构造,参数1:当前页,参数2:每页的大小
Page<User> page = new Page<>(1,2);
// 2.执行查询
// 参数1:为接口Ipage,其实现类只有一个Page,参数2:为查询条件,返回一个Ipage对象
IPage<User> userIPage = userMapper.selectPage(page, wrapper);
// 3.打印重要参数
System.out.println("总页数= " + userIPage.getPages());
System.out.println("总记录数= " + userIPage.getTotal());
System.out.println("页面大小= " + userIPage.getSize());
System.out.println("当前页= " + userIPage.getCurrent());
System.out.println("查询结果如下:" );
// 4.打印分页结果
for (User user : userIPage.getRecords()) {
System.out.println(user);
}
// SQL:SELECT uid,uname,age AS uage FROM tb_user LIMIT ?,?
}

至此,关于BaseMapper接口中的所有方法都已经测试完成了!

Mybatis插件之Mybatis-Plus的CRUD方法的更多相关文章

  1. 自己动手编写一个Mybatis插件:Mybatis脱敏插件

    1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...

  2. mybatis插件机制

    目录 mybatis插件机制 主要 类/接口 和 方法 mybatis插件机制实现 mybatis插件机制 mybatis的插件机制使用动态代理实现,不了解的朋友请先了解代理模式和动态代理:插件本质是 ...

  3. 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法

    spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...

  4. intellij IDEA mybatis插件破解方法

    1>安装mybatis插件,找到mybatis_plus.jar包的位置,在C:\Users\LZHL\.IntelliJIdea2016.3\config\plugins\mybatis_pl ...

  5. Mybatis 原始dao CRUD方法

    用到的相关jar包及所用版本如下: 其中的Mybatis可以到github.com的网站下载 <project xmlns="http://maven.apache.org/POM/4 ...

  6. Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试

    前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...

  7. MyBatis7:MyBatis插件及示例----打印每条SQL语句及其执行时间

    Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用 Executor(update.q ...

  8. MyBatis 插件 : 打印 SQL 及其执行时间

    Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用: Executor(update. ...

  9. MyBatis插件及示例----打印每条SQL语句及其执行时间

    Plugins 摘一段来自MyBatis官方文档的文字. MyBatis允许你在某一点拦截已映射语句执行的调用.默认情况下,MyBatis允许使用插件来拦截方法调用 Executor(update.q ...

  10. SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作

    SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作 1> 数据准备 -- 创建测试表 CREATE TABLE `tb_user` ( `id` ) NOT ...

随机推荐

  1. JMeter性能测试工具

    1.官网资源 地址:https://jmeter.apache.org/download_jmeter.cgi window下载zip版本 options配置-选择语言-简体(jmeter.prope ...

  2. jQuery和原生JS的对比

    原生JS的缺点: 不能添加多个入口函数(window.onload),如果添加了多个,后面的会把前面的覆盖掉 原生js的api名字太长,难以书写,不易记住 原生js有的代码冗余 原生js中的属性或者方 ...

  3. [git]一个本地仓库,多个远程仓库

    操作步骤如下: 1. 克隆某个远程仓库的代码到本地 git clone http://...... // 或者 git clone git@.... 2. 查看当前远程仓库地址 // 查看需要添加的远 ...

  4. chrome扩展开发实战入门之一-hellocrx

    后记:在写这篇文章时,我还没搞懂chrome扩展的基本原理.后来才明白,最简单(且实用)的扩展只需要manifest.json和content_scripts.js两个文件,无需background. ...

  5. luogu 2943 [USACO09MAR]清理Cleaning Up 动态规划

    非常巧妙的动态规划. 你会发现每一个区间地颜色种类不能超过 $\sqrt n$, 所以可以直接枚举区间颜色种类. 令这个为 $pos[j],$ 然后考虑如何去更新这个东西就行了. Code: #inc ...

  6. Irrlicht引擎剖析二

  7. Editor

    E. Editor 我们把"("用1表示,")"用-1表示,其余字母用0表示,这样形成的一个数组,我们求出它的前缀和sum[],只有当\(sum[n]==0\) ...

  8. docker实战之通过nginx镜像来部署静态页

    本章我们主要讲解如何通过docker构建一个nginx容器,这里我们以部署一个静态html为素材来进行演示. 首先我们通过[docker search nginx]命令来查找Docker Hub上的n ...

  9. Java实现线程的三种方式和区别

    Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...

  10. Mybatis 传入多个参数查询数据 (3种方法)

    第一种方案 DAO层的函数方法 public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...