mybatis-plus基本使用流程以及进阶操作

news2024/11/27 15:45:22

参考

https://www.bilibili.com/video/BV1dQ4y1A75e?p=7&vd_source=6346698154746eb5026e16499e253fe8

使用流程

一、 准备工作

3.引入依赖 4.插件

spring-boot-starter

spring-boot-starter-test

mybatis-plus-boot-starter

MySQL

lombok:用于简化实体类的创建(生成get和set方法,我们只需要指定属性名),可以根据数据库表生成实体类。 此外它还要安装配套的lombok插件。

5.使用配置文件 application.properties配置spring boot

1、配置使用哪个数据库,账号密码等。

2、打开mybatis的sql执行日志。

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

效果:

二、创建实体类entity(可使用代码生成器,见另一篇文章)

也可叫pojo,bean

存放表的实体类,使用lombok的@Data注解就能生成set、get方法。

三、创建mapper(可使用代码生成器)

mapper存放对于某个该表的一些操作,里面通常都是一些接口和接口的实现(实现不需要,mybatis会自动创建,我们只需要定义接口)也就是dao层(直接与数据库进行交互)

命名一般就是表名+mapper

mapper的写法

可以继承Basemapper<实体类名>,里面写好了很多的接口,不需要我们一个一个写了

mapper实现

3.1首先我们要定义mapper的接口

就是对于表有哪些操作

法1:使用了mybatisplus提供的BaseMapper

这里需要将User填入泛型,里面泛型都以User对象进行传入参数,返回。

里面包含了所有操作的接口,比如insert、delete等等,我只要新建一个类继承泛型就可以。

法二:自己写

3.2让mybatis实现接口且创建对象

实现接口需要让mybatis知道这个接口类是一个mapper,添加mapper标签让spring扫描到告诉mybatis这是一个mapper,让Spring框架能够自动扫描并生成该接口的实现类的实例这样就不需要写mapper映射文件(XML)或者在接口中使用注解来定义SQL语句。

Mapper相较于controller和service、entity最大的区别就是mapper我们只定义接口,实现要在项目启动时靠框架自动生成。

法1.可以在每一个mapper接口上加一个@Mapper注解

@Mapper (注解来自mybatis)

作用:用在接口类上,在编译之后会生成相应的接口实现类

位置:对应的某个接口类上面

@Mapper
public interface EmployeeMapper {
    public Employee getEmpById(Integer id);
    public void insertEmp(Employee employee);
}

Spring注解扫描初始可以扫描启动类所在包及其子包下的所有文件。mapper文件夹是默认可以扫描到的,因此不需要额外添加注解扫描。(已验证)

法2:使用@MapperScan

如果每个接口类 都要 @Mapper 注解,是重复而无聊的工作,解决这个问题用 @MapperScan

可以在启动类前添加注解,指明mapper文件夹。使用@MapperScan,@MapperScan等价于mapper包下的所有的类都将打上@Mapper注解。

3.3 将mapper的实现类创建对象,交给spring管理(可不写)

实现后使用

@service

@Repository

这三个是一样的,只是写法不同

等任何一个来修饰就行,都是为实现类创建一个bean对象,但上面的实现类是mybatis自己创建的,会自动创建默认对象,所以我们可以不加@Repository等,加上仅仅是为了让idea不报错

比如UerService类会自动创建一个叫uerService的对象,我们也可以自命名。

详细参考spring博客

3.4 使用mapper之前需要先进行注入(自动装配)

自动装配实际上就是一个赋值操作

就比如如下的代码

UserDao是一个接口,有一个实现类UserDaoImpl继承了UserDao,对其进行实现。

我在service层肯定调用的是userDaoImpl对象(该对象已经在应用启动时被创建了),但此时我为了解耦合定义的是UserDao类,那么我的userDao如何得到userDaoImpl呢?此时要用到自动装配,进行一个赋值操作

@Autowired
private UserDao userDao

可以看做

private UserDao userDao=userDaoImpl

这也就是为什么说自动装配实际上就是一个赋值操作。

@Autowired

根据类型进行注入,UserDao类型的实现类是UserDaoImpl,它的对象userDaoImpl就是唯一一个属于UserDao类型的,因此可以按照类型找到唯一确定的实现类的对象一般一个类只会有一个bean对象,所以我们只需要用@Autowired 进行自动填充即可。

@Qualifier

根据对象名称进行注入

这个@Qualifier注解的使用,必须和上面@Autowired一起使用,此注解不能单独使用(挺奇怪的,只按名称应该也能找到唯一的啊)

也就是@Autowired先把该类型的实现类全部得到,然后@Qualifier再根据对象名进行进一步的筛选,此时就可以筛选到一个唯一满足条件的了。

比如我UserDao有两个实现类,创建了两个对象userDaoImpl1和userDaoImpl2,此时使用@Autowired这两个对象都满足条件,然后再@Qualifier 指定名字比如

此时就可以找到唯一的一个实现类对象了。

@Resource

可以按类型,也可以按名称(按名称可以单独使用)

但@Resource不是spring提供的注解,因此不是很推荐使用。

四、之后就可以调用mapper对象操纵数据库了

mapper添加操作

添加-延伸:主键生成策略

生成策略的配置见视频

主键策略 (1)ID_WORKER 是MyBatis-Plus默认的主键策略是, 全局唯一ID ,生成19位值,要求主键类型是long型 参考资料:分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html

(2)ID_WORKER_STR

是MyBatis-Plus默认的主键策略是, 全局唯一ID,生成19位值,要求主键类型是string型

(3)自增策略 要想主键自增需要配置如下主键策略 需要在创建数据表的时候设置主键自增 实体字段中配置 @TableId(type = IdType.AUTO)

@TableId(type = IdType.AUTO)
private Long id;

要想影响所有实体的配置,可以设置全局主键配置

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

(4) INPUT和NONE

我们要自己设置id,不手动设置就报错。

(5) UUID

随机唯一值

修改操作

直接新建对象填入属性值进行更新即可,不更新的属性置为空,mp会自动识别,不更新这些属性。

自动填充

第一步在实体类里面进行自动填充属性添加注解

Insert是指在insert操作时启动自动填充

INSERT_UPDATE是指在insert 和update操作时启动自动填充

字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段

第二步创建自动填充类,实现接口MetaObjectHandler实现接口里面的方法

该类的函数会在指定的sql操作时触发

  1. 注意要让spring创建对象,使用任意注解

  1. metaObject记录了元数据也就是操作的表的名称字段等信息

  1. filedname指的是属性名

  1. insertFill在执行insert操作时生效,insert要同时修改createTime和updateTime

  1. updateFill在执行updateFill操作时生效,修改updateTime

注意事项:

  • 填充原理是直接给entity的属性设置值!!!

  • 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null

  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充(也就是我们一旦手动设定了值(无论手动设定的是null,初始化对象属性为null不算手动设定,还是其他值),默认填充会失效)

  • 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入

  • 要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法

  • 不需要根据任何来区分可以使用父类的fillStrategy方法

  • 自动填充不要和mysql里的默认填充同时使用,比如属性id既在mysql和mybatis同时添加默认值1是不可以的。

疑问:该handler会不会对其他表生效,并没有指定生效的表啊?(应该是会生效的)

mybatis与mysql映射

表名、属性映射

比如我有一个表user

那么实体类要命名为User,否则找不到对应的表,mapper命名为UseMapper

如果是表user_info的话,mysql的下划线命名法统一换为java的驼峰命名法,即user_info实体类UserInfo,对属性也是一样的道理比如属性user_name,在java中要写成userName,这样才能默认找到对应。

数据类型映射

Date是util下的Date,用哪个好像都行

mybatis乐观锁,悲观锁

悲观锁

就是串行

乐观锁:

让同时启动的事务只有一个能将该条数据修改成功。(解决丢失更新问题)

通过版本来进行控制,lucy先读该数据为1版本,要写入的版本为1+1=2版本,写入前再查一下该数据版本还为1,因此可以更新该数据。mary他最开始看这条数据为1版本,它也要将其修改为2版本,但写入钱再看该数据,此时版本已经为2了,说明有其他事务已经改过这个值了,所以要放弃修改。

比如买票问题,我有一张票 数据:票id userid,多个人支付,相当于多个人开启了事务,谁手速快支付成功,可以进行修改,将userid改为自己的id,其他人就没有修改该条数据的权利了,因此都会支付失败。

乐观锁使用步骤

还可以加一个初始值的创建

我们只需要给一个初始值即可,后面他的变化由框架控制

简单查询

分页操作

逻辑删除

逻辑删除删除掉,也就是delete置为1。配置好之后所有的删除命令都将变为逻辑删除,

此时我们在查询或者其他操作时mybatis会自动加上where delete=0的限定语句,保证delete为1的不再被查询或修改。但是我们这样就无法通过mybatis查询到被产出的条目了,想要查到就必须写原生的sql语句。

不管是逻辑删除(添加deleted),还是锁(添加version),都遵循添加表字段,配置实体类属性(以及注解),配置插件三个步骤

mybatis获取参数 占位符获取 #{}

底层就是PreparedStatement的实现,先将要替换的位置都变为?也就是PreparedStatement常用的形式,对字符串应用setString,对int用setInt等等进行填充,达到效果。

占位符可以防止sql注入具体看

https://blog.csdn.net/yan465942872/article/details/6753957

因为setString方法可以智能的1 .为字符串前后加上单引号(因为之前有一个双引号需要去掉,所以实际上就是将双引号变为单引号),2.并为内部的一些特殊符号进行转义比如

pstmt = conn.prepareStatement("delete from user where user.id=?");
pstmt.setString(1, "'w' or '2'='2'");

如果是字符串拼接的话会变成

delete from user where user.id='w' or '2'='2';

这显然会发生sql注入,不好。

占位符的话会变成

delete from user where user.id=’\'w\' or \'2\'=\'2\'';

因为setString方法可以智能的为字符串前后加上单引号,并为内部的特殊符号进行转义,内部的单引号全部进行了转义,此时sql注入就会失效了

如果是数字的话更简单点,就是转成字符串直接拼接就好了

pstmt = conn.prepareStatement("delete from user where user.id=?");
pstmt.setInt(1, 1);
结果
delete from user where user.id=1

直接拼接 ${}

直接进行字符串的拼接

"delete from user where user.id="+"'w' or '2'='2'"

变为
”delete from user where user.id='w' or '2'='2'"

这时字符串里的单引号就能起到分割的作用了,会导致sql注入了,因此能用占位符要优先使用。

拼接可以理解成最外面的双引号的融合。或者说是去掉内部的双引号,只留外面的一对。

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

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

相关文章

查看 PostgreSQL 中的表定义和说明

要查看 PostgreSQL 中的表定义和说明&#xff0c;您可以使用以下命令&#xff1a; 1. 查看表定义&#xff1a; \d <table_name>例如&#xff0c;要查看 pg_extension 表的定义&#xff0c;您可以运行以下命令&#xff1a; \d pg_extension2. 查看表说明&#xff1a; …

山东移动:全业务域核心系统升级,实现大幅降本增效

本文介绍了山东移动引入 OceanBase 到山东省 BOSS/CRM 核心系统领域的相关情况。欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 中国移动通信集团山东有限公司&#xff08;以下简称"山东移动"&#xff09; 隶属于中国移动通信集团公司…

【刷题之路】LeetCode 232. 用栈实现队列

【刷题之路】LeetCode 232. 用栈实现队列 一、题目描述二、解题1、图解主要思路2、先实现栈3、实现各个接口3.1、初始化接口3.2、入队接口3.3、出队接口3.4、取队头接口3.5、判空接口3.6、释放接口 一、题目描述 原题连接&#xff1a; 232. 用栈实现队列 题目描述&#xff1a;…

Babylon.js大规模场景优化实践

在本文中&#xff0c;我们将重点介绍用于优化 Babylon.js 海港场景的优化和架构技术。 我们的场景总共有超过 600 个网格和 1,000,000 个顶点。 在我们的 2018 Macbook Pro 上&#xff0c;它在 Google Chrome 中始终以 45 FPS 的速度运行。 我们发现 Firefox 约为 40 FPS&#…

公厕卫生间除臭杀菌空气净化解决方案

人每天平均大约有80%以上时间是在室内度过&#xff0c;室内空气同时面临着化学污染、物理污染和生物污染&#xff0c;据统计室内污染比室外高5~10倍&#xff0c;因此室内空气质量问题对人的伤害比室外污染更大。常见的空气污染有病毒、烟雾、甲醛、细菌、PM2.5等&#xff0c;如…

淘宝商品详情数据采集,支持高并发请求

一、如何通过手动方式查看阿里巴巴商品详情页面的数据 1.淘宝天猫商品详情 API 接口&#xff08;item_get - 获得淘宝商品详情接口&#xff09;&#xff0c;淘宝API 接口代码对接可以获取到宝贝 ID&#xff0c;宝贝标题&#xff0c;价格&#xff0c;优惠价&#xff0c;掌…

C++优化方法

C优化方法 文章目录 C优化方法1.整数运算效率高于浮点2.除法和取余4.通过2的幂次进行除法和取余数5.使用数组下标6.全局变量->局部变量7.指针值不改变的->拷贝到局部变量8.变量类型9.局部变量10.指针11.指针链12.条件执行13.布尔表达式和范围检查14.布尔表达式和零值比较…

【UE4 像素流 WEBUI插件】部署像素流

目录 一、单实例本地像素流送 步骤 1. 勾选插件 2. 打包工程并启动信令服务器 3. 创建快捷方式并启动游戏 二、单实例局域网像素流送 步骤 1. 编辑cirrus.js 2. 编辑快捷方式属性 3. 启动 三、集成WEBUI插件 一、单实例本地像素流送 步骤 1. 勾选插件 勾选使用“Pix…

数字化时代下,企业如何利用数字化提升企业竞争力?

在数字化时代的今天&#xff0c;企业越来越意识到数字化的重要性。数字化已经成为企业竞争的关键。在数字化时代下&#xff0c;企业的竞争力也已经从传统的硬实力向软实力转变。企业需要利用数字化技术来提高竞争优势&#xff0c;从而在激烈的竞争中脱颖而出。 目前&#xff0c…

Mysql_行锁、临键锁、间隙锁的理解

目录 行锁间隙锁临键锁总结 行锁 行锁&#xff0c;也称为记录锁。 当我们针对主键或者唯一索引加锁的时候&#xff0c;Mysql默认会对查询的这一行数据加行锁&#xff0c;避免其他事务对这一行数据进行修改。 间隙锁 间隙锁&#xff0c;顾名思义&#xff0c;就是锁定一个索引…

浅谈作为程序员如何写好文档:结构化写作

我作为从一名懵懂的实习生转变为工程师的工作经历中&#xff0c;伴随着技术经验的成长&#xff0c;也逐渐意识到了编写文档是知识和经验传递给其他人的最有效方式。通过文档&#xff0c;可以分享我的技术知识和最佳实践&#xff0c;使其他人更好地理解我的工作。在这里&#xf…

图解 SQL 执行顺序,清晰明了

这是一条标准的查询语句: 这是我们实际上SQL执行顺序&#xff1a; 我们先执行from,join来确定表之间的连接关系&#xff0c;得到初步的数据 where对数据进行普通的初步的筛选 group by 分组 各组分别执行having中的普通筛选或者聚合函数筛选。 然后把再根据我们要的数据进行…

alias设置快捷键vim使用说明(解决服务器上输入长指令太麻烦的问题)

1. vi ~/.bashrc打开 2. (watch -n 1 gpustat 查看gpu使用情况 太麻烦)输入i进行编辑&#xff0c;最后一行输入 alias watchgpuwatch -n 1 gpustat alias gpuwatch -n 1 gpustat alias torch180source activate torch180 3. 按esc&#xff0c;然后输入:wq保存退出 4. source…

多轴加工-可变轴轮廓铣_刀轴控制策略

可变轴轮廓铣_刀轴 刀轴是可变轴轮廓铣最重要的核心参数之一&#xff0c;控制好刀轴对生成的刀路质量至关重要。UG NX可变轴轮廓铣提供了非常丰富的刀轴控制方法&#xff0c;常用的包括远离/朝向直线&#xff08;点&#xff09;、相对于/垂直于驱动体、侧刃驱动体、插补等&…

在Apex中获取Site URL

Foreword 目前SF暂未提供直接有效的方法在Apex获取SiteURL&#xff0c;我们可以在Idea (Access URL for a Site or Community from Apex)页面投票&#xff0c;除了下面提供的一种hack思路&#xff0c;当然也可以通过Custom Label手动维护。 Format of Site URL Sandbox site …

如何搭建自己的写作素材库,快来学,方法高效简单

我们平时看过的书&#xff0c;做过的事&#xff0c;不及时记下来&#xff0c;很可能过几天就忘记了。由此看来&#xff0c;搭建自己的写作素材库非常有必要。尤其是写作者&#xff0c;写稿的速度取决于自己写作素材的储备量&#xff0c;你储备的素材越多&#xff0c;写作时便可…

【算法学习系列】01 - 求某个数组中的任意两个位置之间的累加和

文章目录 背景解决思路代码实现 背景 已经呆在自己的舒适圈有很长一段时间了&#xff08;公司快3年了&#xff0c;业务都熟的差不多了&#xff09;&#xff0c;决定开始改变&#xff08;任何时候都不晚&#xff09;&#xff0c;尝试学习解决一些算法题&#xff0c;给自己一些适…

自媒体可以去哪里找免费图片素材?

推荐6个超好用的图片素材网站&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 菜鸟图库是一个综合性素材网站&#xff0c;站内有大量的设计、自媒体等相关素材&#xff0c;像图片素材就非常…

Linux篇2

Linux 0. 终端提示信息1. 文件目录结构1.1 文件目录 2. 文本编辑器VI/VIM2.1 VIM编辑器2.1 一般模式2.2 编辑模式2.3 命令模式 3. 网络配置3.1 VMware提供的三种网络连接模式3.2 静态配置网络IP地址3.3 配置主机名3.3.1 修改主机名3.3.2 配置主机名-IP地址映射关系&#xff1a;…

离散化详解

一.概念 把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。通俗的说&#xff0c;离散在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 二.适用范围 数组中元素值域很大&#xff0c;但个数不是很多。 比如将a[][1,3,100,2000,…