【Java】MybatisPlus

news2024/9/27 21:25:21

MybatisPlus

MybatisPlus是在mybatis基础上的一个增强型工具。它对mybatis的一些操作进行了简化,能够提高开发的效率。

springboot整合了mybatis之后,其实已经非常方便了,只需要导入mybatis的包后,在配置文件中编写数据源信息,然后在数据层接口上添加@Mapper注解。

但是,现在还有一个不完美的地方:数据层接口需要自己写方法,并且需要写注解写sql语句。这些都是增删改查的sql,其实重复性很大,如果能够让框架负责这部分代码的生成就完美了。

MybatisPlus正是这样的一门技术。

1、MybatisPlus快速入门

去除mybatis的依赖,转而导入MybatisPlus的依赖。

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

然后将dao接口继承BaseMapper<实体类>。dao层接口不再需要写任何查询方法,已经具有了增删改查的方法。

mp具有动态sql的功能。比方说updateById方法是传入一个实体类,这个实体类中要有id信息,会根据id去修改对应的记录。但是,如果除了id以外其他属性不置任何值,那么修改的记录不会有任何改变。如果除了id以外还有一个属性被set了(假设总共有10个属性),其他九个属性都是空的,那么修改的记录只会修改被修改的那个值而不会改变其他属性。

2、标准数据层开发

  • 标准分页功能制作

    mp有一个分页拦截器专门用来做分页,没有配置这个拦截器就没有分页功能,配上了才有分页功能。

    在这里插入图片描述

//当前页第1页,每页条数2条
IPage<Brand> iPage=new Page<>(1,2);
brandDao.selectPage(iPage,null);
System.out.println("当前页:"+iPage.getCurrent());
System.out.println("一页条数:"+iPage.getSize());
System.out.println("一共多少页:"+iPage.getPages());
System.out.println("一共多少条数据:"+iPage.getTotal());
System.out.println("具体数据:"+iPage.getRecords());
  • 条件查询

需要创建一个容器,并填入查询条件然后交给数据层接口的方法进行查询。

QueryWrapper<Emp> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(Emp::getId, empId).eq(Emp::getEmpStatus, "1");
Emp emp = empMapper.getOne(wrapper);
  • 动态条件查询

在条件中设置不为空或者不为null才能添加条件即可。

LambdaQueryWrapper<Emp> wrapper = new LambdaQueryWrapper<Emp>()
    .eq(!"".equals(vo.getEmpEmail()), Emp::getEMail, vo.getEmpEmail())
	.eq(!"".equals(vo.getEmpName()), Emp::getName, vo.getEmpName())
	.eq(!"".equals(vo.getEmpPhone()), Emp::getMobilePhone, vo.getEmpPhone())
	.eq(!"".equals(vo.getEmpPosition()), Emp::getPosition, vo.getEmpPosition())
	.eq(!"".equals(vo.getStoreId()), Emp::getStoreId, vo.getStoreId())
	.eq(Emp::getUserId, userId);
  • 逻辑删除

逻辑删除并不是真的删除,而是添加了一个表示删除的字段,如果这个字段被标记为1,就表示被删除,如果这个字段被标记为0,就表示不被删除。之后进行查询也是通过这个删除字段确定查询内容。

在这里插入图片描述

设置完逻辑删除字段以及加上注解之后,接下来使用deleteById方法,不会将记录删除,只会将逻辑删除字段的值置为1。查询时也会默认自动加上逻辑删除字段的条件,只会查询逻辑删除为1的内容。

如果有太多实体,也可以在springboot的配置文件中添加全局配置,将所有实体中的对应字段都设置为逻辑删除字段。实体中就不用加上注解了。

在这里插入图片描述

  • 复杂逻辑查询

虽然mp主要是为了简化sql语句,但是对于复杂的逻辑,还是要写sql语句的。

所以仍然可以使用在接口中定义方法进行注解的方式查询,仍然可以使用sql映射文件编写复杂的逻辑。

3、字段映射以及表名映射

这一部分主要是应用于实体类中的。

  • 表名映射

在实体类名上方使用@TableName(“数据库中的表名称”)来进行映射。

  • 字段映射

在实体类的属性(非主键)上方使用@TableField(字段名,被查询时是否展示,在表中是否存在)

在实体类的属性(主键)上方使用@TableId(字段名,type=id生成方式)

id生成方式可以自己指定。具体有以下类型:

在这里插入图片描述

注意选择雪花算法生成id类型要是long。不然存不下。

除了在注解中指定使用id生成策略以外,可以使用在springboot的配置文件中设置全局配置:

在这里插入图片描述

3、代码生成器
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

/**
 * @author
 * @since
 */
public class CodeGenerator {

    @Test
    public void run() {

        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
//        String projectPath = System.getProperty("user.dir");
        //生成代码的位置
        gc.setOutputDir("目录");
        //gc.setOutputDir("D:\\IDEA2020\\Project\\2023fuchuang\\system\\intelligent_schedule_system-master\\service\\schedule_service" + "/src/main/java");
        gc.setAuthor("作者名");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        gc.setServiceName("%sService");	//去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER_STR); //主键策略
        gc.setDateType(DateType.ONLY_DATE); //定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localHost/iss_schedule?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.iss");//包名
        pc.setModuleName("schedule"); //包名
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        //要生成的表
        strategy.setInclude("schedule_search");
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
        mpg.setStrategy(strategy);

        // 6、执行
        mpg.execute();
    }
}

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

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

相关文章

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十六:统计报表模块相关功能实现

一、本章内容 本章使用Echarts及DataV实现常用图表、特殊图表、地图及综合图表等图表展示功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址: 基于VUE3+Layui从

Adobe InDesign各版本安装指南

下载链接 https://pan.baidu.com/s/11sTpMUbQEXhyjpkBlixcLg?pwd0531 #2024版 1.鼠标右击【Ai2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Ai2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以…

支付宝、学习强国小程序input、textarea数据双向绑定

前言 和 vue 的绑定有些区别&#xff0c;需要注意。直接 value"{{inputValue}}" 是无法双向绑定的。 正确思路 文档说的比较详细&#xff0c;不过没有组合使用的案例&#xff0c;需要自行理解。这里正确的方法是先用 value 绑定数据&#xff0c;再使用 onInput 事件…

docker安装及入门

笔记来自黑马课堂&#xff1a;【黑马程序员Docker快速入门到项目部署&#xff0c;MySQL部署Nginx部署docker自定义镜像DockerCompose项目实战一套搞定-哔哩哔哩】 https://b23.tv/niWEhEF 一、什么是docker&#xff1a; 快速构建、运行、管理应用的工具。--帮助我们快速部署提…

【数字电路】期末速通!

1. 数制及转换 常用的数制&#xff1a;十进制&#xff08;D&#xff09;&#xff0c;二进制&#xff08;B&#xff09;&#xff0c;八进制&#xff08;O&#xff09;&#xff0c;十六进制&#xff08;H&#xff09;。 常见的码制包括以下几种&#xff1a; 二进制码&#xff…

不看后悔!UPS监控技术轻松搞定

在现代信息技术高度依赖的环境中&#xff0c;机房的稳定供电是确保业务连续性和数据安全的关键因素之一。不可预测的电力波动、突发性停电或电力故障可能对关键设备和数据造成严重影响。 因此&#xff0c;为了有效地监控和管理机房的电源系统&#xff0c;UPS监控系统变得至关重…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件&#xff1a; PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…

动态规划--使用最小花费爬楼梯

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本体题目链接https://leetcode.cn/problems/GzCJIP/ 示例图示 本题动态规划解释 动态规划&#xff0c;如果真要清楚理解的话&#xff0c;可能一开始学习不太可能&#xff0c;专有名词太多&#xff0c;我们就先简单理解。 …

自己动手做 chatgpt:seq2seq翻译模型中GRU模块的原理和数据预处理

chatgpt 是典型的 NLP 类型应用。也就是它主要于语言的处理和输出。因此它的模型设计必然借鉴了深度学习早期在语言翻译方面的算法设计。因此理解 chatgpt 我们就需要理解深度学习算法是如何处理自然语言翻译这个问题&#xff0c;就像学习微积分时&#xff0c;我们需要提前掌握…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…

GoogleNet网络分析与demo实例

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 1. GoogLeNet网络详解 GoogLeNet在2014年由Google团队提出&#xff08;与VGG网络同年&#xff0c;注意GoogLeNet中的L大…

VGG网络分析与demo实例

参考自 up主的b站链接&#xff1a;霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGG&#xff08;Visual Geometry Group&#xff09;提出&#xff0c;斩获该年 Imag…

【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)

就是看到了好些教程有些繁琐&#xff0c;我就写了一个 我这个解压安装的交叉编译环境是Linaro GCC的一个版本&#xff0c;可以用于在x86_64的主机上编译arm-linux-gnueabihf的目标代码 步骤来了 在你的Ubuntu系统中创建一个目录&#xff0c;例如/usr/local/arm&#xff0c;然后…

day48算法训练|动态规划part09

198.打家劫舍 1. dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 2.递推公式 决定dp[i]的因素就是第i房间偷还是不偷。 如果偷第i房间&#xff0c;那么…

通信原理 | 通信中有哪些量的单位是dB?

在通信领域中,分贝(dB)被用来表示各种不同的量,包括 信号强度功率电压以下是通信中常用的几种用分贝表示的量: 信号强度(Signal Strength) 通信设备发送或接收信号时,信号的强度可以用分贝来表示,通常以分贝毫瓦(dBm)为单位。 0 dBm表示1毫瓦的信号强度,负值表示…

Wafer晶圆封装工艺介绍

芯片封装的目的&#xff08;The purpose of chip packaging&#xff09;: 芯片上的IC管芯被切割以进行管芯间连接&#xff0c;通过引线键合连接外部引脚&#xff0c;然后进行成型&#xff0c;以保护电子封装器件免受环境污染&#xff08;水分、温度、污染物等&#xff09;&…

基于ssm出租车管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

【视觉实践】使用Mediapipe进行图像分割实践

目录 1 Mediapipe 2 Solutions 3 安装依赖库 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道的框架,用于处理视频、音频等时间序列数据。与资源消耗型的机…

Linux开发工具——gcc篇

gcc的使用 文章目录 gcc的使用 历史遗留问题&#xff08;普通用户sudo&#xff09; gcc编译过程 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&a…

使用 OpenTelemetry 和 Loki 实现高效的应用日志采集和分析

在之前的文章陆续介绍了 如何在 Kubernetes 中使用 Otel 的自动插桩 以及 Otel 与 服务网格协同实现分布式跟踪&#xff0c;这两篇的文章都将目标聚焦在分布式跟踪中&#xff0c;而作为可观测性三大支柱之一的日志也是我们经常使用的系统观测手段&#xff0c;今天这篇文章就来体…