Mybatis学习-day18

Mybatis学习-day18

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。

MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。其封装性低于 Hibernate,但性能优秀、小巧、简单易学、应用广泛。

MyBatis 的主要思想是将程序中的大量 SQL 语句剥离出来,使用 XML 文件或注解的方式实现 SQL 的灵活配置,将 SQL 语句与程序代码分离,在不修改程序代码的情况下,直接在配置文件中修改 SQL 语句。

MyBatis 与其它持久性框架最大的不同是,MyBatis 强调使用 SQL,而其它框架(例如 Hibernate)通常使用自定义查询语言,即 HQL(Hibernate查询语言)或 EJB QL(Enterprise JavaBeans查询语言)

1. ORM

ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。

2. 搭建Mybatis

添加Maven依赖

<dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.14</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.6</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><version>2.6.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency>
</dependencies>

在项目的resource的文件夹下创建application.yml,配置mybatis数据源

在这里插入图片描述

#配置mybatis的数据源 DataSource
spring:datasource:username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/easydata

创建启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class EasySpringApplication {public static void main(String[] args) {SpringApplication.run(EasySpringApplication.class, args);}
}

如果启动项目成功,则搭建成功

3. 增删改的实现

在 Spring Boot 配置文件(如 application.properties 或 application.yml)中,mybatis.mapper-locations 设置指定了 MyBatis 映射器(Mapper)XML 文件的位置。这些 XML 文件包含了 SQL 映射语句,通常用于定义 SQL 查询、插入、更新和删除操作。这个配置项告诉 MyBatis 在哪里查找这些映射文件。

具体来说,mybatis.mapper-locations=classpath:mapper/*.xml 这段代码的含义如下:

  • classpath::表示 MyBatis 应该在 Java 类路径(classpath)上搜索映射文件。类路径是 Java 应用程序在运行时查找类文件和资源的位置集合。

  • mapper/:是放置 MyBatis 映射器 XML 文件的目录。这个目录通常位于项目的资源(resources)目录下。例如,在 Maven 或 Gradle 项目中,它通常位于 src/main/resources/mapper。

  • *.xml:是一个通配符,表示 MyBatis 应该加载 mapper 目录下的所有 .xml 文件。每个 XML 文件通常对应于一个映射器接口(Mapper Interface),其中包含了 SQL 语句和对应的方法。

这种配置方式使得 MyBatis 可以自动找到并加载这些映射文件,进而将 XML 文件中定义的 SQL 语句关联到对应的映射器接口。这样,当在应用程序中调用映射器接口的方法时,MyBatis 会执行相应的 SQL 语句。

mybatis:mapper-locations: classpath:mapper/*.xml

要操作的数据库表结构如下图所示

在这里插入图片描述

在resource目录下新建mapper文件夹,在mapper文件夹中创建Staff_Mapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//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><insert id="addStaff">/*预编译*/insert into staff(code, name, salary, username, userpass)value(#{code}, #{name}, #{salary}, #{username}, #{userpass})</insert><delete id="delStaff">delete from staff where id = #{id}</delete><update id="editStaff">update staff set name = #{name}, salary = #{salary}, username = #{username}, userpass = #{userpass}where id = #{id}</update>
</mapper>

创建bean类Staff

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;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getSalary() {return salary;}public void setSalary(BigDecimal salary) {this.salary = salary;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {this.userpass = userpass;}
}

创建Mapper接口IStaff

@Mapper注解是由Mybatis框架中定义的一个描述数据层接口的注解,注解往往起到的都是一个描述性作用,用于告诉Spring框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。

import com.easy.bean.Staff;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface IStaffDao {String getNow();//sql语句没有返回值  方法有返回值,为插入的行数int addStaff(Staff staff);int delStaff(int id);int editStaff(Staff staff);
}

在控制类中注入接口类,调用Mybatis实现的方法

@RestController
public class EasyController {@AutowiredIStaffDao dao;@GetMapping("now")public String now(){return dao.getNow();}@PostMapping("staff")public String addStaff(Staff staff){int res = dao.addStaff(staff);return res + " add successfully!";}@DeleteMapping("staff/{id}")public String delStaff(@PathVariable int id){int res = dao.delStaff(id);return res + " delete successfully";}@PutMapping("staff")public String editStaff(Staff staff){int res = dao.editStaff(staff);return res + " edit successfully";}
}

启动项目,使用ApiPost发送不同的请求,进行测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试成功

4. 预编译(#) 参数拼接($)

在mybatis中,#和$分别代表预编译参数和字符串拼接。它们在处理SQL语句中的参数时有着不同的行为

4.1 预编译(#)

1、作用:#用于表示预编译参数,它可以防止SQL注入攻击。当使用#时,MyBatis会将参数值进行转义处理,确保参数值不会被当作SQL代码执行。

2、语法:在SQL语句中,使用#{}包围参数名称,如:SELECT * FROM users WHERE id = #{id}

3.示例

<select id="getUser" parameterType="int" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}
</select>

4、特点:使用#可以确保SQL代码的安全性,防止sql注入和加快批处理的效率,但可能会影响性能。因为预编译参数需要对每个参数值进行转义处理,所以在处理大量参数时可能会导致性能下降。

4.2 参数拼接($)

1、作用:用于表示字符串拼接,它可以将参数值直接插入到sql语句中。当使用用于表示字符串拼接,它可以将参数值直接插入到SQL语句中。当使用时,MyBatis不会对参数值进行转义处理,因此需要注意防止SQL注入攻击。

2、语法:在SQL语句中,使用包围参数名称,如:SELECT * FROM users WHERE name = ${name}

3.示例

<select id="getUser" parameterType="string" resultType="com.example.User">SELECT * FROM users WHERE name = ${name}
</select>

4、特点:使用$可以直接将参数值插入到SQL语句中,可以提高性能。但由于没有进行转义处理,需要注意防止SQL注入攻击。在使用时,应确保参数值是可信的,或对参数值进行手动转义处理。

5. SQL注入

SQL注入(SQL Injection)是一种常见的Web安全漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。

当我们使用参数拼接的方式来写sql语句,如下所示

SELECT * FROM users WHERE id = '${id}' LIMIT 0,1;

如果用户传入的参数为1则可以正常查询

SELECT * FROM users WHERE id = '1' LIMIT 0,1;

但若用户多输入了一个单引号,程序就会报错,原因是用户输入的单引号和前面的单引号形成了组合,由此多出了一个单引号导致程序异常

SELECT * FROM users WHERE id = '1''LIMIT 0,1;

既然用户想拼接什么就拼接什么,那么如果用户输入1' or 1 = 1 --在1后面输入单引号与前面的单引号实现拼接,再在后面加上true的条件,最后将后面的限制给注释掉,用户就能得到所有的users表数据,这就是sql注入。

户传入的参数为1则可以正常查询

SELECT * FROM users WHERE id = '1' LIMIT 0,1;

但若用户多输入了一个单引号,程序就会报错,原因是用户输入的单引号和前面的单引号形成了组合,由此多出了一个单引号导致程序异常

SELECT * FROM users WHERE id = '1''LIMIT 0,1;

既然用户想拼接什么就拼接什么,那么如果用户输入1' or 1 = 1 --在1后面输入单引号与前面的单引号实现拼接,再在后面加上true的条件,最后将后面的限制给注释掉,用户就能得到所有的users表数据,这就是sql注入。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 字典 ({})的概念与操作

1、使用字典 在Python中&#xff0c;字典(dictionary)是一系列键值对(k-v pair)。每个键都有相应的值对应&#xff0c;使用键来访问与之关联的值&#xff0c;与键关联的值可以为数、字符串、列表乃至字典。 在Python中&#xff0c;字典放在花括号&#xff08;{}&#xff09;中…

MySQL1 DDL语言

安装与配置 官网&#xff1a; MySQL :: Download MySQL Installer 阿里云&#xff1a; MySQL8 https://www.alipan.com/s/auhN4pTqpRp 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速…

opencascade AIS_ViewController源码学习 视图控制、包含鼠标事件等

opencascade AIS_ViewController 前言 用于在GUI和渲染线程之间处理视图器事件的辅助结构。 该类实现了以下功能&#xff1a; 缓存存储用户输入状态&#xff08;鼠标、触摸和键盘&#xff09;。 将鼠标/多点触控输入映射到视图相机操作&#xff08;平移、旋转、缩放&#xff0…

联想QuickFix工具中心,一款综合性电脑维护和管理工具

联想QuickFix工具中心是联想公司推出的一款综合性电脑维护和管理工具&#xff0c;它集成了众多实用的电脑维护工具&#xff0c;如系统优化、硬盘清理、网络优化、硬件诊断等&#xff0c;旨在为用户提供一个便捷的平台来解决电脑日常使用中遇到的各种问题。该工具中心适用于Wind…

PyCharm 2024.1 总结和最新变化

​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 PyCharm 2024.1 是 JetBrains 最新发布的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提供更强大的功能和更好的用户体验。以下是对这个版本的总结和最新变化的介绍 智能代码建议和自动完成&#xff1a…

C++基础编程100题-034 OpenJudge-1.4-15 最大数输出

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/15/ 描述 输入三个整数,输出最大的数。 输入 输入为一行&#xff0c;包含三个整数&#xff0c;数与数之间以一个空格分开。 输出 输出一行&#xff0c;包含一个整数&#xff0c;即最大的整数。 样例…

西部菱斑响尾蛇教你基础IO

快学&#xff0c;再不学普洱就要超过你们了 在C阶段进行的文件操作有哪些呢&#xff1f; #include<stdio.h> #include<string.h>int main() {FILE* fp fopen("myfile", "w");if (!fp){printf("fopen error!\n");}const char* msg …

5.8软件工程基础知识-项目管理

项目管理 范围管理产品范围和项目范围管理过程WBS练习题 进度管理基本原则过程活动资源估算 软件规模估算方法进度安排关键路径法练习题 成本管理过程成本的类型练习题 软件配置管理配置项配置基线配置数据库练习题 质量管理过程质量模型软件评审软件容错技术练习题 风险管理宏…

2024年【山东省安全员B证】考试报名及山东省安全员B证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员B证考试报名参考答案及山东省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及山东省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助山东省安全员B证证考试学员顺利通过考试。 1、【…

人工智能时代,程序员当如何保持核心竞争力?

目录 前言 一.AI辅助编程对程序员工作的影响 二.程序员应重点发展的核心能力 三.人机协作模式下的职业发展规划 结束语 前言 随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序…

C语言的编译(预处理操作)+链接

目录 翻译环境和执行环境 预定义符号 #define定义标识符 续行符\ #define定义宏 再说一下&#xff0c;#define其实就是替换 #和## 宏和函数的对比 命名约定 #undef 命令行定义 条件编译 文件包含 避免头文件重复引用&#xff0c;否则会增加代码长度 翻译环境和执行环境 在C中存…

240803-沉侵式翻译插件配置Ollama的API实现网页及PDF文档的翻译

1. 在插件中点击Options按钮 2. 在开发者模式中启动Enable Beta Testing Features 3 在General中进行设置 ## 4. 在Expand中设置API的URL 5. Qwen&#xff1a;0.5B网页翻译效果 6. Qwen&#xff1a;0.5BPDF翻译效果 7. 参考文献 gemma - 给沉浸式翻译插件配置本地大模型o…

Axure中继器:数据动态展示的强大工具

在Axure RP这一强大的原型设计工具中&#xff0c;中继器&#xff08;Repeater&#xff09;无疑是一颗璀璨的明珠。它以其独特的功能和广泛的应用场景&#xff0c;成为设计师在创建数据密集型原型时的首选。本文将深入探讨Axure中继器的特点、使用方式及其在数据动态展示中的重要…

超声波清洗机哪个品牌更值得推荐?实用性强的超声波清洗机推荐

工作再忙碌我们也要做好个人卫生的清洁&#xff0c;这样才是好好生活的体现&#xff0c;不仅仅是身体的&#xff0c;还有人们日常所用的物品卫生也要做好&#xff0c;如果物品因为长时间没有清洗&#xff0c;灰尘一旦得到累积&#xff0c;一些隐藏的细菌也随之滋生出来去危害人…

C++——多态经典案例(二)制作饮品

案例&#xff1a;制作饮品的步骤是差不多一样的&#xff0c;假设都有四步&#xff0c;打开包装Open、煮水Boil、放杯子里面PutInCup、放佐料PutSomething、喝Drink 利用多态&#xff0c;制作茶和咖啡等饮品 分析&#xff1a;定义一个抽象类&#xff0c;纯虚函数包括Open、Boil…

实战:MySQL数据同步神器之Canal

1.概叙 场景一&#xff1a;数据增量实时同步 项目中业务数据量比较大&#xff0c;每类业务表都达到千万级别&#xff0c;虽然做了分库分表&#xff0c;每张表数据控制在300W以下&#xff0c;但是效率还是达不到要求&#xff0c;为了提高查询效率&#xff0c;打算使用ES进行数…

六、8 TIM编码器计数和测速代码

&#xff08;1&#xff09;所用函数 &#xff08;2&#xff09; 1&#xff09; 上拉输入和下拉输入选择&#xff1a;与外部模块保持一致 若外部模块空闲默认输出高电平&#xff0c;就选择上拉输入&#xff0c;默认输入高电平&#xff1b;若外部模块空闲默认输出低电平&#x…

U-Net++原理与实现(含Pytorch和TensorFlow源码)

U-Net原理与实现 引言1. U-Net简介1.1 编码器&#xff08;Encoder&#xff09;1.2 解码器&#xff08;Decoder&#xff09;1.3 跳跃连接&#xff08;Skip Connections&#xff09; 2. U-Net详解2.1 密集跳跃连接2.2 嵌套和多尺度特征融合2.3 参数效率和性能2.4 Pytorch代码2.5 …

【C++ STL】vector

文章目录 vector1. vector的接口1.1 默认成员函数1.2 容量操作1.3 访问操作1.4 修改操作1.5 vector与常见的数据结构的对比 2. vector的模拟实现2.1 类的定义2.2 默认成员函数迭代器的分类 2.3 容量接口memcpy 浅拷贝问题内存增长机制reserve和resize的区别 2.4 修改接口迭代器…

老照片修复软件分享3款!码住一些实用的方法!

在数字时代&#xff0c;老照片不仅是时间的印记&#xff0c;更是我们珍贵的记忆载体。然而&#xff0c;随着时间的流逝&#xff0c;这些照片往往会变得模糊、褪色甚至破损。幸运的是&#xff0c;现代科技的发展为我们提供了多种老照片修复软件&#xff0c;让我们能够轻松恢复这…