首页 > 其他分享 >Mybatis-plus之新特性,你都用过哪些?

Mybatis-plus之新特性,你都用过哪些?

时间:2024-11-15 10:40:50浏览次数:1  
标签:queryWrapper boolean Wrapper 查询 之新 plus Mybatis com example

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("[email protected]");
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', '[email protected]')

示例(saveBatch):

List<User> users = Arrays.asList(
    new User("Alice", "[email protected]"),
    new User("Bob", "[email protected]"),
    new User("Charlie", "[email protected]")
);
// 使用默认批次大小进行批量插入,默认是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', '[email protected]'),
('Bob', '[email protected]'),
('Charlie', '[email protected]')

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

List<User> users = Arrays.asList(
    new User("David", "[email protected]"),
    new User("Eve", "[email protected]"),
    new User("Frank", "[email protected]"),
    new User("Grace", "[email protected]")
);
// 指定批次大小为 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', '[email protected]'),
('Eve', '[email protected]')

-- 第二批次
INSERT INTO user (name, email) VALUES
('Frank', '[email protected]'),
('Grace', '[email protected]')

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的使用。

标签:queryWrapper,boolean,Wrapper,查询,之新,plus,Mybatis,com,example
From: https://www.cnblogs.com/zys2019/p/18544128

相关文章

  • MyBatis面试题--(底层原理与基本概念)
    目录什么是Mybatis?MyBatis的好处是什么?什么是ORM?有何作用?MyBatis中的SqlSession是什么?有什么作用?1>什么是SqlSession?2>SqlSession的作用解释一下SqlSessionFactory的作用并解释它如何使用SqlSessionFactory的作用?如何使用SqlSessionFactory1.添加依赖2.配置数据源和S......
  • MyBatis操作--初阶
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库JavaEE专栏:JavaEE软件测试专栏:软件测试关注博主带你了解更多知识目录 1. MyBatis概念2.MyBatis⼊⻔ 2.1 Navicat安装 2.2数据准备 2.3 配置数据库连接2.4完善持久......
  • elementPlus中的el-tree
    将接口返回的数据整理成组件支持的数据结构接口返回的数据格式:[{"id":767947,"appName":"生生世世","appBundle":"cds","appStore":2,"link":"www.baidu.com","accountId":"3,68","......
  • EMC Plus:外壳中的 PCB 演示
    EMCPlus提供了计算任何导入的近场源文件的字段统计信息的高级功能。在本演示中,我将指导您完成分析辐射电场的分步工作流程,特别是由EMCPlus中从SIwave导入的近场源产生的辐射电场。让我们开始吧!概述以下模型是计算机机箱,您可以在软件示例中找到它。该工作流包括以下步......
  • [20241112]无法理解sqlplus的输出.txt
    [20241112]无法理解sqlplus的输出.txt--//昨天遇到的问题,执行10tox.sql脚本出现一些状况。分析认为oracle把8d当作数字。--//但是还是遇到我无法理解的情况:1.环境:SCOTT@book>@ver1PORT_STRING                   VERSION       BANNER-------------......
  • 《MyBatis-Plus 代码生成器基础入门》
    1.概念介绍MyBatis-Plus是一个MyBatis的增强工具,旨在简化开发、提高效率。它在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus提供了代码生成器功能,可以快速地根据数据库表结构生成Entity(实体类)、Mapper(映射器接口)、Service(服务层接口及其实......
  • mybatis的resultType类如果是一个内部类,如何返回呢
    外部类:RechargeListVO内部类:Summary类的写法如下:@Data@Accessors(chain=true)publicclassRechargeListVOimplementsSerializable{/***充值时间*/privateStringrechargeTime;@Data@Accessors(chain=true)publicstaticclassSummaryimplementsS......
  • 章节二、Mybatis
    一、MyBatis框架介绍1、简介框架:半成品软件ORM框架(ObjectRelationMapping对象关系映射):代替jdbc,自动进行对象和数据库表之间的转换MyBatis:半自动的ORM框架,底层是jdbc;不需要写jdbc代码,但需要写sql语句2、MyBatis使用环境搭建:创建项目---添加MyBatis依赖---添加mysql依赖--......
  • MyBatis及相关文件配置
    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。以下是对MyBatis的详细讲解:一、MyBatis的起源与发展MyBatis最初是Apache的一个开源项目iBATIS,2010年迁移到GoogleCode并改名为MyBatis,2013年11月又迁移到GitHub。MyBatis的最新版本是3.5.13,发布于2023......
  • springboot2+mybatis+shardingsphere-5.5.1
    注意:1.druid不能boot-starter方式引入2.snakeyaml需要1.33('voidorg.yaml.snakeyaml.LoaderOptions.setCodePointLimit(int)') #303183.spring.datasource.driverClassName:org.apache.shardingsphere.driver.ShardingSphereDriver4.如果使用了quartz,需要指定独立数据源(Tabl......