1.lambda方式查询

在使用Mybatis-plus进行查询时,我们正常的操作是创建一个QueryWrapper,然后根据字段去做查询操作(如下图)

那么就有一个问题,每个数据库的字段都需要写出来,遇到驼峰字段还需要转换为下划线形式,非常影响开发效率。而官方也考虑到这个问题,后续的版本已经提供了lambda的方式,直接使用对象属性方式

这种方式是不是非常舒服,开发效率不就提起来了吗

2.持久层接口IService

IService是MyBatis-Plus 提供的一个通用 Service 层接口,它封装了常见的 CRUD 操作,包括插入、删除、查询和分页等。通过继承 IService 接口,可以快速实现对数据库的基本操作,同时保持代码的简洁性和可维护性。

简单来说,就是其内部封装了一系列常用的方法,可以减少代码的冗余,那如何去使用呢?其实很简单,只需要在service接口继承 IService即可

package com.zxh.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zxh.entity.User; public interface UserService extends IService<User> { }

于此同时,此接口的实现类也需要继承IServiceImpl

package com.zxh.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zxh.dao.UserDao;
import com.zxh.entity.User;
import com.zxh.service.UserService;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
}

此时就可以直接使用service的通用方法(这里直接以官网案例说明)

2.1保存save

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);

示例(save):

User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
boolean result = userService.save(user);
if (result) {
System.out.println("User saved successfully.");
} else {
System.out.println("Failed to save user.");
}

生成的 SQL:

INSERT INTO user (name, email) VALUES ('John Doe', 'john.doe@example.com')

示例(saveBatch):

List<User> users = Arrays.asList(
new User("Alice", "alice@example.com"),
new User("Bob", "bob@example.com"),
new User("Charlie", "charlie@example.com")
);
// 使用默认批次大小进行批量插入,默认是1000
boolean result = userService.saveBatch(users);
if (result) {
System.out.println("Users saved successfully.");
} else {
System.out.println("Failed to save users.");
}

生成的 SQL:

INSERT INTO user (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com')

示例(saveBatch 指定批次大小):

List<User> users = Arrays.asList(
new User("David", "david@example.com"),
new User("Eve", "eve@example.com"),
new User("Frank", "frank@example.com"),
new User("Grace", "grace@example.com")
);
// 指定批次大小为 2进行批量插入
boolean result = userService.saveBatch(users, 2);
if (result) {
System.out.println("Users saved successfully.");
} else {
System.out.println("Failed to save users.");
}

生成的 SQL(指定批次大小为 2):

-- 第一批次
INSERT INTO user (name, email) VALUES
('David', 'david@example.com'),
('Eve', 'eve@example.com') -- 第二批次
INSERT INTO user (name, email) VALUES
('Frank', 'frank@example.com'),
('Grace', 'grace@example.com')

2.2保存或修改saveOrUpdate

// TableId 注解属性值存在则更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入,指定批次数量
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

后续示例直接参考官网对应案例,这里只枚举提供的方法

2.3修改update

// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

2.4获取get

// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

2.5列表list

// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

2.6列表分页list

// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

2.7统计数量count

// 查询总记录数
int count();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper); //自3.4.3.2开始,返回值修改为long
// 查询总记录数
long count();
// 根据 Wrapper 条件,查询总记录数
long count(Wrapper<T> queryWrapper);

2.8删除remove

// 根据 queryWrapper 设置的条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);

可见直接在service提供的方法和mapper提供的方法名是做了区分的,有效避免了混淆。至于mapper提供的方法就不再赘述,因为这种是使用的最多的,详见基础

3.复杂的条件构造

3.1 and or

比如现有一个查询条件,查询物料名称或编码包含输入的物料且药品名称包含输入的药品名称(参数均为单值),应该怎么做?

显然根据打印的sql可以看出,这种方式是错误的,这是就需要使用and和or结合,正确方法如下

也就是说需要结合and实现同一条件查询,相当于用小括号将同时需要满足的条件括起来。

3.2 and for or

这也是上述的一种变种,非常使用。

比如现有一个查询条件,查询物料名称和物料编码等于前端传入的物料列表(参数为数组)且药品名称包含输入入的药品名称(参数为单值),应该怎么做?其实重点在于同时满足两个字段且是列表。正确方法如下

这种sql才是我们最终想要的结果。关键在于for循环的介入及and的使用。

Mybatis-plus之新特性,你都用过哪些?的更多相关文章

  1. 我最喜欢的Mybatis 3.5新特性!超实用!

    Mybatis 3.5 发布有段时间了,终于支持了 Optional ,这么实用的特性,竟然还没人安利……于是本文出现了. 新特性比较简单,但非常实用,因为能大量简化恶心的判空代码. WARNING ...

  2. Xcode 8 的 Debug 新特性

    Contents OverView Static Analyzer Localizability Instance Cleanup Nullablility Runtime Issue View De ...

  3. 前端入门21-JavaScript的ES6新特性

    声明 本篇内容全部摘自阮一峰的:ECMAScript 6 入门 阮一峰的这本书,我个人觉得写得挺好的,不管是描述方面,还是例子,都讲得挺通俗易懂,每个新特性基本都还会跟 ES5 旧标准做比较,说明为什 ...

  4. Xcode 8 的 Debug 新特性 —- WWDC 2016 Session 410 & 412 学习笔记

    Contents OverView Static Analyzer Localizability Instance Cleanup Nullablility Runtime Issue View De ...

  5. 温故而知新,重温 Java 7 的那些“新”特性

    2009 年 4 月 20 日,Java 的亲生父亲 Sun 被养父 Oracle 以 74 亿美元收购,这在当时可是一件天大的事.有不少同学都担心 Java 的前途,我当时傻不啦叽地也很担心:自己刚 ...

  6. TKmybatis的框架介绍和原理分析及Mybatis新特性

    tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...

  7. TKmybatis的框架介绍和原理分析及Mybatis新特性演示

    tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查 ...

  8. 简短介绍 C# 6 的新特性 .net 6都要来了?

    几周前我在不同的地方读到了有关C#6的一些新特性.我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍.它们中的一些可能不会如预期那样神奇,但那也只是目前的更新. 你可以通过下载V ...

  9. 从java1到java9每个版本都有什么新特性?

    每次出新版本,大家大概都会这么问,"Java X会有什么特性呢?" .在下面的内容里,我总结了至今为止的Java主要发行版中各自引入的新特性,这样做的目的是为了突出各个新特性是在哪 ...

  10. Java9都快发布了,Java8的十大新特性你了解多少呢?

    Java 9预计将于今年9月份发布,这是否会是一次里程碑式的版本,我们拭目以待.今天,我们先来复习一下2014年发布的Java 8的十大新特性. Java 8可谓是自Java 5以来最具革命性的版本了 ...

随机推荐

  1. Win11专业版好用吗?和Win10系统有什么区别

    很大一部分雨林木风官网的用户都没有更新win11专业版的,而是一直处于观望状态,或者还有一些小伙伴用的还是windows7旗舰版系统,也没有升级win10系统.当然,有很多小伙伴想知道Win11究竟哪 ...

  2. redission集群搭建

    <dependency>   <groupId>org.redisson</groupId>   <artifactId>redisson-spring ...

  3. javascript高级程序编程-学习笔记(基础)

    1.js实现 js诞生:为了验证字段是否输出(前期) 1.1分类 Esmascript,Dom,Bom 语法,类型,语句,关键字,保留字,操作符,对象 2.script async 立即下载 char ...

  4. java+selenium+autoIt 实现下载(打印)功能

    java+selenium+autoIt 实现下载(打印)功能 selenium是一个开源的自动化测试框架,它可以模拟用户对浏览器的操作,进行自动化的测试.但是,它不仅仅只能用来做测试. AutoIt ...

  5. PG系列:Select查询一样会被阻塞

    我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...

  6. CentOS 升级 Python版本

    1.先到 https://www.python.org/downloads/release/python-3114/ 找到Python的最新版本,tar包,复制下载链接: 2.执行命令: wget h ...

  7. Hello,NanXi~

      今天是2024.07.05,注册博客已经4天了,零零散散的抽时间把博客园美化了一下(我有自定义美化的习惯,喜欢自定义性强的东西),毕竟这是我的新家啊!我准备丢掉之前自己搭建的博客了,改用博客园平台 ...

  8. django的配置文件每个配置项的作用

    必须大写才是配置项 django项目要启动,要先加载配置文件,如果配置文件报错,项目运行不起来 from pathlib import Path # 项目根路径 BASE_DIR = Path(__f ...

  9. 微服务项目中基于 Servlet 的业务模块与 WebFlux 网关模块的 Redis 统一化配置教程

    微服务项目中Servlet模块与WebFlux网关的Redis使用指南 在微服务架构的蓬勃发展浪潮中,Redis凭借其超高的性能.丰富的功能,已然成为缓存.分布式锁.会话存储等场景下的核心支撑技术.然 ...

  10. 网页自动化——VBA和InternetExplorer.Application

    网页自动化--VBA和InternetExplorer.Application 转载:http://www.360doc.com/content/18/0223/17/52075843_7317627 ...