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的事件监听机制是一项非常重要的功能,它允许开发人员定义和处理自定义事件,并…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...