Mybaits(环境搭建和基本使用)

news/2024/3/29 5:48:34/文章来源:https://blog.csdn.net/qq_59854519/article/details/128436187

目录
  一、什么是 Mybaits
  二、配置环境
    2.1 导入 MyBatis Framework
    2.2 连接 MyBatis
  三、增删改查功能
    3.1 创建实体类
    3.2 select
    3.3 delete 和 update
    3.4 insert
  四、SQL 注入
    4.1 什么是 SQL 注入
    4.2 SQL 注入代码
    4.3 #{} 和 ${} 的区别

一、什么是 Mybaits

  • Mybatis 是一个半 ORM(对象关系映射)持久层框架,它支持自定义 SQL、存储过程以及高级映射;
  • 底层是对 JDBC 进行了封装,让数据库操作更加简单(开发人员只需编写核心SQL语句即可);
  • 面对性能要求高,需求变化快的项目,MyBatis 即是开发人员的不二选择。

二、配置环境

2.1 在创建项目的时候,选择 MyBatis Framework 和 自己数据库的驱动,注意,我用的是 MySQL 数据库,这里就选择了 MySQL Driver。

然后,删除里面没用的目录及文件。

2.2 在 resources 目录下创建一个 application.yml 文件 和 一个 mapper 文件夹,粘贴下面代码即可。url、 username 、password 和 配置 JDBC 创建对象时的方法一样,因为 Mybatis 底层还是对其进行封装实现的。
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/TestMybatis?characterEncoding=utf8&useSSL=falseusername: rootpassword: 自己数据库的密码driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath:mapper/**Mapper.xml

此时,运行项目的启动类来测试 Mybatis 是否连接,如果提示这行,表示配置成功。

三、增删改查功能

创建一个名为 TestMybatis 的数据库,导入测试数据表:mybatis.sql

3.1 创建实体类

属性名必须和创建的表里的字段名一致。Mybatis 提供映射标签,支持对象与数据库的 ORM 字段关系映射。

@Data
public class User {private int id;private String username;private String password;
}

3.2 select

(1) 编写接口
在 demo 目录下创建一个 mapper 文件夹,进行接口的实现。

@Mapper
public interface UserMapper {//查询所有用户public List<User> userAll();
}

(2)编写 SQL 语句
在 resources/mapper 目录下, 创建一个 UserMapper.xml 文件进行核心代码实现,通过 xml 文件或注解的方式将要执行的各种 statement 配置起来。

<?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.example.demo.mapper.UserMapper"><select id="userAll" resultType="com.example.demo.model.User">select * from user;</select></mapper>

(3)测试代码

  • 在刚才创建好的接口代码里,右键 Generate;
  • 选择 Text,生成测试代码。

JUnit 是Java的一个开源的单元测试框架,用于编写和运行可重复的测试。JUnit 5是JUnit的下一代,目标是为JVM上的开发人员端测试创建一个最新的基础。这包括关注Java 8及以上版本,以及支持许多不同风格的测试。

@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid userAll() {List<User> result = userMapper.userAll();for (User user:result) {System.out.println(user);}}
}

测试结果如下:

3.3 delete 和 update

(1)接口

因为 Mybatis 提供了 XML 标签,SQL 语句写在XML里面,即可以降低代码的耦合性,也可以提高复用率。

public int deleteUser(@Param("id") Integer id);public int updateTitle(@Param("id") Integer id,@Param("content") String content);

(2)核心代码

<delete id="deleteUser">delete from article where id = #{id};
</delete><update id="updateTitle">update article set content = #{content} where id = #{id};
</update>

3.4 insert

(1)接口

public int insertArticle(@Param("article") Article article);

(2)核心代码

<insert id="insertArticle" useGeneratedKeys="true" keyProperty="id">insert into article values (null,#{article.title},#{article.content},now());
</insert>

四、SQL 注入

4.1 什么是 SQL 注入

SQL 注入就是利用数据库漏洞,利用一些特殊的字段来拼接 SQL 语句,可跳过 Web 应用程序的安全验证,对数据库进行的攻击的一种违法手段。

4.2 SQL 注入代码

' or 1='1

select * from user where username = ‘张三’ and password = ’ ’ or 1='1 ’
上面这条语句可以在不知道用户密码的情况下,进行用户身份的查询,有的 SQL 注入甚至可以达到修改、删除数据等行为。

4.3 #{} 和 ${} 的区别

  • #{} 是预编译时处理。
  • ${}是字符串替换。
  • 使用 #{} 能避免 部分 SQL 注入问题。

预编译处理就是在执行 SQL 语句时把 #{} 替换为 ? 号先进行占位,然后调用 PreparedStatement 的 set 方法根据字段的类型来赋值;字符串替换直接把 ${} 里面的字段当成字符串来处理。

SQL 注入解决方案:

  • 在执行 SQL 语句之前进行参数判断,如果符合类型就执行,否则直接拒之门外;
  • 尽可能使用 #{} 预查询的方式;
  • 开发完毕之后,测试人员进行安全测试。
    在这里插入图片描述

总结:SQL注入问题还是很可怕的,用户隐私泄漏……君子爱财取之有道,希望学习编程的我们能用所学知识,来造福社会。

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

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

相关文章

从根本上理解Synchronized的加锁过程

伸手摘星&#xff0c;即使一无所获&#xff0c;亦不致满手污泥。 请关注公众号&#xff1a;星河之码 作为一个Java开发&#xff0c;对于Synchronized这个关键字并不会陌生&#xff0c;无论是并发编程&#xff0c;还是与面试官对线&#xff0c;Synchronized可以说是必不可少。 …

计算机视觉与图形学-神经渲染专题-非刚体NeRF II

《TiNeuVox:Fast Dynamic Radiance Fields with Time-Aware Neural Voxel》链接&#xff1a;https://jaminfong.cn/tineuvox/摘要作者通过表示具有时间感知体素特征的场景提出了一个辐射场框架&#xff0c;并将其命名为 TiNeuVox。作者引入了一个微小的坐标变形网络来模拟粗略的…

Day 04 - Composition API_ref reactive 函数

1.ref函数 作用: 定义一个响应式的数据&#xff1b; 语法: const xxx ref(initValue) 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff0c;简称ref对象&#xff09;。 JS中操作数据&#xff1a; xxx.value 模板中读取数据: 不需要.value&#xff0c;直…

Vue CLI系列之生成打包报告

文章の目录一、通过命令行参数的形式生成报告二、通过可视化的UI面板直接查看报告写在最后打包时&#xff0c;为了直观地发现项目中存在的问题&#xff0c;可以在打包时生成报告。生成报告的方式有两种&#xff1a; 一、通过命令行参数的形式生成报告 "scripts": {…

【Axure高保真原型】移动端钱包原型模板

今天和大家分享移动端钱包的原型模板&#xff0c;里面包含了11大模块&#xff0c;各个模块都是高保真高交互的原型模板&#xff0c;大家可以在演示地址里体验哦 【原型预览及下载地址】 https://axhub.im/ax9/4c3757a85d201a4c/#c1 这个原型还可以在手机上演示哦&#xff0c…

【精准三点定位求解汇总】利用Python或JavaScript高德地图开放平台实现精准三点定位(经纬度坐标与平面坐标转换法求解、几何绘图法求解)

【精准三点定位求解汇总】利用Python或JavaScript高德地图开放平台实现精准三点定位&#xff08;经纬度坐标与平面坐标转换法求解、几何绘图法求解&#xff09; 众所周知&#xff0c;如果已知三个点的坐标&#xff0c;到一个未知点的距离&#xff0c;则可以利用以距离为半径画…

JavaScript的原型链

JavaScript的原型链 JavaScript的继承主要是通过原型链实现的&#xff0c;所以理解原型链是掌握JavaScript继承的关键一环。原型链的继承的基本思想是通过原型链继承多个引用类型的属性和方法。 理解原型链 关于原型链的定义与理解&#xff1a; 每个构造函数都有一个原型对…

Sentinel流控

Sentinel 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.sentinel特性 Sentinel 具有以下特征: 丰富的应用场景&#xff1a; Sentinel 承接了…

【折腾服务器 3】群晖学习版中安装 Active Backup for Business 及相关配置 =)

Catch UP 书接上回&#xff0c;在 ESXi 中安装了群晖系统&#xff0c;这个系统主要是用来给 Windows 物理机做备份的&#xff0c;因此在本片主要讲解如何配置 Active Backup for Business 软件。 Chapter 1 设置存储空间 上一篇博客中&#xff0c;安装群晖时分配了一个 32GB…

【高精度定位】关于GPS、RTK、PPK三种定位技术的探讨

高精度定位通常是指亚米级、厘米级以及毫米级的定位&#xff0c;从市场需求来看&#xff0c;定位的精度越高往往越好。“高精度、低成本”的定位方案无疑将是未来市场的趋势。 在物联网时代&#xff0c;大多数的应用或多或少都与位置服务相关联&#xff0c;尤其是对于移动物体而…

「 理财与风险控制|养老系列」你想象中的高端养老社区是什么样?

本文主要介绍为什么养老规划需要考虑养老社区的部分&#xff0c;当前市场上养老社区的各种现状&#xff0c;养老社区从各个角度分类&#xff0c;选择养老社区需要关注的要素以及保险保单能够提供的养老权益是怎样的 文章目录01 为什么要关注养老社区&#xff1f;02 为什么关注高…

【docker常用命令】

一、帮助启动类命令 &#xff08;1&#xff09;启动docker systemctl start docker&#xff08;2&#xff09;停止docker systemctl stop docker&#xff08;3&#xff09;重启docker systemctl restart docker&#xff08;4&#xff09;查看docker状态 systemctl status…

移动端测试必备技能: adb命令和抓包

移动端测试 是指对移动应用进行的测试&#xff0c;即实体的特性满足需求的程度&#xff0c;进行测试前需要搭建测试环境。 1 移动端自动化环境搭建 1.1 java安装 java JDK 安装jdk-8u181-windows-x64.exe 配置环境变量&#xff1a; JAVA_HOME&#xff1a;D:\developer to…

【c++】STL--vector

前言 想必大家已经对string有所了解了&#xff0c;string是专门用于字符串的。今天讲到的vector则是表示可变大小数组的序列容器。就像数组一样&#xff0c;vectoer也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组…

SpringBoot系列之自动装配原理详解

文章目录前言一、SpringBoot自动配置-Condition-11、观察spring自动创建bean过程2、创建自定义bean对象3、根据条件创建自定义bean二、 SpringBoot自动配置-Condition-2三、SpringBoot自动配置-切换内置web服务器1、查看继承关系图2、shiftdelete 排除Tomcat四、SpringBoot自动…

12.20工作学习记录 力扣 罗马文转数字

每日一题:罗马文转数字 定义两个指针 不断后移 每一次让前一个指针的值累加为sum 最后返回sum 力扣https://leetcode.cn/problems/roman-to-integer/ 最长公共前缀 主要是subString方法 力扣https://leetcode.cn/problems/longest-common-prefix/solutions/现在分词与形容…

圣诞的荒诞小故事并记录互联网协议-五层模型

今天敲代码敲着敲着灵光乍现&#xff0c;突然一个荒诞的故事&#x1f4a1;映入脑海。 1.未来和过去&#xff1a; 人高度发达&#xff08;以下称之为渡&#xff09; 渡可以打开时空穿越过去&#xff08;以下称之为旧迹&#xff09;&#xff0c;并且可以进随心所欲的来去自如&a…

基于yolov5s实践国际象棋目标检测模型开发

在我前面的一篇文章中讲解实现了基于改进的yolov5s-spd模型实现了五子棋目标对象检测模型系统的设计开发&#xff0c;这里紧接前文&#xff0c;突发奇想&#xff0c;是否可以借鉴同样的思路实现象棋的检测模型开发呢&#xff1f;理论上面肯定是可以的&#xff0c;但是实际效果如…

详细介绍关于自定义类型:结构体、枚举、联合【c语言】

文章目录结构体结构体的声名特殊的声明结构成员的类型结构的自引用结构体变量的定义和初始化结构体内存对齐修改默认对齐数结构体变量访问成员结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段的内存分配位段的跨平台问题枚举枚举类型的定义枚举的…

微信小程序入门

目录 一&#xff0c;简介 二&#xff0c;小程序开发环境搭建 1.申请账号 2.安装开发工具 3.小程序工具使用 三&#xff0c;目录结构以及json配置 1.目录结果 2.json配置 3.JSON 语法 4.WXML 5.wxss 6.JS 逻辑交互 四&#xff0c;小程序宿主环境 1.程序与页面 2.组件…