mybatisPlus使用步骤详解

devtools/2024/12/22 7:05:38/

1.导包:

        <!--mybatis-plus jar文件--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>

yml和之前的相比多了一个-plus

mybatis-plus:type-aliases-package: com.hz.mybatisPlusTest01.pojomapper-locations: classpath:/mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false #驼峰映射关闭

测试类:

@SpringBootTest
@MapperScan("com.hz.mapper")
class MybatisPlusTest01ApplicationTests {@Resourceprivate ProviderService providerService;@Testpublic void findById() {providerService.findById(1);}
}

2.两种使用mybatis-plus的方式:

这两种方式的方法不太一样

select find

insert save

del remove

1.普通的在service层中调用

就是通过Mapper继承BaseMapper<T>

public interface ProviderMapper extends BaseMapper<Provider> {

    @Resourceprivate ProviderMapper providerMapper;
然后在测试类中@Resourceprivate ProviderService providerService;

就是这个需要在service层中调用,省了mapper层的方法

2.跳过service层,直接在controller中调用

service直接继承 ServiceImpl<BaseMapper<Provider>,Provider>

此时就不需要ProviderMapper extends BaseMapper<Provider>,但是ProviderMapper还是要有的

public class ProviderServiceImpl extends ServiceImpl<BaseMapper<Provider>,Provider> implements ProviderService {

service的接口继承 IService<Provider>

public interface ProviderService extends IService<Provider>

就算这样还是需要mapper层继承不继承应该都行

public interface ProviderMapper extends BaseMapper<Provider> 

UpdateWrapper和QueryWrapper的区别:

创建方式

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
QueryWrapper<User> queryWrapper = new QueryWrapper<>();

例子:

LambdaQueryWrapper 构造器:

这个使用lamda表达式::就是.的意思

.select()里面装的字段

.eq( , )让左边的变量等于右边的

.like( , , )左边boolean条件,可以判断是否为null,中间是变量,右边是模糊查询的条件

因为Lambda表达式是通过实体类的,所以起的别名也能够正常使用,这里是Provider::getPname实体类会自动转换成proName

   lambdaQueryWrapper.select(Provider::getId,Provider::getPname);

labmda的写法:

创建LambdaQueryWrapper的方式也不一样,把值放入的方式也不同

 LambdaQueryWrapper<Provider> queryWrapper = new LambdaQueryWrapper<>();
    @Testpublic  void find(){LambdaQueryWrapper<Provider> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.select(Provider::getId,Provider::getProCode,Provider::getPname);lambdaQueryWrapper.like(Provider::getPname,"大");lambdaQueryWrapper.eq(Provider::getProCode,"BJ_GYS003");lambdaQueryWrapper.orderByAsc(Provider::getId);providerService.list(lambdaQueryWrapper);}

QueryWrapper的写法:

这是一种线性的写法

    public void find(){//条件构造器   select from xx where xxx  like '%xx%' andproviderService.list(new QueryWrapper<Provider>().select("id","proCode","proDesc","proName").like(true,"proDesc","深圳").eq(true,"proCode","GZ_GYS002").orderByDesc("creationDate"));}

.gt用来添加大于的条件

    @Testpublic void lambda(){LambdaQueryWrapper<Provider> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.like(Provider::getPname,"北").and(wrapper -> wrapper.gt(Provider::getId, 10)); // 添加 id 大于 50 的条件providerService.list(lambdaQueryWrapper);}

如果索引被撑大了:

在这里填上在此基础上要继续递增的数字,表中的id没有比这个数字再大的

还需要在实体类中加上@TableId(value = "id",type= IdType.AUTO),让id自动递增的

	@TableId(value = "id",type= IdType.AUTO)private Integer id; //id

解释一下各种方法:

1.removeById(Serializable id):

Serializable id 表示一个通用的参数类型,用于作为主键的标识符(ID)。Serializable 用于确保该方法可以接受不同类型的 ID 参数。Serializable 是 Java 中的一个标记接口,意味着该类型的对象可以被序列化。

2.

3.条件构造器:

测试类:

import static org.junit.jupiter.api.Assertions.*;@SpringBootTestpublic  class ProviderServiceTest {@Autowiredprivate ProviderService providerService;@Testpublic void findlist(){
//        查询所有providerService.list();}/*** 模糊查询*/@Testpublic void selectLike(){QueryWrapper<Provider> queryWrapper = new QueryWrapper<>();queryWrapper.like(true, "proDesc", "大豆油");queryWrapper.eq(true,"proCode","BJ_GYS003");queryWrapper.or().eq(true,"proCode","BJ_GYS003");queryWrapper.orderByAsc("id");providerService.list(queryWrapper);
//        查询所有
//        providerService.update(Provider,queryWrapper);}}

4.Mybatis-Plus-Join:

因为mybatisPlus没有表连接,这个MybatisPlusJoin是用于表连接的,并且它能够轻松实现表的分页(需要工具)

先导包

 <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><version>1.5.1</version></dependency>

MPJ分页:

分页插件

package com.hz.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}
}

一种要在service层写方法的分页用.selectPage(page, null);

第二种可以直接在controller中写方法的用.page(page,null);

    @Testpublic void fenye(){Page<Provider> page = new Page<>(1,5);providerService.page(page,null);
// 输出page对象分页查询信息System.out.println("总条数:" + page.getTotal());System.out.println("每页显示条数:" + page.getSize());System.out.println("总页数:" + page.getPages());System.out.println("当前页:" + page.getCurrent());System.out.println("是否有上一页:" + page.hasPrevious());System.out.println("是否有下一页:" + page.hasNext());System.out.println("查询结果:" + page.getRecords());}

5.逻辑删除:

isDelete字段: 0:未删除 1:已删除

配置属性:
mybatis-plus:global-config:db-config:logic-delete-field: idDelete # 全局逻辑删除字段名logic-delete-value: 1 # 逻辑已删除值logic-not-delete-value: 0 # 逻辑未删除值

给字段加上注解:
 @TableLogicprivate int idDelete;

也就是这里的删除不是真正的删除,是逻辑删除,也就相当于更新:把isDelete字段更新成1,以后再查询的时候只查isDelete字段等于0的

再次查询的时候会自动拼上idDelete=0

6.多租户:

就是不同用户看到不同的数据,也就是根据创建人来获取数据,2创建人只能获取2的信息

多租户插件:

getTenantId()这个方法就是获取创建人的信息,这里假设

getTenantIdColumn()这个方法就是返回看什么字段决定多租户,返回这个字段createdBy

@Component
public class CustomTenantHandler implements TenantLineHandler {@Overridepublic Expression getTenantId() {
//        假装从redis获取用户idint userId=2;return new LongValue(userId);}@Overridepublic String getTenantIdColumn() {return "createdBy";}@Overridepublic boolean ignoreTable(String tableName) {return TenantLineHandler.super.ignoreTable(tableName);}
}
在分页上插件上配置多租户:

14-16行就是新增加的三行

@Configuration
public class MybatisPlusConfig {@Autowiredprivate CustomTenantHandler customTenantHandler;/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypeTenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();tenantInterceptor.setTenantLineHandler(customTenantHandler);interceptor.addInnerInterceptor(tenantInterceptor);return interceptor;}
}


http://www.ppmy.cn/devtools/144301.html

相关文章

视频及JSON数据的导出并压缩

npm下载安装 jszip 和 file-saver 这两个库来实现文件的压缩和保存功能&#xff1a; npm install jszip npm install file-saver 导入依赖库&#xff1a; import JSZip from jszip; import { saveAs } from file-saver; 方法实现&#xff1a; batchDownload() {const zip…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

前端滚动锚点(点击后页面滚动到指定位置)

三个常用方案&#xff1a; 1.scrollintoView 把调用该方法的元素滚动到屏幕的指定位置&#xff0c;中间&#xff0c;底部&#xff0c;或者顶部 优点&#xff1a;方便&#xff0c;只需要获取元素然后调用 缺点&#xff1a;不好精确控制&#xff0c;只能让元素指定滚动到中间&…

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书 一、下载影刀&#xff1a; https://www.winrobot360.com/share/activity?inviteUserUuid595634970300317698 二、加入应用市场 https://www.yingdao.com/share/accede/?inviteKeyb2d3f22a-fd6c-4a…

分布式数据存储基础与HDFS操作实践

本篇博客由作者女朋友亲情赞助&#xff0c;本人所撰写内容见资源文件。 1. 虚拟机集群的安装与配置 1.1 创建并配置两个虚拟机 配置网络&#xff0c;让主机和所有部署的虚拟机处于同一个网段下&#xff0c;主机可以去连虚拟机&#xff0c;虚拟机可以去连主机&#xff0c;虚拟机…

如何让cursor给出更好,更准确的回答的两个配置

通过配置&#xff0c;可以让cursor更好&#xff0c;更准确的回答我们的问题&#xff0c;那这两个配置就要一定打开 1. codebase indexing 配置要打开并且同步 codebase indexing 会对我们的代码进行索引和采集&#xff0c;并且根据代码的上下文进行排序。然后进行推理思考&am…

Java项目--仿RabbitMQ的消息队列--统一硬盘操作

目录 一、引言 二、DiskDataCenter类 1.实例化 2.封装交换机操作 3.封装队列操作 4.封装绑定操作 5.封装消息操作 三、总结 一、引言 上一篇文章介绍了如何将消息文件存入硬盘的操作&#xff0c;这一篇文章就简单介绍一下统一硬盘操作。 二、DiskDataCenter类 1.实例化…

Unity3D仿星露谷物语开发6之角色添加动画

1、目的 给角色添加素材中的动画&#xff0c;最终让角色动起来。 2、准备工作 当前的预设体中的Player对象还不够完善&#xff0c;需要删除掉再优化下。此时应当&#xff1a;Hierarchy中的Player对象切断和预设体的关联&#xff0c;同时删除Prefabs中的Player对象。 首先&a…