Mybatis学习-day18

news2024/12/23 16:26:04

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: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: 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 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>
    <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 {

    @Autowired
    IStaffDao 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.coloradmin.cn/o/1983822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution {Random random new Random();public void wiggleSort(int[] nums) {int n nums.length;int x (n 1) / 2;int mid x - 1;int target findKthLargest(nums, n - mid);for (int k 0, i 0, j n - 1; k < j; k) {if…

4章3节:缺失值的处理(上)

在医学科研中&#xff0c;由于失访、无应答或记录不清等各种原因&#xff0c;经常会遇到数据缺失的问题。本文将深入探讨医学科研中数据缺失的成因、分类、影响以及应对方法&#xff0c;结合R语言的实际应用&#xff0c;为医学研究人员提供全面的解决方案。 一、认识缺失数据 …

一款开源且免费的系统清理工具,绿色免安装

BleachBit是一款开源且免费的系统清理工具&#xff0c;最初设计用于Linux系统&#xff0c;但现在已经支持Windows。该工具的主要功能包括清理缓存、删除临时文件、清除浏览器历史记录、删除cookies和日志文件等。此外&#xff0c;它还能够安全地擦除文件内容&#xff0c;确保数…

【Java数据结构】---泛型

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 包装类装箱和拆箱泛型泛型…

HarmonyOS应用开发知识地图

HarmonyOS 应用开发旅程 HarmonyOS 应用开发旅程 PS&#xff1a;Xmind原文件可以直接跳转官方具体文档地址&#xff0c;如需要原文件请联系&#xff1a;DYZZ198 01.准备与学习 学习 HarmonyOS 的基本概念和架构,搭建好所需的开发工具和环境,了解开发规范和最佳实践 了解 H…

C语言菜鸟入门·数据结构·链表超详细解析

目录 1. 单链表 1.1 什么是单链表 1.1.1 不带头节点的单链表 1.1.2 带头结点的单链表 1.2 单链表的插入 1.2.1 按位序插入 &#xff08;1&#xff09;带头结点 &#xff08;2&#xff09;不带头结点 1.2.2 指定结点的后插操作 1.2.3 指定结点的前插操作 1.3 …

【HarmonyOS NEXT星河版开发学习】小型测试案例04-个人中心顶部导航

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 主轴对齐方式在鸿蒙开发中非常重要&#xff0c;通过合理选择 justifyContent 和 alignItems 属性&#xff0c;开发者可以精确控制 Fle…

度言软件介绍

度言软件管理员操作后台 https://www.duyansoft.com企业后台为公司管理员操作后台&#xff0c;共计有七个功能版块 控制台 成员管理——员工管理 成员管理——员工管理&#xff08;添加员工&#xff09; 成员管理——团队管理 公司管理员可以新建/编辑/删除团队&#xff0c…

【Web开发手礼】探索Web开发的秘密(十五)-Vue2(2)AJAX、前后端分离、前端工程化

主要介绍了AJAX、前后端分离所需的YApi、前端工程化所需要的环境安装&#xff01;&#xff01;&#xff01; 目录 前言 AJAX ​原生Ajax Axios Axios入门 案例 前后端分离开发 YApi ​前端工程化 环境准备 总结 前言 主要介绍了AJAX、前后端分离所需的YApi、前端工…

26集 ESP32 AIchat启动代码分析-《MCU嵌入式AI开发笔记》

26集 ESP32 AIchat启动代码分析-《MCU嵌入式AI开发笔记》 这集我们分析代码如何组织起来&#xff0c;如何编译 先用sourceinsight把代码加进工程。 新建一个sourceinsight工程&#xff0c;把AI-CHAT代码加进来&#xff0c;之后把ESP IDF代码加进来&#xff0c;之后把ESP-ADF加…

android compose设置圆角不起作用

进度条progress设置背景圆角不起作用&#xff1a; 源码&#xff1a; Composablefun CircularProgress(modifier: Modifier, vm: TabarCmpViewModel?) {if (vm?.showLoading?.value ! true) returnBox(modifier modifier.background(Color(0x99000000)).defaultMinSize(minW…

【kubernetes】亲和力(Affinity)

亲和力&#xff08;Affinity&#xff09; 针对节点(NodeAffinity) 1&#xff0c;RequiredDuringSchedulinglgnoredDuringExecution 硬亲和力&#xff0c;即支持必须部署在指定的节点上&#xff0c;也支持必须不部署在指定的节点上。 2&#xff0c;PreferredDuringSchedulin…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 全排列(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

【TS】使用npm全局安装typescript

查看npm安装 npm -v 安装typescript npm i -g typescript 查看安装 tsc 这就是标致着安装完成。

Linux定时任务之crontab

目录 crontab简介crontab语法自定义定时任务举例1、每天中午12点执行命令&#xff1a;2、每5分钟执行一次命令&#xff1a;3、在每月的第一天和第十五天的00:00执行命令&#xff1a;4、在周一到周五的上午 8 点到 10 点之间&#xff0c;每半小时执行一次命令&#xff1a; 使用 …

sqli-labs闯关复现

1.第一关&#xff1a; 提示我们输入数字值得id&#xff0c;我们先输入 ?id1 有回显内容&#xff0c;说明我们已经进入了数据库进行查询。 尝试联表注入&#xff1a; 第一步&#xff1a;首先我们需要知道一张表有几列&#xff0c;可以通过报错和正常回显来判断有几列。 这里…

亚马逊英国站认证 高压锅CE认证

高压锅 一种产生加压蒸汽来烹饪食物的厨具。高压锅可以用于明火&#xff0c;或者插电使用。传统高压锅由采用铝底的钢锅和密封锅盖组成。 亚马逊网站上销售的所有高压锅均须符合指定的认证标准。请注意&#xff0c;如果不符合这些标准&#xff0c;亚马逊可能会撤销您的销售权限…

Centos8搭建npm和maven的nexus私服

nexus私服部署需要依赖JDK&#xff0c;故首先在服务器上部署JDK。 JDK 8 的安装教程 1. 下载安装包 官网下载&#xff1a; Java Archive 注&#xff1a; 官网下载需要注册 Oracle 账户并登录。 2. 安装 将下载下来的tar包上传到服务器上&#xff0c;示例为上传到服务器的/…

C++ | Leetcode C++题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isPowerOfThree(int n) {return n > 0 && 1162261467 % n 0;} };

[MRCTF2020]PYWebsite-1

打开以后查看源码信息 看到flag.php试着打开 提示看到&#xff0c;需要后端审计代码&#xff0c;而且应该要改ip&#xff0c;改成自己本地&#xff0c;burp抓包看一下 改X-Forwarded-For:127.0.0.1 得到flag flag{74242eb7-844f-4638-8aae-9ec37870d585}