MyBatisPlus简单入门
1、简单介绍MyBatisPlus
MyBatisPlus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,完全去SQL化,封装好了大量的CRUD操作。甚至吧CRUD操作封装到了Service层,可以直接在Controller调用现成的CRUD服务层,极度舒适省心。
局限:只支持简单的CRUD操作,不支持多表操作(join、union、子查询),不支持GroupBy和各种函数。
2 初步使用
2.1 引入依赖
新建SpringBoot工程。引入依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency>
2.2 增加符合MyBatisPlus规范的Mapper和Service
@Repository
public interface EmployeePlusMapper extends BaseMapper<Employee>
{
}
@Service
public class EmployeePlusServiceImpl extends ServiceImpl<EmployeePlusMapper, Employee>
{}
2.3 指定Bean的主键属性为自增
public class Employee
{@TableId(value = "id",type = IdType.AUTO)private Integer id;
}
2.4 修改Controller
@RestController
public class EmployeePlusController
{@Autowired private EmployeePlusServiceImpl employeeService;@RequestMapping(value = "/emp")public Object handle1(String op,Integer id,String lastname,String gender,String email){//封装数据模型Employee employee = new Employee(id, lastname, gender, email);switch (op){case "select": if (id == null){return "必须传入员工id!";}else {Employee e = employeeService.getById(id);return e == null ? "查无此人!" : e;}case "insert" : employeeService.save(employee);return "操作完成!";case "update": if (id == null){return "必须传入员工id!";}else {employeeService.updateById(employee);return "操作完成!";}case "delete": if (id == null){return "必须传入员工id!";}else {employeeService.removeById(id);return "操作完成!";}default: return "请正确操作";}}@RequestMapping(value = "/getAllEmp")public Object handle2(){List<Employee> all = employeeService.list();return all;}
}
3、按条件查询
现在希望对id>3的男性员工执行查询和更新删除操作如下:
@SpringBootTest
public class MyTest
{@AutowiredEmployeeService employeeService;@Testpublic void testQuery(){//指定查询条件: id>2的男性员工QueryWrapper<Employee> wrapper = new QueryWrapper<Employee>().eq("gender", "male").gt("id", 2);//根据条件查询List<Employee> list = employeeService.list(wrapper);//指定更新条件UpdateWrapper<Employee> updateWrapper = new UpdateWrapper<Employee>().eq("gender", "male").gt("id", 4).set("gender", "female");//根据条件更新性别为女性employeeService.update(updateWrapper);//根据条件删除employeeService.remove(wrapper);}
}
4、MyBatisPlus模板生成器
虽然MyBatisPlus已经节省了sql编写的大部分工作,但是当面对几十上百个的处理的时候,仍然有大量的类模块要写,其中最大的工作量就是实体类的编写,如果手工还容易出错。
所以MyBatis-Plus还推出了代码生成工具https://github.com/baomidou/generator。
4.1 添加依赖
在pom.xml文件中添加代码生成工具
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.1</version>
</dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
4.2 编写生成器
编写生成器代码
public class MyGenerator
{public static void main(String[] args) {//指定为哪些表生成String[] tables={ "activity_info","activity_sku" };FastAutoGenerator.create("jdbc:mysql://hadoop102:3306/gmall","root","000000").globalConfig(builder -> {builder.author("atguigu") //作者.outputDir("D:\\repo\\221109\\mybatisplusdemo\\src\\main\\java") //输出路径(写到java目录).commentDate("yyyy-MM-dd").dateType(DateType.ONLY_DATE); //选择实体类中的日期类型 ,Date or LocalDatetime}).packageConfig(builder -> { //各个package 名称builder.parent("com.atguigu.mybatisplus")//.moduleName("governance").entity("bean").service("service").serviceImpl("service.impl").controller("controller").mapper("mapper");}).strategyConfig(builder -> {builder.addInclude(tables).serviceBuilder().enableFileOverride() //生成代码覆盖已有文件 谨慎开启.formatServiceFileName("%sService") //类后缀.formatServiceImplFileName("%sServiceImpl") //类后缀.entityBuilder().enableFileOverride().enableLombok() //允许使用lombok.controllerBuilder().enableFileOverride().formatFileName("%sController") //类后缀.enableRestStyle() //生成@RestController 否则是@Controller.mapperBuilder().enableFileOverride()//生成通用的resultMap 的xml映射.enableBaseResultMap() //生成xml映射.superClass(BaseMapper.class) //标配.formatMapperFileName("%sMapper") //类后缀.mapperAnnotation(Mapper.class) ; //生成代码Mapper上自带@Mapper}).templateConfig(builder -> {// 实体类使用我们自定义模板builder.entity("templates/myentity.java");}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();}}
4.3 自定义模块
以上生成代码主函数中有设计自定义模块。从idea中的jar包目录中找到jar包的模板。

拷贝到Resource/template目录下重命名为myentity.java.ftl,并吧第29,30行的修改
修改前:
…
<#if entityLombokModel>
@Getter
@Setter…
修改后:
……
<#if entityLombokModel>
@Data
……
之后重新运行生成器的代码,就可以根据自己的模板生成Bean。
注意:可以重复生成,是覆盖操作。
相关文章:
MyBatisPlus简单入门
1、简单介绍MyBatisPlus MyBatisPlus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,完全去SQL化,封装好了大量的CRUD操作。甚至吧CRUD操作封装到了Service层,可以直接在Controller调用现成的CRUD服务层,…...
神经网络入门
神经网络的基本骨架 1. nn.Module的使用 所有的模型都要继承 Module 类需要重写初始化函数和运算步骤函数 eg: import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module): # 继承父类Module def __init__(self): # 重写初始化函数super()…...
【面试经典150题】多数元素
🔗题目链接 ✈题目描述: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 ⌊ n/2 ⌋表示n/2结果向下取…...
c#垃圾回收(Garbage Collection)
在C#中,垃圾回收(Garbage Collection)是一种自动管理内存的机制。它负责跟踪和释放不再使用的内存,以便程序可以有效地使用内存资源。 C#中的垃圾回收器是由.NET运行时(CLR)提供和管理的。它使用了一种叫做…...
vue 基于element-plus el-button封装按钮组件
封装组件的原则是:组件只是数据流通的一个管道,不要糅合太多的逻辑在里面,是一个纯组件,还要根据自己项目的业务场景做具体的处理。 // MyButton.vue // 基于element-plus中el-button来封装按钮 <template><el-button c…...
smbus只能再python2.7下运行?不能再python3.8下运行吗?
不是的,SMBus并不只能在Python 2.7下运行,它也可以在Python 3.8及更高版本下运行。SMBus是用于访问系统上的I2C设备(Inter-Integrated Circuit,一种串行通信协议)的Python库,它应该与Python 3.8兼容。 要在…...
python中is和==的区别
is 和 的区别 在Python中,is和是两个用于比较对象的操作符,它们有不同的作用和用法。 is操作符: is用于比较两个对象的身份标识,即判断两个对象是否引用同一个内存地址的对象。当is操作符用于比较两个对象时,它会判断…...
Viobot回环使用
Viobot回环是使用词袋匹配的方式,,当新的关键帧能够匹配词袋里面记录过的关键帧时,触发回环,将设备的当前位姿拉到历史位姿。 一.上位机操作 词袋使用方法 连接上设备,先停止算法。UI上点 设置 选到 loop 选项卡&…...
React钩子函数之forward结合useImperativeHandle钩子的基本使用
React钩子函数是React框架中非常重要的一部分,其中forward和useImperativeHandle是两个常用的钩子函数。这两个钩子函数可以结合使用,用来实现一些高级的功能。 首先,让我们来了解一下forward钩子函数。它的作用是将父组件中的props传递给子…...
c++中移动语义和完美转发
C 中的移动语义和完美转发是 C11 引入的两个重要特性,它们分别用于提高性能和灵活性。 移动语义(Move Semantics): 移动语义允许有效地将资源(如堆上分配的内存或其他资源)从一个对象转移到另一个对象,而…...
【linux命令讲解大全】040. 文件操作:使用touch命令创建和更新文件
文章目录 touch补充说明语法选项参数示例 从零学 python touch 创建新的空文件或更新已存在文件的时间标签。 补充说明 touch命令具有两个功能: 更新已存在文件的时间标签为当前系统时间(默认方式),文件的数据保持不变。创建新…...
Redis之MoreKey问题及Scan命令解读
目录 MoreKey问题讨论 Scan命令 Sscan命令 Hscan命令 Zscan命令 MoreKey问题讨论 keys * 查看当前库所有key 对于海量数据执行key *会造成严重服务卡顿、影响业务。在实际环境中最好不要使用。生产制造过程中keys * / flushdb/flushall等危险命令以防止误删误用。 大量的…...
QA工具开发流程
前言 在项目上线前期,这边根据需求制作了一套QA测试工具。主要分为以下四个模块的测试**图1** **数值测试:**主要包括了角色的等级变更、游戏里货币的变更、(目前已制作的)游戏道具的数量变更。这些可能归一为一类测试模型**动画…...
JSON.toJSONString首字母大小写问题
前言 开发过程中遇到的,对象转字符串时,有个字段首字母是大写的,转换之后就变成了小写,在这里记录下 代码示例 String jsonString JSON.toJSONString(obj,SerializerFeature.PrettyFormat,SerializerFeature.WriteMapNullValue,…...
ant-vue1.78版a-auto-complete表单自动搜索返回列表中的关键字标红
a-auto-complete表单自动搜索返回列表中的关键字标红 通常在做关键字标红的场景,都是后端返回html结构,前端直接渲染实现,但是如果需要前端处理的话,实现也是很简单的,接下来我直接上应用场景吧 应用场景就是通过关键…...
Elasticsearch 优化
Elasticsearch 优化 2.1硬件选择 Elasticsearch 的基础是 Lucene ,所有的索引和文档数据是存储在本地的磁盘中,具体的 路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置,如下: #----------------------------…...
spring boot的自动装配原理
spring boot的自动装配原理 解释和使用关键技术思想总结 解释和使用 自动装配是什么:自动将第三方组件的bean装载到ioc容器里,不需要开发人员再去写bean相关的一些配置 spring boot怎么做:在启动类上加SpringBootApplication注解就可以实现自…...
走进低代码平台| iVX-困境之中如何突破传统
前言: “工欲善其事,必先利其器”,找到和使用一个优质的工具平台,往往会事半功倍。 文章目录 1️⃣认识走近低代码2️⃣传统的低代码开发3️⃣无代码编辑平台一个代码生成式低代码产品iVX受面性广支持代码复用如何使用? 4️⃣总结…...
【UIPickerView案例03-点餐系统之随机点餐 Objective-C语言】
一、先来看看我们这个示例程序里面,随机点餐是怎么做的 1.点击:“随机点餐”按钮 大家能想到,它是怎么实现的吗 1)首先,点击”随机点餐“按钮,的时候,你要让这个pickerView,进行随机选中,那么,得监听它的点击 2)然后呢,让pickeView选中数据, 3)然后呢,把那个…...
论文阅读_扩散模型_SDXL
英文名称: SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 中文名称: SDXL:改进潜在扩散模型的高分辨率图像合成 论文地址: http://arxiv.org/abs/2307.01952 代码: https://github.com/Stability-AI/generative-models 时间: 2023-…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
