MyBits的创建与使用

news2024/12/23 23:30:20

文章目录

  • 前言
  • MyBits的优点
      • 这里简单回忆下用JDBC的流程
  • MyBits的调用流程
    • MyBits的配置
    • 传递参数之# 与 $ 的区别
  • 当mysql与程序属性映射不一致时的解决方案


前言

上篇博客讲述了 Spring后端与前端进行交互的过程, 而这篇博客将讲述Spring与数据库的交互 , 众所周知 后端与数据库的关系是十分紧密的, 当然数据库也是有框架的 为 MyBits 是基于JDBC开发的

MyBits的优点

  • MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。
  • MyBatis 去除了⼏乎所有的JDBC代码以及设置参数和获取结果集的⼯作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和JavaPOJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的记录。

这里简单回忆下用JDBC的流程

① 建立数据源 :DataSource
② 通过DataSource 与数据库进行链接 connection
③ 编写要执行的SQL语句 , 不确定的参数 用 ? 进行占位
④ 通过Connection 与 编写的SQL 语句 创建命令对象 Statement
⑤ 替换Statement 中的占位符 , 用指定的数据类型
⑥ 执行SQL语句 , 查询用 executeQuery(), 增加/ 删除 /修改用 executeUpdate()
⑦ 处理结果集
⑧ 关闭资源 ,从后往前关

MyBits的调用流程

MyBits 主要学习俩方面的内容 , 第一个是老生常谈的配置环境 ,第二个 是学习MyBits的语法 与模式
还记得上文中画的那张图五大类注解的图吗?如下 , 通过这张图 ,可以明显的看出来数据库是与持久层进行交互的 , 持久层主要有俩个 东西来进行交互 ,一个是接口 ,这里面提供给服务层可以调用的接口 , 一个是XML文件用来实现接口 ,同时操作数据库的SQL语句也是在这里面存放的,
在这里插入图片描述

我们学的MySQL数据库是关系型数据库 , 而Mybits 也是一个ORM 框架 ,

ORM 中文意思为 : 对象关系映射 ,意思 是在 : 面向对象的编程语言 中 , 将关系型数据库中的数据 与对象建立起映射关系 ,进而自动的完成 数据与对象的互相转换

MyBits 将输⼊数据(即传⼊对象)+SQL 映射成原⽣ SQL , 将结果集映射为返回对象,即输出对象
映射关系如下 :
数据库表(table)–> 类(class)

记录(record,⾏数据)–> 对象(object)

字段(field) --> 对象的属性(attribute)

MyBits的配置

① 创建一个SpringBoot项目 , 往项目中添加MyBits的框架 , 如下图
在这里插入图片描述
② 在application配置文件中,添加mysql的配置
在这里插入图片描述
③配置MyBits的xml的实现接口, 要与配置文件中写的一致

在这里插入图片描述
④创建接口类与实体类 :
实体类 相当于一张表 ,里面的属性要与数据库中的字段对应
接口内 相当于提供给服务层的使用接口 ,调用接口实际上调用的是XML中的语句
在这里插入图片描述
在这里插入图片描述

⑤构建Mapper层的代码实现
比如在接口类中写入什么 , 就必须在XML中构造出来 , ID要一致, 传过去的参数也要对应上

这是接口类中写入的
int getArtCountByUid(@Param("uid") Integer uid);
这是XML中写入的
<select id="getArtCountByUid" resultType="Integer"> select count(*) from articleinfo where uid=#{uid} </select>

在这里插入图片描述

其中 #{uid} 代表着动态接受传参 () 这个有俩种写法下面讲)

⑥在服务层调用接口
服务器只需要属性注入相对应的接口类的对象, 然后写一个普通方法提供给控制类使用, 普通方法中调用对应的接口方法即可

在这里插入图片描述
⑦ 在控制类中调用服务层写的方法 . 写给前端的返回逻辑
在这里插入图片描述

注 : 这里说一下, 在接口类中传递对象时 , 在XML中赋值使用的是对象的属性
在这里插入图片描述

传递参数之# 与 $ 的区别

结论: $ 有SQL注入的问题 , 而# 没有
原因: $ 是直接替换语句 ,而 # 是预处理语句
预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号
直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

比如 : 这个SQL语句

select count(*) from articleinfo where uid=#{uid} : 这是预处理的做法
select * from userinfo order by id ${sort} : 这是直接处理的做法

${} 是有好处的 : 使⽤ ${sort} 可以实现排序查询,⽽使⽤ #{sort} 就不能实现排序查询了,因为当使⽤ #{sort} 查询时,如果传递的值为 String 则会加单引号,就会导致 sql 错误
但是 ${}同样带来了SQL注入的问题 , 比如

select * from userinfo where username=‘ n a m e ′ a n d p a s s w o r d = ′ {name}' and password=' nameandpassword={pwd}’ 本来我想传递俩个参数来获取信息 ,但是如果传递过来前面路径一致, 后面加上 or 1= 1 , 由于${}是直接替换 , 那么就会绕开前面的判断 , 直接返回结果 , 但我们设置拦截器的想法就是 ,不能随意的返回数据, 这与我们最初的想法起了冲突

结论 : ⽤于查询的字段,尽量使⽤ #{} 预查询的⽅式
这里指出一点: 并不是#{} 就是完美无缺的了 , 它同样有着缺陷 , 比如 #{} 不能处理like 这种模糊匹配查询

select * from userinfo where username like ‘%#{username}%’;

这里面的替换后的效果为给username前后加上单引号, mysql不认这种组织方式 ,结果报错

select * from userinfo where username like ‘%‘username’%’

怎么解决 利用mysql内置的拼接函数解决concat , 用mysql自带的拼接函数不会加上单引号

select * from userinfo where username like concat('%',#{usernam
e},'%');

当mysql与程序属性映射不一致时的解决方案

有时候 ,我们会遇到一种情况就是 , 当mysql中的字段名与程序中的属性值不一致该怎么办?
解决方案 : 利用resultMap 解决 在这里插入图片描述
这张图中 :
resultMap ID为该映射的标识 (名称) ,
type为 要映射的实体类所对应的路径
下面第一行 ID为主键 后面 property对应的是程序中的属性名
接下来的 result column 对应的都是普通的字段 , 后面代表映射的属性值
在映射结束后, 下面写SQL语句就不会出现问题了
还有一种比这更简单的处理方法就是
使用AS起别名的方式来 解决, 字段和属性值不对应的情况
使用方法 , 在SQL语句查询中 , 起别名为程序中对应的属性即可了,
比如说 id 与 username 是SQL语句中的字段名, 而ID与name 是Java程序中的属性名称

select  id as ID , username as name from articleinfo where uid=#{uid}

当上路流程学完之后 , 已经学会了 如何写SQL语句 , 如何创建对应的实体类 , 如何创建一个使用MyBits的项目, 已经能简单写不复杂的SQL 与 Java程序之间的联动了 , 但是还有一种情况我们没有处理 那就是 : 上面解决了字段名称与属性名字不一致的写法 , 但是多对一的映射关系该如何解决

比如说 :在多表查询时,如果使⽤ resultType 标签,在⼀个类中包含了另⼀个对象是查询不出来被包含的对象类对象, 这种情况就要使用一些特殊的标签来表名 该resultMap的映射关系
比如
⼀对⼀映射要使⽤ 标签,具体实现如下(⼀篇⽂章只对应⼀个作者):association标签加到ResultMap中就可以了

<association property="user"
 resultMap="com.example.demo.mapper.UserMapper.BaseMap"
 columnPrefix="u_">
 </association>

以上使⽤ 标签,表示⼀对⼀的结果映射:
property 属性:指定 Article 中对应的属性,即⽤户。
resultMap 属性:指定关联的结果集映射,将基于该映射配置来组织⽤户数据。
columnPrefix 属性:绑定⼀对⼀对象时,是通过反射来绑定的

⼀对多需要使⽤ 标签,⽤法和 相同,如下所示:

<collection property="alist" resultMap="com.example.demo.mapper.ArticleI
nfoMapper.BaseMap"
 columnPrefix="a_">
 </collection>

MyBits还支持动态SQL语句的编写, 这里给大家了官方网址

动态 SQL 是一种根据程序的当前需要来生成和执行 SQL 语句的方法。它允许在程序运行时动态创建 SQL 语句,根据不同的条件或者用户输入生成不同的 SQL 语句,从而满足不同的查询需求。动态 SQL 更加灵活,可以避免预编译 SQL 语句时固定的执行计划,提高查询效率和灵活性,并且可以防止 SQL 注入攻击。动态 SQL 可以在不同的编程语言和数据库系统中实现。

https://mybatis.org/mybatis-3/zh/dynamic-sql.html

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

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

相关文章

1.1数据结构绪论

一、数据结构 学习如何使用程序代码把现实世界的问题信息化 二、数据的基本概 1、数据&#xff1a;信息的载体&#xff0c;是描述客观世界属性的数、字符及被计算机程序识别和处理的集合。 早期计算机处理的数据——纯数值类型&#xff1b;现代计算机处理数据——非数据类型 …

融合创新:AI虚拟数字人与3D VR全景引领未来旅游潮流

导语&#xff1a; 随着科技不断发展&#xff0c;AI虚拟数字人和3D VR全景技术的融合正引领着创新的潮流。这种融合不仅仅是对传统导览的升级&#xff0c;更为各个领域带来了全新的创新应用。让我们一起探索AI虚拟数字人与3D VR全景融合的创新应用&#xff0c;看看它们如何在多…

快速解决Github无法访问的问题

Github访问慢&#xff0c;是困扰很多人的问题&#xff0c;今天就出一个解决方案&#xff0c;按照下面思路&#xff0c;可以实现快速访问Github&#xff0c;来查看我们需要的资源。 目录 一、获取DNS 二、修改hosts文件内容 2.1 修改hosts权限 2.2 修改hosts内容 三、轻…

以指标驱动,企业数智化迈向新阶段

近年来&#xff0c;我国数字经济蓬勃发展&#xff0c;数据成为推动经济社会发展的新要素。国家十四五规划指出&#xff0c;要激活数据要素潜能&#xff0c;加快建设数字经济&#xff0c;需要重点实施“上云用数赋智”行动&#xff0c;推动数据赋能全产业链协同转型。为进一步迈…

保姆级教你用Python制作超级玛丽游戏“爷青回~”(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 贪吃蛇游戏 弹珠游戏 超级玛丽&#xff08;爷青回~&#xff09; 完整代码如下&#xff1a; 总…

SpringBoot 实现 PDF 添加水印

SpringBoot 实现 PDF 添加水印 使用场景方式一&#xff1a;使用 Apache PDFBox 库方式二&#xff1a;使用 iText 库方式三&#xff1a;Free Spire.PDF for JavaDemo 使用场景 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件…

LIME论文阅读笔记

这是暗图增强领域一篇经典的传统方法论文&#xff0c;发表在TIP这个顶刊 文章基于的是这样一个公式&#xff1a; L R ⋅ T LR\cdot T LR⋅T 其中&#xff0c; L L L是暗图&#xff0c; R R R是反射分量&#xff0c; T T T是illumination map&#xff0c;并且对于彩色图像来说…

OpenCV reshape函数

reshape函数 在opencv中&#xff0c;reshape函数比较有意思&#xff0c;它既可以改变矩阵的通道数&#xff0c;又可以对矩阵元素进行序列化&#xff0c;非常有用的一个函数。 函数原型&#xff1a; C: Mat Mat::reshape(int cn, int rows0) const参数比较少&#xff0c;但设…

DJ3-5 TCP:流量控制、连接控制

目录 一、流量控制 二、连接管理 1. 建立连接&#xff08;三次握手&#xff09; 2. 关闭连接 3. TCP 连接的生命周期 一、流量控制 一条 TCP 连接的每一侧主机都为该连接设置了接收缓冲区。 TCP 的接收方的接收缓冲区&#xff1a; 1. 提供流量控制服务的原因 应用进程会…

Burpsuit使用03:拦截请求并修改响应

burpsuite是渗透的必备工具&#xff0c;使用它可以进行一些截包分析&#xff0c;修改包数据、暴力破解、扫描等功能&#xff0c;使用最多的场景应该是设置代理拦截数据包分析数据和爆破。 文章目录 拦截请求并修改响应Intercept is offForwardDropAction 拦截请求并修改响应 拦…

5.4、docker-compose

h ttps://www.runoob.com/docker/docker-compose.html Docker Compose docker-compose.yml 配置文件编写详解_docker-compose.yml 编写_种子选手的博客-CSDN博客 docker-compose.yml 配置文件编写详解 1.dockerfile: 构建镜像&#xff1b; 2.docker run: 启动容器&#xff1b;…

upyter Notebook:内核似乎挂掉

项目场景&#xff1a;提示&#xff1a;这里简述项目相关背景&#xff1a;项目场景&#xff1a;深度强化学习在中国股票量化交易上的应用&#xff0c;要求跑赢大盘问题描述提示&#xff1a;这里描述项目中遇到的问题&#xff1a;使用Jupyter Notebook运行时&#xff0c;跑到绘图…

瑞萨RA系列mcu学习笔记--RTT-pwm驱动

方案1&#xff1a;Studio 2.2.6和使用了RASC3.5下使用pwm驱动 开发环境必须说一下&#xff0c;本人在在开发环境的问题上栽了一个跟头&#xff0c; 使用最新版的RTT Studio 2.2.6和使用了RASC4.0的版本生成的公共编译ok&#xff0c;但是一下载到mcu就直接不能运行&#xff1a…

浅谈Java的IO与Netty

一、Java的IO((Input/Output))模型 传统IO和Java NIO最大的区别是传统的IO是面向流&#xff0c;NIO是面向Buffer Socket之间建立链接及通信的过程&#xff01;实际上就是对TCP/IP连接与通信过程的抽象: 1.服务端Socket会bind到指定的端口上&#xff0c;Listen客户端的”插入”…

如何迁移现有应用和数据到阿里云服务器?有哪些迁移工具和方法?

如何迁移现有应用和数据到阿里云服务器&#xff1f;有哪些迁移工具和方法&#xff1f;   随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始将应用和数据迁移到云服务器上。阿里云作为国内领先的云服务提供商&#xff0c;为用户提供了一系列方便可靠的应用和数据…

2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新

2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新 文章目录 2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新一. 引言二. 6.11参会感受2.1 英特尔基础软件开放生态合作2.2 Celadon加速安卓在英特尔架构上的产品创新2.3 面…

ASEMI代理光宝高速光耦LTV-5341参数,LTV-5341应用

编辑-Z LTV-5341参数描述&#xff1a; 型号&#xff1a;LTV-5341 储存温度Tstg&#xff1a;-55~125℃ 工作温度Topr&#xff1a;-40~110℃ 总输出电源电压(VCC –VEE)&#xff1a;35V 平均正向输入电流IF&#xff1a;20mA 峰值瞬态输入电流IF(TRAN)&#xff1a;1A 输入…

【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换

接上一篇&#xff0c;理解 浏览器是如何生成HTTP消息的 &#xff0c;最好是按照顺序来读。  从上一篇博客我们得知浏览器是如何生成了HTTP消息了&#xff0c;但是浏览器作为应用程序&#xff0c;是不具备向网络中发送请求的能力&#xff0c;而是需要委托给操作系统的内核协议栈…

淘宝详情页分发推荐算法总结:用户即时兴趣强化

转子&#xff1a;https://juejin.cn/post/6992169847207493639 商品详情页是手淘内流量最大的模块之一&#xff0c;它加载了数十亿级商品的详细信息&#xff0c;是用户整个决策过程必不可少的一环。这个区块不仅要承接用户对当前商品充分感知的诉求&#xff0c;同时也要能肩负起…

必学KVM技术详解包括所有技能

KVM虚拟化进阶学习 一&#xff0c;KVM命令行安装 图形化安装教程&#xff1a;https://blog.csdn.net/weixin_53678904/article/details/125950867?spm1001.2014.3001.5501 1.存储池管理 ​ KVM必须要配置⼀个⽬录当作他存储磁盘镜像(存储卷)的⽬录&#xff0c;我们称这个⽬…