SpringBoot中使用MyBatis-Plus详细介绍

目录

一、MyBatis-Plus的使用步骤

1.引入MybatisPlus的起步依赖

2.定义Mapper(也叫dao)层的接口

3.MyBatis-Plus中常用注解

4. 使用MyBatis-Plus时要做如下配置

5.条件构造器 Wrapper


一、MyBatis-Plus的使用步骤

1.引入MybatisPlus的起步依赖

MyBatisPlus官方提供了starter依赖包,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。
因此我们可以用_MybatisPlusstarter_直接代替Mybatisstarter:

<!--Mybatisplus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>
2.定义Mapper(也叫dao)层的接口

用我们自定义的dao接口继承MybatisPlus提供的BaseMapper接口:

public interface UserMapper extends BaseMapper<User>?{
}

在该接口中,提供了许多基本的sql增删改查方法,我们无需写sql语句,直接调用这些方法即可完成对数据的增删改查;

3.MyBatis-Plus中常用注解

MyBatisPlus会通过扫描实体类,并基于反射获取实体类的属性名称,然后匹配到数据库表中相应字段。具体关系如下图:

因此,我们在定义实体类和数据库表时,应该遵循MP中一些默认的约定(规范)来确保字段名和属性名正确的匹配到。约定如下:

  • 类名:蛇峰转下刘线作为表名
  • 名为id的属性:作为表中的主键
  • 变量名:陀峰转下刘线作为表的字段名

如果在写Java代码时,我们某些代码不想符合上述三条约定的写法;也可以使用MP中的常见注解来自定义约定,如下:

4. 使用MyBatis-Plus时要做如下配置

(1)如果是在Spring Boot 工程中,要配置Mapper接口所在的包:在Spring Boot的启动类上添加**@MapperScan**注解,并指定Mapper接口所在的包路径。

@SpringBootApplication
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class Application {
?? ?public static void main(String[] args) {? ? ? ?SpringApplication.run(Application.class, args);?  }
?
}

注意:在该例子中:**“com.baomidou.mybatisplus.samples.quickstart.mapper”**是 MyBatis-Plus 官方示例项目中的一个包路径,用于存放示例的 Mapper 接口。在实际应用中,你应该将@MapperScan注解中的字符串参数替换为你自己的项目中 Mapper 接口所在的包路径。

(2)在Spring MVC工程中使用MyBatis-Plus要做如下配置

①首先,在.xml配置文件中配置 MapperScan 注解:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">? ?<property name="basePackage" value="com.baomidou.mybatisplus.samples.quickstart.mapper"/>
</bean>

②然后,调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">? ?<property name="dataSource" ref="dataSource"/>
</bean>

③通常来说,一般的简单工程,通过以上配置即可正常使用 MyBatis-Plus,具体可参考以下链接:? Spring Boot 快速启动示例 ? Spring Boot 快速启动示例,

? ?Spring MVC 快速启动示例 ? ?Spring MVC 快速启动示例。

同时 MyBatis-Plus 提供了大量的个性化配置来满足不同复杂度的工程,大家可根据自己的项目按需取用,详细配置请参考链接:

使用配置[这里是图片004]https://baomidou.com/reference/

Spring Boot 配置

在 Spring Boot 项目中,可以通过 application.ymlapplication.properties 文件来配置 MyBatis-Plus。

yml配置文件中MyBatisPlus的配置项继承了MyBatis.原生配置和一些自己特有的配置。例如:

mybatis-plus:type-aliases-package: com.yzx.xxx.po #别名扫描包mapper-locations: "classpath*:/mapper/**/*,Xml" #Mapper.Xml文件地址configuration:map-underscore-to-camel-case: true #是否开启下划线和驼峰的映射cache-enabled: false #是否开启二级缓存global-config:db-config:id-type: assign_id #id为雪花算法生成update-strategy: not_null #设置更新策略:只更新非空字段
?

代码中globa-config下的配置表示全局其优先级小于实体类中注解的优先级。

如下图:

Spring MVC 配置

在传统的 Spring MVC 项目中,可以通过 XML 配置文件来配置 MyBatis-Plus。

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">? ?<property name="dataSource" ref="dataSource"/>? ?<property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>? ?<property name="typeAliasesPackage" value="com.your.domain"/>? ?<!-- 其他配置 -->
</bean>
5.条件构造器 Wrapper

前提:BaseMapper接口中自带的增删改查方法都是通过数据的Id作为条件进行的;如果想要自定义查询条件则需要用到条件构造器:Wrapper

Wrapper类与其字类的继承关系如下:

Wrapper类中提供的,用于自定义构建查询条件的一些方法:

下面,我们以最常用的QueryWrapper(查询条件构造器)为例,来演示如何使用条件构造器来构造我们的sql查询

**QueryWrapper(查询语句的条件构造器):**它拓展了select的功能,可以指定查找哪些字段:

使用方法:

  1. 首先,构造一个Wrapper对像,并通过该对象来编写查询条件
  2. 然后,将刚刚创建的Wrapper对象作为参数传入查询方法中

例如我们要进行一个如下的sql查询:

查询出名字中带o的,存款大于等于1000元的人的id、用户名(username)、信息(info)和收入(balance)

SQL语句如下:

SELECT id,username,info,balance
FROM user
WHERE username LIKE '%o%'
AND balance >= 1000;

QueryWrapper(条件构造器)来实现上述SQL语句的代码如下:

@Test
public void testQuerywrapper(){//1.构建查询条件QueryWrapper<user> wrapper = new QueryWrapper<user>().select("id","username","info","balance").like("username","o").ge("balance",1000);//2.查询List<user> users = userMapper.selectList(wrapper);
}

条件构造器Wrapper中的函数所对应的sql语法,具体对应表如下:

**另外:**在 MyBatis-Plus 中的IService接口是对service层的一个加强,继承了IService接口的service会自带一些方法:(感兴趣的小伙伴可以自行探索)

其中:save()方法是一个非常重要的功能,它用于将实体对象保存到数据库中。具体地说,save 方法会根据实体对象的 ID(主键)来决定是执行插入(insert)操作还是更新(update)操作。

  • **插入操作:**如果传入的实体对象的 ID 为空(即该对象在数据库中尚不存在),save 方法会执行插入操作,将该对象插入到数据库中,并自动生成一个 ID(如果使用了自动增长的主键策略)。

  • **更新操作:**如果传入的实体对象的 ID 不为空(即该对象在数据库中已经存在),save 方法会执行更新操作,将该对象的属性更新到数据库中对应的记录上。这里需要注意的是,MyBatis-Plus 默认只会更新非空属性,即如果实体对象的某个属性为 null,则不会将该属性更新到数据库中(除非你进行了特殊的配置)。

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

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

相关文章

vue3读取webrtc-stream 视频流

一.首先下载webrtc-stream&#xff0c;方便自己本地搭建视频流服务 https://download.csdn.net/download/cyw8998/90373521 解压后&#xff0c;启动命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代码如下 <template><h1>video</h1><video id&…

vue3搭建实战项目笔记二

vue3搭建实战项目笔记二 2.1.git管理项目2.2.隐藏tabBar栏2.2.1 方案一&#xff1a;在路由元信息中设置一个参数是否显示tabBar2.2.2 方案二&#xff1a;通过全局设置相对定位样式 2.3.项目里封装axios2.3.1 发送网络请求的两种做法2.3.2 封装axios并发送网络请求2.3.2.1 对axi…

USC 安防平台之移动侦测

随着第四次科技革命的开启&#xff0c;AI技术获取了突飞猛进的发展&#xff0c;视频监控对应的视频分析技术也获取了巨大的发展。 还记得15年前采用人工提取特征做前景背景分离和提取&#xff0c;大部分依赖CPU&#xff0c;最多使用一下TI的DM642 DSP加速&#xff0c;开发难度…

Unity CommandBuffer绘制粒子系统网格显示

CommandBuffer是 Unity 提供的一种在渲染流程中插入自定义渲染命令的机制。在渲染粒子系统时&#xff0c;常规的渲染流程可能无法满足特定的渲染需求&#xff0c;而CommandBuffer允许开发者灵活地设置渲染参数、控制渲染顺序以及执行自定义的绘制操作。通过它&#xff0c;可以精…

【天地图】绘制、删除点线面

使用天地图绘制、删除点线面 实现效果图地图组件完整代码使用地图组件完整代码 实现效果图 地图组件完整代码 // 天地图组件 <template><div class"map-container"><div id"mapCon"></div></div> </template><scri…

Java八股文详细文档.2(基于黑马、ChatGPT、DeepSeek)

通过B站黑马程序员的八股文教学&#xff0c;自己也二刷了&#xff0c;结合ChatGpt、deepSeek总结了一下,Java八股文详细文档.2&#xff08;Redis篇和消息中间件篇&#xff0c;还没有写完&#xff0c;这只是一部分&#xff09; Java八股文详细文档.1&#xff08;包含JVM篇、数据…

简述 tsconfig.json 中 rootDir 和 include 之间的关系

tsconfig.json 中的 rootDir 和 include 之间有一定的关系&#xff0c;但它们的作用是不同的。理解它们的关系可以帮助你更好地配置 TypeScript 项目。 1. rootDir 的作用 rootDir 用于指定 TypeScript 编译器&#xff08;tsc&#xff09;的“根目录”。它的主要作用是&#x…

如何在Spring Boot中使用Profiles实现环境隔离

文章目录 如何在Spring Boot中使用Profiles实现环境隔离什么是Spring Profiles1.基本概念2.配置管理3.使用场景4.条件化配置5.优点Spring Profiles的基础知识1.Profile的定义2.配置文件3.激活Profiles4.条件化配置5.Profile的优先级与合并6.Profiles的最佳实践配置文件的组织1.…

SpringBoot使用TraceId日志链路追踪

项目场景&#xff1a; ??有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。为了解决这个痛点&#xff0c;就使用了TraceId&#xff0c;根据TraceId关键字进入服务…

微信小程序网络请求封装

微信小程序的网络请求为什么要封装&#xff1f;封装使用有什么好处&#xff1f; 封装的目的是为了偷懒&#xff0c;试想一下每次都要wx.request&#xff0c;巴拉巴拉传一堆参数&#xff0c;是不是很麻烦&#xff0c;有些公共的参数例如header&#xff0c;baseUrl是不是可以封装…

Element Plus table 去除行hover效果

需求&#xff1a; 给table的指定行设置高亮背景色且去除掉这些行的hover效果 思路&#xff1a; 给指定行设置css类名选择需要设置高亮的行的单元格&#xff0c;设置鼠标禁用属性让高亮行继承父元素的背景色 考虑到表格的第一列是勾选框&#xff0c;因此仅选择 tr 下除了第一…

认识vue-admin

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发&#xff1a;基于已有的代码&#xff08;项目工程&#xff0c;脚手架&#xff09;开进行新功能的开发 所以看懂已有的框架中的既有代码&#xff0c;变得很重要了 1. 背景知识 后台管理系统是一种最…

无人机航迹规划:孟加拉虎优化( Savannah Bengal Tiger Optimization ,SBTO)算法求解无人机路径规划MATLAB

一、孟加拉虎优化算法 孟加拉虎优化&#xff08; Savannah Bengal Tiger Optimization &#xff0c;SBTO&#xff09;算法模拟了孟加拉虎的群体狩猎行为&#xff0c;采用了猎物搜索、隐身接近和攻击狩猎三种策略。 参考文献&#xff1a; [1]Yujing Sun, Xingguo Xu. Savann…

sib报错:com.*.xctrunner is not in your device!

1、问题描述 在使用sonic集成IOS设备的时候,我们需要通过sonic-agent服务去识别IOS设备。但是在识别的时候提示如下问题: 本质就是在你这个设备中找不到这个设备也就是找不到WebDriverAgentRunner,但是确实安装了,甚至appium可以正常的调用。 或执行如下命令的时候报错:…

c++中什么时候应该使用final关键字?

在C中&#xff0c;final关键字是自C11标准引入的重要特性&#xff0c;主要用于类继承和虚函数重写机制的约束。下面从技术原理、使用场景和最佳实践三个维度进行系统分析&#xff0c;并给出工业级代码示例。 目录 一、技术原理深度解析 二、关键使用场景分析 1. 类级别的fi…

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型&#xff0c;本文将详细介绍整个过程&#xff0c;涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…

文件夹上传到github分支最后github上面还是没有文件和文件夹

环境&#xff1a; github 问题描述&#xff1a; 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案&#xff1a; 从 git ls-tree -r HEAD 的输出中可以看到&#xff0c;metahuman-stream 文件夹显示为如下内容&#xff1a; 160000 commi…

【JavaEE进阶】验证码案例

目 &#x1f332;实现说明 &#x1f384;Hutool介绍 &#x1f333;准备工作 &#x1f334;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f6a9;实现服务器后端代码 &#x1f6a9;前端代码 &#x1f6a9;整体测试 &#x1f332;实现说明 随着安全性的要求越来越⾼…

4G模块非必要,不关机!关机建议先进飞行模式

给4G模组VBAT断电关机&#xff0c;模组关机前未能及时退出当前基站&#xff0c;会有什么影响呢&#xff1f; 基站会误以为设备还在线&#xff0c;下次开机仍会拿着上次驻网信息去连基站。基站一看&#xff0c;上次链接还在——认为你是非法设备&#xff0c;拒绝链接&#xff…

Flutter中 List列表中移除特定元素

在 Dart 语言里&#xff0c;若要从子列表中移除特定元素&#xff0c;可以使用以下几种方法&#xff0c;下面为你详细介绍&#xff1a; 方法一&#xff1a;使用 where 方法创建新列表 where 方法会根据指定的条件筛选元素&#xff0c;然后通过 toList 方法将筛选结果转换为新列…