MyBatis搭建和增删改查
MyBatis是一个开源的持久层框架,用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置,并自动生成对应的SQL语句,从而简化了数据库操作的编码工作。
MyBatis的核心思想是将SQL语句与Java代码分离,通过XML或注解来配置SQL语句,使得SQL语句可以进行灵活的管理和维护。通过MyBatis,开发人员可以使用面向对象的思维来进行数据库操作,而不需要直接编写繁琐的SQL语句。
ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。
关于Maven的相关配置见之前的博客:Maven项目搭建
搭建MyBatis
1. 配置依赖项
在pom.xml文件中配置Mybatis依赖库和SQL链接库等
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency>
2. 配置数据源
在resources文件夹下创建application.yml配置文件
yml基本语法
#注释用井号
名称跟冒号:
属性前面空两格: 值前面空一格
- 数组元素用短横线加空格
#配置mybatis的数据源 DataSource
spring:datasource:username: rootpassword: 123123driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/easydata
3.创建封装类
package com.easy.bean;import java.math.BigDecimal;public class Staff {private int id;private String code;private String name;private BigDecimal salary;private String username;private String userpass;//这里省略getter和setter方法...
}
4.定义Mapper
在resources文件夹下创建一个mapper文件夹用于存放mapper的xml文件
在该目录下新建应该xml文件:
mapper 标签内指定连接的对应接口是 com.easy.dao.IStaffDao
标签之间写SQL语句,在 id 中指明调用的方法名,resultType 指定返回值类型小写
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.easy.dao.IStaffDao"><!-- 在这里写SQL语句 --><select id="getNow" resultType="string">select now()</select></mapper>
5.配置Mapper文件路径和别名以及日志级别
在application.yml文件中配置以下内容:
#配置mapper的xml文件位置
mybatis:mapper-locations: classpath:mapper/*.xml
#用于打印日志
logging:level:com.easy.dao: debug
6.定义数据访问层接口
在com.easy包下建一个dao包用于定义数据访问层的接口,接口用 @Mapper 注解
package com.easy.dao;import org.apache.ibatis.annotations.Mapper;import com.easy.bean.Staff;@Mapper
public interface IStaffDao {String getNow();}
7.编写业务处理层(可以使用面向接口)
在controller包下编写控制类,使用 @RestController 注解,
类内用 @Autowired 注入接口,并在方法上使用 @GetMapping 等指定请求方式
@RestController
public class EasyController {@AutowiredIStaffDao dao;@GetMapping("now")public String now() {return dao.getNow();}
}
浏览器测试输出:

参数传递
这里以通过姓名和编号查询staff员工表为例
mapper的对应xml文件中编写SQL语句:
<select id="getStaff" resultType="com.easy.bean.Staff">select * from staff where name=#{name} and code=#{code}</select>
1.使用注解传递参数
在接口中定义方法:
@Mapper
public interface IStaffDao {List<Staff> getStaff(@Param("name")String name,@Param("code")String code);
}
控制类中编写 getStaff 方法:
@GetMapping("staff")public List<Staff> getStaff(@RequestParam("name")String name,@RequestParam("code")String code) {List<Staff> staffs = dao.getStaff(name, code);return staffs;}
2.使用Map传递参数
在接口中定义方法:
@Mapper
public interface IStaffDao { List<Staff> getStaff(Map params);
}
控制类中编写 getStaff 方法:
@GetMapping("staff")public List<Staff> getStaff(@RequestParam Map map) {List<Staff> staffs = dao.getStaff(map);return staffs;}
3.使用JavaBean传递参数
在接口中定义方法:
@Mapper
public interface IStaffDao {List<Staff> getStaff(Staff staff);
}
控制类中编写 getStaff 方法:
@GetMapping("staff")public List<Staff> getStaff(Staff staff) {List<Staff> staffs = dao.getStaff(staff);return staffs;}

区别:
- 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
- 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
- 当参数个数大于 5 个时,建议使用 JavaBean 方式。
占位符#和$的区别
SQL语句分为两个过程:编译,执行。在MyBatis中,#和$是两种不同的占位符用法。
# 是预编译的占位符,使用#时,MyBatis会对传入的参数进行预处理,类型解析之后,将参数的值安全地替换到SQL语句中。例如,使用#{param}占位符时,MyBatis会将参数值作为字符串的形式传递给数据库,这样可以防止SQL注入攻击。
$ 是直接替换的占位符,使用$时,MyBatis会将占位符替换为参数的字符串值。例如,使用${param}占位符时,MyBatis会直接将参数的值替换到SQL语句中,不进行预处理。这意味着,使用$时需要注意安全性和潜在的SQL注入风险,因为参数值直接拼接到SQL语句中,可能会导致不安全的查询。
总结来说,#符号用于预处理参数,提高安全性,而$符号用于直接替换参数,更加灵活但需要注意安全性。在实际使用中,一般推荐使用#符号,除非有特殊需求,需要动态拼接SQL语句时才使用$符号。
注:SQL注入是一种常见的安全漏洞,指的是攻击者通过在应用程序中注入恶意的SQL代码,使得应用程序在处理SQL语句时执行了攻击者意图的代码。
当使用$占位符时,如替换的内容为 ' or '1'='1 直接替换会导致SQL语句执行了不符合本意的逻辑。
映射文件常用标签
1.select标签
为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对 MySQL 数据库和 JavaBean 采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。
常用属性

2.insert标签
MySQL、SQL Server 等数据库表可以采用自动递增的字段作为其主键,当向这样的数据库表插入数据时,即使不指定自增主键的值,数据库也会根据自增规则自动生成主键并插入到表中。
<insert id="addStaff">insert into staff(code,name,salary,username,userpass)value(#{code},#{name},#{salary},#{username},#{userpass})</insert>
3.update标签
<update id="editStaff">update staff set name=#{name},salary=#{salary},username=#{username},userpass=#{userpass} where id=#{id}</update>
4.delete标签
<delete id="delStaff">delete from staff where id=#{id}</delete>
相关文章:
MyBatis搭建和增删改查
MyBatis是一个开源的持久层框架,用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置,并自动生成对应的SQL语句,从而简化了数据库操作的编码工作。 MyBatis的核心思想是将SQL语句与Java代码分离,…...
【一图学技术】6.反向代理 vs API网关 vs 负载均衡的原理和使用场景
反向代理 vs API网关 vs 负载均衡 一、概念 🌏反向代理(Reverse Proxy)是一种位于服务器和客户端之间的代理服务器。 它接收来自客户端的请求,并将其转发给后端服务器,然后将后端服务器的响应返回给客户端。客…...
python爬虫番外篇 | Reuqests库高级用法(1)
文章目录 1.会话对象(Session Objects)2.请求和响应对象(Request and Response Objects)3.准备好的请求(Prepared Requests)4.SSL证书验证5.客户端证书6.CA 证书7.正文内容工作流程(Body Conten…...
【链表OJ】常见面试题 3
文章目录 1.[环形链表II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)1.1 题目要求1.2 快慢指针1.3 哈希法 2.[随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/)2.1 题目要求2.2 迭代法 1.环形链表II 1.1 题目…...
Linux学习笔记9(Linux包管理)
目录 归档包管理 归档 查看归档包 解归档包 压缩包管理 Zip/unzip gzip/gunzip bzip2/bunzip2 源码包安装软件 三大步: 预备步骤:安装依赖的编译库 一、./configure --prefix/usr/local/nginx 二、make 三、make install 软件包安装 配置…...
论文阅读《Geometric deep learning of RNA structure》
引入了机器学习方法,通过少量的数据学习。只使用原子坐标作为输入。 预测RNA三维结构比预测蛋白质结构更困难。 设计了一个原子旋转等变评分器ARES,由每个原子的三维坐标和化学元素类型(输入)指定,ARES预测模型与未知真…...
宏集方案 | 传统建筑智能化改造,迈向物联新时代
前言 智能建筑涉及多个系统的集成,如照明、空调、安防等,这些系统的兼容性和协调运作是一大挑战。然而,传统的工业建筑和商业楼宇受早期设计的局限,多个控制系统间互不兼容,并且难以重新部署通信线缆。 针对传统建筑…...
如果服务器更改Web端口会减少被攻击的风险吗?
通过更改服务器的Web端口,是否能够显著降低被攻击的风险?首先,理解Web服务默认使用的端口是关键。HTTP协议通常使用80端口,而HTTPS则默认使用443端口。这些端口因其广泛认知而成为黑客攻击的首要目标。理论上,将Web服务迁移到非标…...
vim列编辑模式
在编辑文本时,经常会有这样的需求,对特定列进行进行批量编辑。比如批量注释一段代码,或者删除待定字符(如一列空格)。幸运的是VIM支持列编辑模式。 假设文本内容: Maximum length of a custom vocabulary…...
如何实现pxe安装部署
此实验环境:rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能(编辑-虚拟网络编辑器) 3、httpd 1、安装httpd服务 [rootlocalhost …...
机器学习常见模型
1、线性模型 线性模型是机器学习最基本的算法类型,它试图学到一个通过多个特征(属性)计算的线性组合来预测的函数,简单的线性回归形式如yaxb,其中,x代表特征,而y代表结果,一旦a和b的…...
【python案例】基于Python 爬虫的房地产数据可视化分析设计与实现
引言 研究背景与意义 房地产行业在我国属于支柱性产业,在我国社会经济发展中一直扮演着重要角色。房价问题,尤其是大中城市的房价问题,一直是政府、大众和众多研究人员关注的热点。如何科学地预测房价是房价问题的研究方向之一。随着互联网…...
如何在Python中诊断和解决内存溢出问题
python的内存溢出即程序在申请内存后未能正确释放,导致随着时间推移占用的内存越来越多,以下是一些可能导致内存溢出的原因: 1、循环引用:当对象之间形成循环引用,并且这些对象定义了__del__方法时,Python…...
什么是爬虫软件?这两个爬虫神器你必须要试试
爬虫软件概述 爬虫,又称为网络爬虫或网页爬虫,是一种自动浏览互联网的程序,它按照一定的算法顺序访问网页,并从中提取有用信息。爬虫软件通常由以下几部分组成: 用户代理(User-Agent)…...
记录|MVS和VM软件使用记录
目录 前言一、常用属性二、触发模式选择三、操作注意点四、录像、抓拍功能五、VM软件六、VM软件界面介绍七、VM软件运行间隔八、VM软件图像源九、VM软件相机管理十、获取图像十一、方案存储十一、相机拍摄彩图转换颜色转换快速匹配特征模板:运行参数 十二、位置修正…...
算法通关:014_1:用栈实现队列
文章目录 题目总结代码运行结果 题目 用栈实现队列 leetcode :232 总结 时间复杂度 平均下来每个方式是O(1) 代码 class MyQueue {public Stack<Integer> in;public Stack<Integer> out;//初始化public MyQueue() {in new Stack<>();out new Stack<…...
【C#】Random
在 C# 中,Random 类的实例通常用于生成随机数。在方法内部或外部创建 Random 实例主要影响的是实例的生命周期和性能。 在方法外部创建 Random 实例 生命周期:如果在类的成员变量中创建 Random 实例,那么这个实例的生命周期将与类的实例相同…...
MongoDB简介及其在Java中的应用
什么是MongoDB? MongoDB是一个基于分布式文件存储的数据库,由C语言编写。它旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB结合了关系数据库和非关系数据库(NoSQL)的特点,是功能最丰富、最像关系数据库的…...
JSON-LD上下文将属性映射到RDF IRIs示例
为了更清晰地说明JSON-LD上下文是如何将属性映射到RDF IRIs,我们可以基于提供的上下文规范,举一个完整的JSON-LD数据实例,并展示它是如何转换为RDF三元组的。 示例上下文 {"context": {"foaf": "http://xmlns.com…...
Spring的监听机制详解
Spring的监听机制详解 讲在前面 对Spring框架,大家都已不陌生,它给我们提供了很多功能,包括IoC、AOP、事务管理等。其中,Spring的事件监听机制是一项非常重要的功能,它允许开发人员定义和处理自定义事件,并…...
被拉黑还有补救的方法吗?别慌,这样做反而更容易挽回
被拉黑的那一刻,很多人都会瞬间慌了神。是不是彻底结束了?是不是再也没有机会了?是不是不管做什么,都只会让对方更反感?你拼命想解释,却发不出消息;想道歉,却连门口都靠近不了&#…...
如何用3个步骤轻松下载B站视频:BBDown_GUI完全指南
如何用3个步骤轻松下载B站视频:BBDown_GUI完全指南 【免费下载链接】BBDown_GUI BBDown的图形化版本 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown_GUI 还在为复杂的命令行工具而烦恼吗?BBDown_GUI让你告别代码恐惧,用最简单的…...
GLM-5.1 深度解析:它为什么不只是一个更强的聊天模型?
GLM-5.1 深度解析:它为什么不只是一个更强的聊天模型?很多人看一个新模型,第一反应还是:它聊天强不强?推理行不行?中文味够不够? 但如果把视角放到 2026 年的大模型应用现场,你会发现…...
Bypass Paywalls Clean实用指南:解锁付费新闻的技术解析
Bypass Paywalls Clean实用指南:解锁付费新闻的技术解析 在当今信息时代,众多优质新闻媒体设置了付费墙机制,限制了用户对深度内容的访问。Bypass Paywalls Clean作为一款技术解决方案,为读者提供了突破这些限制的可能性。本文将深…...
XXMI启动器终极指南:一站式管理所有二次元游戏模组
XXMI启动器终极指南:一站式管理所有二次元游戏模组 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为《原神》、《崩坏:星穹铁道》、《鸣潮》、《绝区…...
【Zotero】Zotero翻译插件时好时坏?一文讲透原因与解决方案
学术人的痛:今天的翻译,明天的“请求错误” 作为一名重度文献阅读者,我每天与Zotero相伴的时间比跟室友说话还多。它的PDF Translate插件堪称学术神器——划词即译,让外语文献阅读效率翻倍。 但有一个问题一直困扰着我ÿ…...
MATLAB高阶累积量函数实战:从理论到ARMA信号分析
1. 高阶累积量函数在信号处理中的核心价值 信号处理领域有个常被忽视但极其重要的概念——高阶累积量。传统频谱分析只能捕捉信号的二阶统计特性,就像用黑白照片记录世界。而高阶累积量相当于给信号分析装上了"彩色滤镜",能揭示非高斯信号中隐…...
Phi-4-mini-reasoning辅助软件测试:智能生成测试用例与缺陷推理
Phi-4-mini-reasoning辅助软件测试:智能生成测试用例与缺陷推理 1. 引言:当AI遇见软件测试 "昨天又加班到凌晨,就为了赶测试用例..."这是测试工程师小王的日常吐槽。在软件测试领域,编写全面的测试用例和发现潜在缺陷…...
第六章:异步访问的同步:6.3.1 dma_resv_usage 层级机制详解
1. 概述 dma_resv(DMA reservation object)是 Linux 内核中管理 GPU buffer 同步的核心机制。每个 dma_resv 对象维护一组 dma_fence,用于追踪对该 buffer 的各种操作。 enum dma_resv_usage 定义了 fence 的用途级别,控制"谁…...
2026年智能码牌服务商,究竟合不合法合规?
在数字支付行业蓬勃发展的今天,智能码牌服务商逐渐成为市场的焦点。随着2026年的到来,人们对于这些服务商的合法合规性愈发关注。以财联支付为例,我们来深入探讨智能码牌服务商的合法合规性问题。一、合法合规的基础:技术与资质双…...
