Mybatis 01
JDBC回顾
select 语句 "select *from student" 演示:
驱动包
JDBC 的操作流程:
1. 创建数据库连接池 DataSource2. 通过 DataSource 获取数据库连接 Connection3. 编写要执⾏带 ? 占位符的 SQL 语句4. 通过 Connection 及 SQL 创建操作命令对象 Statement5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值6. 使⽤ Statement 执⾏ SQL 语句7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量8. 处理结果集9. 释放资源
Mybatis 是什么
持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的
简单来说 MyBatis 是更简单完成程序和数据库交互的框架,是更简单的操作和读取数据库⼯具
Mybatis 入门
准备工作
创建springboot⼯程,并导⼊ mybatis 的依赖、mysql 的驱动包
Lombok Spring Web Mybatis Framework MySQL Driver
Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加 MySQL 驱动项⽬⼯程创建完成后,⾃动在pom.xml⽂件中,导⼊Mybatis依赖和MySQL驱动依赖版本会随着SpringBoot 版本发⽣变化, ⽆需关注
创建用户表 mybatis_test
创建对应的实体类 UserInfo
实体类的属性名与表中的字段名⼀⼀对应
配置数据库连接字符串
Mybatis中要连接数据库,需要数据库相关参数配置• MySQL驱动类• 登录名• 密码• 数据库连接字符串
如果使⽤ MySQL 是 5.x 之前的使⽤的是"com.mysql.jdbc.Driver",如果是⼤于 5.x 使⽤的是“com.mysql.cj.jdbc.Driver
写持久层代码
在项⽬中, 创建持久层接⼝ UserInfoMapper
Mybatis的持久层接⼝规范⼀般都叫 XxxMapper@Mapper注解:表⽰是MyBatis中的Mapper接⼝• 程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理• @Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容
单元测试
在创建出来的SpringBoot⼯程中,在src下的test⽬录下,已经⾃动帮我们创建好了测试类 ,我们可以 直接使⽤这个测试类来进⾏测试
测试类上添加注解 @SpringBootTest,该测试类在运⾏时,就会⾃动加载Spring的运⾏环境通过@Autowired这个注解, 注⼊要测试的类, 就可以开始进⾏测试了
使⽤ Idea ⾃动⽣成测试类除此之外, 也可以使⽤Idea⾃动⽣成测试类 :1)在需要测试的Mapper接⼝中, 右键 -> Generate -> Test
2)选择要测试的⽅法, 点击 OK![]()
使用 IDEA 自动生成测试类进行单元测试
返回结果中, 可以看到, 只有SQL语句中查询的列对应的属性才有赋值
MyBatis的基础操作
打印日志
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl重启程序,查看输出结果
参数传递
SQL语句中的id值一般不能写成固定数值,需要变为动态的数值——>在⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句使⽤ #{} 的⽅式获取⽅法中的参数
@Select("select id,username,password,age,gender from userinfo where id = #{id}") UserInfo getUser(Integer id);@Test void getUserInfoAll() {UserInfo userInfo = userInfoMapper.getUser(1);System.out.println(userInfo); }
如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…} ⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致@Select("select id,username,password,age,gender from userinfo where id = #{userId}") UserInfo getUser(@Param("userId") Integer id);可以通过 @Param 设置参数的别名, 如果使⽤ @Param 设置别名, #{...}⾥⾯的属性名必须和@Param 设置的⼀样
@Select("select id,username,password,age,gender from userinfo where id = #{id} and password = #{password}") UserInfo getUser(Integer id,String password);@Test void getUserInfoAll() {UserInfo userInfo = userInfoMapper.getUser(1,"admin");System.out.println(userInfo); }
如果只有一个结果返回,可以使用对象或者集合接受
如果有多个结果返回,必须使用集合接受
程序会根据参数自动生成一些参数,例如 param1 对应方法的第一个参数...
Mybatis开发方式
注解
增(Insert)
如果设置了 @Param 属性, #{...} 需要使⽤ 参数.属性 来获取@Insert("insert into userinfo (id,username,password,age,gender)" +" values(#{info.id},#{info.username},#{info.password},#{info.age},#{info.gender})") Integer InsertUserInfo(@Param("info") UserInfo userInfo);
返回主键
Insert 语句默认返回的是 受影响的⾏数但有些情况下, 数据插⼊之后, 还需要有后续的关联操作, 需要获取到新插⼊数据的id如果想要拿到⾃增id, 需要在Mapper接⼝的⽅法上添加⼀个Options的注解![]()
![]()
设置 useGeneratedKeys=true 之后, ⽅法返回值依然是受影响的⾏数, ⾃增 id 会设置在上述 keyProperty 指定的属性中• useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false.• keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)
删(Delete)
改(Update)
查(Select)
们在上⾯查询时发现, 有⼏个字段是没有赋值的, 只有Java对象属性和数据库字段⼀模⼀样时, 才会进⾏赋值
从运⾏结果上可以看到, 我们SQL语句中, 查询了delete_flag, create_time, update_time, 但是这⼏个属性却没有赋值MyBatis 会根据⽅法的返回结果进⾏赋值.1)⽅法⽤对象 UserInfo接收返回结果, MySQL 查询出来数据为⼀条, 就会⾃动赋值给对象.2)⽅法⽤List<UserInfo>接收返回结果, MySQL 查询出来数据为⼀条或多条时, 也会⾃动赋 值给List3)但如果MySQL 查询返回多条, 但是⽅法使⽤UserInfo接收, MyBatis执⾏就会报错原因分析:当⾃动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性
解决方法:1)起别名 2)结果映射 3)驼峰命名
1)起别名
在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样![]()
2)结果映射
如果其他SQL, 也希望可以复⽤这个映射关系, 可以给这个Results定义⼀个名称使⽤ id 属性给该 Results 定义别名, 使⽤ @ResultMap 注解来复⽤其他定义的 ResultMap![]()
3)驼峰命名
通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词), ⽽ Java 属性⼀般遵循驼峰命名法约定为了在这两种命名⽅式之间启⽤⾃动映射,需要将 mapUnderscoreToCamelCase 设置为true![]()
![]()
MyBatis XML 配置文件
MyBatis XML的⽅式需要以下两步:
配置连接字符串和MyBatis
此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置![]()
持久层代码的编写准备
添加 mapper 接⼝
数据持久层的接⼝定义: UserInfoXmlMapper.java![]()
添加 UserInfoXMLMapper.xml
数据持久成的实现,MyBatis 的固定 xml 格式:
创建UserInfoXMLMapper.xml, 路径参考yml中的配置![]()
以下是对以上标签的说明:• <mapper> 标签:需要指定 namespace 属性,表⽰命名空间,值为 mapper 接⼝的 全限定名 ,包括全包名.类名• <select> 查询标签:是⽤来执⾏数据库的查询操作的:◦ id :是和 Interface(接⼝)中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法◦ resultType :是返回的数据类型,也就是开头我们定义的实体类
增(Insert)
.java
.xml
1)如果使⽤@Param设置参数名称的话, 使⽤⽅法和注解类似
2)返回⾃增 id,接⼝定义不变, Mapper.xml 实现设置useGeneratedKeys 和keyProperty属性![]()
![]()
![]()
![]()
删(Delete)
改(Update)
查(Select)
同样的, 使⽤XML 的⽅式进⾏查询, 也存在数据封装的问题解决办法和注解类似:1. 起别名2. 结果映射3. 驼峰命名其中1,3的解决办法和注解⼀样,不再多说, 接下来看下xml如果来写结果映射
增,删,改返回的是影响的行数
查 返回的结果可能是字符串,对象,数字...需要指定类型
![]()
从控制台返回的结果可知,此时仍未查到要求的值
其他查询操作
多表查询
Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类
通过映射关系, 把SQL运⾏结果和实体类关联起来
如果名称不⼀致的, 采⽤ResultMap, 或者别名的⽅式解决, 和单表查询⼀样
在配置文件中指定的库中创建 作者类
#{} 和 ${}
#{} 使⽤的是预编译SQL, 通过 ? 占位的⽅式, 提前对SQL进⾏编译, 然后把参数填充到SQL语句中. #{} 会根据参数类型, ⾃动拼接引号 ''${} 会直接进⾏字符替换, ⼀起对SQL进⾏编译. 如果参数为字符串, 需要加上引号 ''参数为数字类型时, 也可以加上, 查询结果不变, 但是可能会导致索引失效, 性能下降
#{} 和 ${}区别:#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别1. 性能更⾼绝⼤多数情况下, 某⼀条 SQL 语句可能会被反复调⽤执⾏, 或者每次执⾏的时候只有个别的值不同(⽐如 select 的 where ⼦句值不同, update 的 set ⼦句值不同, insert 的 values 值不同). 如果每次都需要经过上⾯的语法解析, SQL优化、SQL编译等,则效率就明显不⾏了预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译(只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率
2. 更安全(防⽌SQL注⼊)SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击
SQL注入演示:
正常输入——>
SQL注入场景——>
排序功能
${} 会有SQL注⼊的⻛险, 所以我们尽量使⽤#{}完成查询
然而 ${}存在,就一定有其应用的场景:
使⽤ ${sort} 可以实现排序查询, ⽽使⽤ #{sort} 就不能实现排序查询了注意: 此处 sort 参数为String类型, 但是SQL语句中, 排序规则是不需要加引号 '' 的, 所以此时的${sort} 也不加引号当使⽤ #{sort} 查询时, asc 前后⾃动给加了引号, 导致 sql 错误#{} 会根据参数类型判断是否拼接引号 ''如果参数类型为String, 就会加上 引号表名作为参数时, 也只能使⽤ ${}
like 查询
like 使⽤ #{} 报错:
把 #{} 改成 ${} 可以正确查出来, 但是${}存在SQL注⼊的问题, 所以不能直接使⽤ ${}解决办法: 使⽤ mysql 的内置函数 concat() 来处理,实现代码如下:![]()
![]()
数据库连接池
介绍
1)没有使⽤数据库连接池的情况: 每次执⾏SQL语句, 要先创建⼀个新的连接对象, 然后执⾏ SQL语句, SQL语句执⾏完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接⽐ 较消耗资源2)使⽤数据库连接池的情况: 程序启动时, 会在数据库连接池中创建⼀定数量的Connection 对象, 当客⼾请求数据库连接池, 会从数据库连接池中获取Connection对象, 然后执⾏ SQL, SQL语句执⾏完, 再把Connection归还给连接池
使用
常⻅的数据库连接池:• C3P0• DBCP• Druid• Hikari⽬前⽐较流⾏的是 Hikari, Druid1. Hikari : SpringBoot默认使⽤的数据库连接池2. Druid如果我们想把默认的数据库连接池切换为Druid数据库连接池, 只需要引⼊相关依赖即可< dependency >< groupId >com.alibaba</ groupId >< artifactId >druid-spring-boot-starter</ artifactId >< version >1.1.17</ version ></ dependency >
相关文章:

Mybatis 01
JDBC回顾 select 语句 "select *from student" 演示: 驱动包 JDBC 的操作流程: 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…...

前端页面展示本电脑的摄像头,并使用js获取摄像头列表
可以通过 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 获取电脑上的摄像头列表。以下是一个示例代码,可以展示摄像头列表并选择进行预览。 HTML JavaScript 实现摄像头列表展示和预览 <!DOCTYPE html> <html lang"zh-CN">…...

HTML5实现喜庆的新年快乐网页源码
HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码,春节新年网…...

Excel文件恢复教程:快速找回丢失数据!
Excel文件恢复位置在哪里? Excel是微软开发的电子表格软件,它为处理数据和组织工作提供了便捷。虽然数据丢失的问题在数字时代已经司空见惯,但对于某些用户来说,恢复未保存/删除/丢失的Excel文件可能会很困难,更不用说…...

计算机网络-L2TP Over IPSec基础实验
一、概述 上次我们进行了标准L2TP的配置,但是在最后我们在进行业务流量访问时看到流量是没有进行加密的,这就导致可能得安全风险,所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec,然…...

一个最简单的ios程序(object_c)的编写
前言 如何在苹果系统MacOS创建一个简单的ios(iphone)程序,貌似非常的简单。但是,作为习惯了Windows开发的程序员来说,有时候还觉得有点麻烦,至少开始有点很不习惯。 本博文试着把这个过程展现一下ÿ…...

使用Clion在ubuntu上进行交叉编译,并在Linux上远程编译五子棋
目录 1.工具以及概念介绍 (1)Clion软件简介 (2)交叉编译 (3)远程编译 2.操作原理 3.详细操作步骤 (1)配置Clion与虚拟机ubuntu的ssh连接 CLion远程开发Ubuntu,并显…...

《QDebug 2024年12月》
一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.QQuickPaintedItem 或者 QQuickItem 绘制的图片 dpi 缩放后模糊 启用 Qt 自带的缩放后,界面会跟随系统设置的 dpi 进行放大缩小: #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplicat…...

3---杭州工作三年半
2021-07-06来杭——2025-01-01元旦 1滨江2021-07-06——2022-11-25(一年零四个月) 2下沙2023-01-01——2023-04-27(五个月) 3苏州2023-06-07——2023-06-27(一个月)厦门2023-06-29——2023-07-06ÿ…...

从2024看2025前端发展趋势
前言 又至年关,回顾整个2024年,前端行业仍旧百废待兴,IT业界同样也未见有所起色,AI风潮也从狂热兴奋逐步走向了冷静稳定阶段,造成此形势感观并非单一行业或者某一企业之特例,实为政经等综合影响之结果。因…...

网络渗透测试实验三:SQL注入
1.实验目的和要求 实验目的:了解SQL注入的基本原理;掌握PHP脚本访问MySQL数据库的基本方法;掌握程序设计中避免出现SQL注入漏洞的基本方法;掌握网站配置。 系统环境:Kali Linux 2、Windows Server 网络环境:交换网络结构 实验工具: SqlMAP;DVWA 2.实验步骤 实验目…...

ElasticSearch7.8快速入门
文章目录 1.基本概念1.数据格式2.倒排索引 2.HTTP使用1.创建索引(相当于创建数据库)2.索引-查询 & 删除1.查询索引2.查询所有索引3.删除索引 3.创建文档1.创建文档(不指定id)2.创建文档(指定id) 4.文档…...

【YashanDB知识库】hive初始化崖山报错YAS-04209
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7849008.html?templateId1718516 【问题分类】功能使用 【关键字】hadoop,hive,YAS-02058 【问题描述】hive初始化崖山报错: 0: jdbc:yasdb://192…...

2024年度总结:保持正念 延迟满足
总结: 时光荏苒,很快就到了年底,2024年也就悄悄的过去了,回顾这一年,有很多的感触,在此做一个总结,留下自己的脚印 CTF: 要总结的第一件事那当然是CTF,回顾这一年&#…...

VScode SSH 错误:Got bad result from install script 解決
之前vscode好好的,某天突然连接报错如下 尝试1. 服务器没有断开,ssh可以正常连接 2. 用管理员权限运行vscode,无效 3. 删除服务器上的~/.vscode-server 文件夹,无效 试过很多后,原来很可能是前一天anaconda卸载导致注册表项 步…...

Logo设计免费生成器工具:轻松创建独特标志
在当今的商业世界中,一个独特且引人注目的Logo是任何企业或品牌的身份象征。它不仅代表了公司的形象,还传达了公司的价值观和使命。然而,对于许多初创企业或小型企业来说,聘请专业设计师来设计一个Logo可能是一笔不小的开销。这时…...

[算法] [leetcode-349] 两个数组的交集
349 两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 示例 2: …...

Type c系列接口驱动电路·内置供电驱动电路使用USB2.0驱动电路!!!
目录 前言 Type c常见封装类型 Type c引脚功能详解 Type c常见驱动电路详解 Type c数据手册 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路…...

第7章 程序流程控制 - 条件分支
汇编语言是一种低级编程语言,它与特定计算机架构的机器码有着直接对应关系。条件分支是程序流程控制的一部分,允许根据某些条件来决定执行哪一段代码。在汇编中,这通常通过比较指令和跳转指令来实现。 以下是一些经典的汇编语言源代码示例&a…...

Edge如何获得纯净的启动界面
启动Edge会出现快速链接,推广链接,网站导航,显示小组件,显示信息提要,背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…...

gitlab的搭建及使用
1、环境准备 服务器准备 CentOS Linux release 7.9.2009 (Core),内存至少4G。 修改主机名和配置ip地址 hostnamectl set-hostname <hostname> 关闭主机的防火墙 # 关闭防火墙 systemctl stop firewalld #临时关闭防火墙 systemctl disable firewalld …...

如何逐步操作vCenter修改DNS服务器?
在vSphere 7中有一个新功能,它允许管理员更改vCenter Server Appliance的FQDN和IP。因此本文将介绍如何轻松让vCenter修改DNS服务器。 vCenter修改DNS以及修改vCenter IP地址 与在部署 vCenter Server Appliance 后,您可以根据需要修改其 DNS 设置和 IP…...

XIAO ESP32 S3网络摄像头——2视频获取
本文主要是使用XIAO Esp32 S3制作网络摄像头的第2步,获取摄像头图像。 1、效果如下: 2、所需硬件 3、代码实现 3.1硬件代码: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 设…...

使用JMeter对Linux生产服务器进行压力测试
安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言(例如:Chinese&am…...

spring boot 异步线程池的使用
创建Spring Boot项目 首先,你需要创建一个Spring Boot项目。你可以使用Spring Initializr(https://start.spring.io/)来快速生成项目结构。 添加异步支持依赖 在你的pom.xml文件中,确保你已经添加了Spring Boot的starter依赖&…...

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注
风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注 数据集下载 yolov11: https://download.csdn.net/download/pbymw8iwm/90206849 yolov…...

深入浅出梯度下降与反向传播
文章目录 1. 前言2. 基本概念2.1 一元函数的导数2.2 偏导数2.3 方向导数2.4 梯度2.5 均方误差 3. 梯度下降3.1 梯度下降的公式3.2 梯度下降的类型(优化器) 4. 反向传播4.1 反向传播的基本步骤4.2 反向传播的数学推导 5. 实战5.1 手动求导5.2 自动求导5.3…...

【电机控制】基于STC8H1K28的六步换向——方波驱动(硬件篇)
【电机控制】基于STC8H1K28的六步换向——方波驱动(硬件篇) 文章目录 [TOC](文章目录) 前言一、硬件原理图1. MCU主控电路2. LDO电路3. 驱动电路4. 过零检测电路 二、3D图三、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向…...

手搓一个ChatUI需要分几步
只关注项目代码的同学可以直接跳转目录中的正文部分,查看项目仓库和功能介绍。 引言 Chatbot的UI界面设计,是和传统软件不同的:都是当面一个简洁的对话框,框里预备着热乎的工具,可以随时更新。 像我这样做工的牛马&a…...

2024年年度总结
前言 前一段时间,看到网上有人发类似于年度总结的东西,我想我也可以写一个,今年的日记也是从开头一直贯彻到了结尾 回忆起一年的事情还是有些困难 一月 回忆起有点困难,原因是我的日记大部分都是记录我当天地感想与情绪&#x…...