Spring:MyBatis操作数据库 2
1.MyBatis XML配置⽂件上一章学习了注解的⽅式, 接下来我们学习XML的⽅式使⽤Mybatis的注解⽅式主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能建议使⽤XML来配置映射语句也就是将SQL语句写在XML配置⽂件中.1.1配置连接字符串和MyBatis如果是application.yml⽂件, 配置内容如下:1#数据库连接配置2spring:3datasource:4url:jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncodingutf8useSSLfalse5username:root6password:root7driver-class-name:com.mysql.cj.jdbc.Driver8#配置mybatis xml的⽂件路径在resources/mapper创建所有表的xml⽂件9mybatis:10mapper-locations:classpath:mapper/**Mapper.xml如果是application.properties⽂件, 配置内容如下:1#驱动类名称2spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver3#数据库连接的url4spring.datasource.urljdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncodingutf8useSSLfalse5#连接数据库的⽤⼾名6spring.datasource.usernameroot7#连接数据库的密码8spring.datasource.passwordroot9#配置mybatis xml的⽂件路径在resources/mapper创建所有表的xml⽂件10mybatis.mapper-locationsclasspath:mapper/**Mapper.xml1.2写持久层代码1.2.1添加 mapper 接⼝1importcom.example.demo.model.UserInfo;2importorg.apache.ibatis.annotations.Mapper;34importjava.util.List;56Mapper7public interfaceUserInfoXMlMapper{8ListUserInfoqueryAllUser();9}1.2.2添加 UserInfoXMLMapper.xml数据持久层的实现MyBatis 的固定 xml 格式1?xml version1.0encodingUTF-8?2!DOCTYPEmapper PUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd3mappernamespacecom.example.demo.mapper.UserInfoMapper45/mapper创建UserInfoXMLMapper.xml, 路径参考yml中的配置查询所有⽤⼾的具体实现 ?xml version1.0encodingUTF-8?!DOCTYPEmapper PUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmappernamespacecom.example.demo.mapper.UserInfoXMlMapperselectidqueryAllUserresultTypecom.example.demo.model.UserInfoselect username,password, age, gender, phone from user_info/select/mapper以下是对以上标签的说明•mapper 标签需要指定namespace属性表⽰命名空间值为 mapper 接⼝的全限定名包括全包名.类名。•select 查询标签是⽤来执⾏数据库的查询操作的◦id 是和Interface接⼝中定义的⽅法名称⼀样的表⽰对接⼝的具体实现⽅法。◦resultType 是返回的数据类型也就是开头我们定义的实体类.2.#{} 和 ${}MyBatis 参数赋值有两种⽅式, 咱们前⾯使⽤了#{}进⾏赋值, 接下来我们看下⼆者的区别2.1#{} 和${} 使⽤1.先看Interger类型的参数1Select(select username, password, age, gender, phone from user_info where id #{id} )2UserInfoqueryById(Integer id);观察我们打印的⽇志我们输⼊的参数并没有在后⾯拼接id的值是使⽤?进⾏占位. 这种SQL 我们称之为预编译SQL我们把#{}改成${}再观察打印的⽇志:1Select(select username, password, age, gender, phone from user_info where id ${id} )2UserInfoqueryById(Integer id);可以看到, 这次的参数是直接拼接在SQL语句中了2.接下来我们再看String类型的参数1Select(select username, password, age, gender, phone from user_info whereusername #{name} )2UserInfoqueryByName(String name);观察我们打印的⽇志, 结果正常返回我们把#{}改成${}再观察打印的⽇志:1Select(select username, password, age, gender, phone from user_info whereusername ${name} )2UserInfoqueryByName(String name);可以看到, 这次的参数依然是直接拼接在SQL语句中了, 但是字符串作为参数时, 需要添加引号, 使⽤ ${}不会拼接引号, 导致程序报错.修改代码如下:1Select(select username, password, age, gender, phone from user_info whereusername ${name} )2UserInfoqueryByName(String name);从上⾯两个例⼦可以看出:#{}使⽤的是预编译SQL, 通过?占位的⽅式, 提前对SQL进⾏编译, 然后把参数填充到SQL语句中.#{}会根据参数类型, ⾃动拼接引号.${}会直接进⾏字符替换, ⼀起对SQL进⾏编译. 如果参数为字符串, 需要加上引号.参数为数字类型时, 也可以加上, 查询结果不变, 但是可能会导致索引失效, 性能下降.2.2#{} 和 ${}区别#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别.简单回顾:当客⼾发送⼀条SQL语句给服务器后, ⼤致流程如下:1.解析语法和语义, 校验SQL语句是否正确2.优化SQL语句, 制定执⾏计划3.执⾏并返回结果⼀条 SQL如果⾛上述流程处理, 我们称之为 Immediate Statements(即时 SQL)1.性能更⾼绝⼤多数情况下, 某⼀条 SQL 语句可能会被反复调⽤执⾏, 或者每次执⾏的时候只有个别的值不同(⽐如 select 的 where ⼦句值不同, update 的 set ⼦句值不同, insert 的 values 值不同). 如果每次都需要经过上⾯的语法解析, SQL优化、SQL编译等则效率就明显不⾏了.预编译SQL编译⼀次之后会将编译后的SQL语句缓存起来后⾯再次执⾏这条语句时不会再次编译(只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率2.更安全(防⽌SQL注⼊)SQL注⼊是通过操作输⼊的数据来修改事先定义好的SQL语句以达到执⾏代码对服务器进⾏攻击的⽅法。由于没有对⽤⼾输⼊进⾏充分检查⽽SQL⼜是拼接⽽成在⽤⼾输⼊参数时在参数中添加⼀些SQL关键字达到改变SQL运⾏结果的⽬的也可以完成恶意攻击。sql 注⼊代码 or 11先来看看SQL注⼊的例⼦1Select(select username, password, age, gender, phone from user_info whereusername ${name} )2ListUserInfoqueryByName(String name);测试代码:正常访问情况:1Test2voidqueryByName() {3ListUserInfo userInfos userInfoMapper.queryByName(admin);4System.out.println(userInfos);5}结果运⾏正常SQL注⼊场景:1Test2voidqueryByName() {3ListUserInfo userInfos userInfoMapper.queryByName( or 11);4System.out.println(userInfos);5}结果依然被正确查询出来了, 其中参数 or被当做了SQL语句的⼀部分,可以看出来, 查询的数据并不是⾃⼰想要的数据. 所以⽤于查询的字段尽量使⽤ #{}预查询的⽅式SQL注⼊是⼀种⾮常常⻅的数据库攻击⼿段, SQL注⼊漏洞也是⽹络世界中最普遍的漏洞之⼀.如果发⽣在⽤⼾登录的场景中, 密码输⼊为 or 11, 就可能完成登录(不是⼀定会发⽣的场景,需要看登录代码如何写)3.数据库连接池在上⾯Mybatis的讲解中, 我们使⽤了数据库连接池技术, 避免频繁的创建连接, 销毁连接下⾯我们来了解下数据库连接池3.1介绍数据库连接池负责分配、管理和释放数据库连接它允许应⽤程序重复使⽤⼀个现有的数据库连接 ⽽不是再重新建⽴⼀个.没有使⽤数据库连接池的情况: 每次执⾏SQL语句, 要先创建⼀个新的连接对象, 然后执⾏SQL语句, SQL语句执⾏完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接⽐较消耗资源使⽤数据库连接池的情况: 程序启动时, 会在数据库连接池中创建⼀定数量的Connection对象, 当客⼾请求数据库连接池, 会从数据库连接池中获取Connection对象, 然后执⾏SQL, SQL语句执⾏完, 再把Connection归还给连接池.优点:1.减少了⽹络开销2.资源重⽤3.提升了系统的性能3.2使⽤常⻅的数据库连接池•C3P0•DBCP•Druid•Hikari⽬前⽐较流⾏的是 Hikari, Druid1.Hikari : SpringBoot默认使⽤的数据库连接池Hikari 是⽇语光的意思(ひかり), Hikari也是以追求性能极致为⽬标2.Druid如果我们想把默认的数据库连接池切换为Druid数据库连接池, 只需要引⼊相关依赖即可dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-3-starter/artifactIdversion1.2.21/version/dependency如果SpringBoot版本为2.X, 使⽤druid-spring-boot-starter 依赖dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.17/version/dependency

相关新闻

SpringBoot+Vue学生宿舍管理系统源码 带部署文档

SpringBoot+Vue学生宿舍管理系统源码 带部署文档

项目说明:基于SpringBootVue的学生宿舍管理系统 项目包含:√源码√数据库√部署文档 技术架构:后端:springboot/mybatisplus/jwt/SpringSecurity前端:vue/elementui/nodejs/axios 数据库:mysql8 用户管理模块:多角色用户登录注册(学生、管理员、维修人员、家政服务员);密码找回…

2026/10/10 0:46:42 阅读更多 →
[HPC | slurm系统学习] 服务器使用指南

[HPC | slurm系统学习] 服务器使用指南

原文档:slurm系统学习 1.什么是Slurm SLURM (Simple Linux Utility for Resource Management)是一个调度系统,用于分配计算节点。 用户可以通过ssh连接登录节点,也可以通过浏览器登录,进而进入该系统。 …

2026/10/9 12:49:23 阅读更多 →
无重复字符的最长子串:LeetCode滑动窗口经典题全解析

无重复字符的最长子串:LeetCode滑动窗口经典题全解析

第一次刷 LeetCode 的同学,往往在第三题就卡住了。前面两题还停留在“暴力能不能过”的挣扎里,突然冒出来一个“无重复字符的最长子串”,嘴上念着“这不是用 substring 挨个检查吗”,心里已经开始发怵。这道题之所以是经典的不能再…

2026/10/9 12:48:38 阅读更多 →

最新新闻

测试】】】、

测试】】】、

测试】】】、测试】】】、测试】】】、

2026/10/10 0:49:23 阅读更多 →
Python字典items()方法详解:视图对象、遍历与性能优化

Python字典items()方法详解:视图对象、遍历与性能优化

刚接触 Python 字典的时候,我习惯用keys()拿键,再回头用d[k]去取值,代码写起来又长又绕。后来在项目里做数据清洗,发现同样一个“遍历字典并处理键值对”的需求,用items()能写得干净利落得多。items()是字典对象上一个…

2026/10/10 0:49:23 阅读更多 →
基于机器学习的遥感图像分类模型源码解析与实践指南

基于机器学习的遥感图像分类模型源码解析与实践指南

简介:这是一份基于机器学习的遥感图像分类模型源码包,面向计算机、人工智能、大数据等相关专业正在做课程设计、期末大作业或毕业设计的学生,也可供遥感图像与机器学习方向的学习者参考。包内共十三个文件,以六个Python源码脚本为…

2026/10/10 0:48:23 阅读更多 →
Claude Haiku 5.5 成本降 75%,小模型的账该怎么算

Claude Haiku 5.5 成本降 75%,小模型的账该怎么算

据报道,10 月 7 日 Anthropic 上线了新的轻量模型 Claude Haiku 5.5,官方称平均运行成本比上一代 Haiku 4.5 低约 75%。具体到价签上:提示词不超过 10 万 Token 的请求,输入价降到每百万 Token 0.10 美元、输出 0.50 美元&#xf…

2026/10/10 0:48:23 阅读更多 →
TileLang 多后端实战:Target 探测、ROCm、Docker 一网打尽

TileLang 多后端实战:Target 探测、ROCm、Docker 一网打尽

TileLang 多后端实战:Target 探测、ROCm、Docker 一网打尽 【免费下载链接】tilelang Domain-specific language designed to streamline the development of high-performance GPU/CPU/Accelerators kernels 项目地址: https://gitcode.com/GitHub_Trending/ti/…

2026/10/10 0:48:23 阅读更多 →
GitHub每日趋势榜Top30:开源技术风向的实时监测方法论

GitHub每日趋势榜Top30:开源技术风向的实时监测方法论

1. 项目概述:这不是榜单,而是一份开源生态的“实时心电图”你点开 GitHub Trending 页面,看到的不是一串冷冰冰的仓库名和星标数,而是一张正在跳动的、反映全球开发者集体注意力流向的“实时心电图”。我连续跟踪 GitHub 每日趋势…

2026/10/10 0:47:23 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →