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

news2024/7/6 17:40:35

目录
  一、什么是 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=false
    username: root
    password: 自己数据库的密码
    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 {

    @Autowired
    private UserMapper userMapper;

    @Test
    void 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.coloradmin.cn/o/115338.html

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

相关文章

2022年终总结、展望2023

2022年终总结、展望2023前言一、2022年工作成绩二、2022年工作不足即如何改进三、可以传承的工作方法或者经验四、2023年工作目标 &#xff08;目标细化、可落地&#xff09;<font colorred> 1、薪资待遇2、云端高效的实时智能视频处理平台架构图3、 云端高效的实时智能视…

Redis从部署群集到ASK路由

目录 数据库简介 一、数据库分类 二、Redis重要特性 三、redis应用场景 安装redis redis基本命令 redis持久化 redis主从复制 redis集群 群集实施 配置节点发现 Redis Cluster 通讯流程 Redis Cluster手动分配槽位 Redis Cluster ASK路由介绍 模拟故障转移 自动搭建部署Redis C…

前缀.因式分解.求和 .C

前缀和:在输入同时获得结果. s[i]s[i-1]input(a[i]). 区间和:前缀做差 Sum[A,B]s[B]-s[A-1]. for(i1,i<n,i){ input(a[i]); s[i]s[i-1]input(a[i]). input(a,b); counts[b]-s[a-1]; } 分解伪代码 Sa2*a1a3*(a2a1)a4*(a3a2a1)a5*(a4a3a2a1) 因式分解复杂度on; >&g…

一文告诉你如何选择低代码供应商?

低代码&#xff08;零代码&#xff09;软件平台、套件、工具和相关服务正在快速地广泛普及和扩展。现在许多人都知道&#xff0c;低代码软件解决方案提供的加速器和自动化&#xff0c;可以加速软件应用程序开发人员的工作……这就意味着&#xff08;在这个开发人员匮乏的星球上…

动态规划算法典型例题

这里写目录标题1、动态规划算法2、动态规划&分治3、动态规划算法典型例题3.1选数问题3.1.1递归解法3.1.2动态规划解法3.2最长公共子序列3.3钢条切割问题3.3.1递归解法3.3.2动态规划解法3.4斐波那契数列3.4.1递归解法3.4.2递归解法3.5背包问题&#xff08;0-1背包&#xff0…

SRS服务器搭建以及展现配置说明

对于企业而言&#xff0c;数字化建设是一项全面的、系统的工程&#xff0c;不仅仅只是部署几套软件、实现办公自动化而已&#xff0c;尤其是大型企业&#xff0c;数字化的建设往往涉及到了服务器、硬件、软件、网络等一系列内容。如门禁系统和人力、认证等系统集成&#xff0c;…

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

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

Flink-使用合流操作进行实时对账需求的实现

学Flink第八章多流转换的时候&#xff0c;进行合流操作.connect()使用到了第九章状态编程的知识&#xff0c;感觉总体不是很清晰&#xff0c;因此学完状态编程后现在进行重温并细化一些细节 业务背景 步骤一&#xff1a; 用户进行支付的时候&#xff0c;后台是需要调用第三方…

leetcode 834. Sum of Distances in Tree(树中的距离和)

无向连接的树&#xff08;不一定是二叉树&#xff09;&#xff0c;求每个节点到其他节点的距离和。 返回一个数组&#xff0c;数组的第i个元素就是第i个节点到其他所有节点的距离之和。 思路&#xff1a; 涉及无向图的构造和遍历&#xff0c;树的前序后序遍历&#xff0c;问题…

论文复现-1:Perturbation CheckLists for Evaluating NLG Evaluation Metrics

以data2text任务为例&#xff0c;探讨generation metric矩阵对于一些句子扰动是否敏感&#xff0c;在多个维度上的敏感性如何&#xff1f; 1数据集 data2text数据集是由3025条samples构成&#xff0c;关键词由“ID”和“reference”构成。 每个子任务由对应的criteria&#…

python基础语法19-calendar模块

一、简介 有了time及datetime模块&#xff0c;再结合日历&#xff08;Calendar&#xff09;模块就可以更好的覆盖到时间处理的各个方面的应用。日历模块主要是用于处理日历及星期相关操作。 calendar模块的内置函数如下: 序号 函数及描述 1 calendar.calendar(yea…

Keras深度学习实战(42)——强化学习基础

Keras深度学习实战&#xff08;42&#xff09;——强化学习基础0. 前言1. 强化学习基础1.1 基本概念1.2 马尔科夫决策过程1.3 目标函数2. 在具有非负奖励的模拟游戏中获取最佳动作2.1 问题设定2.2 模型分析2.3 模型构建与训练3. 在模拟游戏中获取最佳动作3.1 问题定义3.2 模型分…

数据库原理及MySQL应用 | 数据表操作

数据表操作是数据库操作中最基本和最重要的操作。 图5-1是图书销售数据库booksale中存放的图书表books。 ■ 图5-1图书表books 01. 表的结构 表的结构也称为“型”(Type)&#xff0c;用于描述存储于表中的数据的逻辑结构和属性。定义表就是指定义表的结构&#xff0c;使用数据…

Vue CLI系列之生成打包报告

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

关于对计算机发展史、冯诺依曼体系、CPU基本工作流程以及关于编程语言的简单认识

关于计算机发展史&#xff1a; 关于计算机发展史&#xff0c;大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。 公元前2500年&#xff0c;算盘已经出现&#xff1b; 1694 年&#xff0c;德国博物学家 戈特弗里德莱布尼兹建造了“步进计算器”。 关于步进…

Djiango实现用户管理增删改成功能实战

1.0定义 前后端不分离模式 前后端分离是指前端页面看到的效果都是由后端控制&#xff0c;即后端渲染HTML页面&#xff0c;前端与后端的耦合度比较高 前后端分离模式 后端仅返回前端所需要的数据&#xff0c;不在渲染HTML页面&#xff0c;不在控制前端的效果&#xff0c;至…

八、kubernetes1.25应用升级、回滚

1、概述 用户希望应用程序始终可用&#xff0c;而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中&#xff0c;这些是通过滚动更新&#xff08;Rolling Updates&#xff09;完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例&#xff0c;零停机进行 Deploym…

Sentinel流控

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

最优化方法——最小二乘法与梯度下降法

目录 系列文章目录 一、问题 二、实验思路综述 1.实验工具及算法 2.实验数据 3.实验目标 4.实验步骤 三、最小二乘问题引入 1.最小二乘问题样例 2.最小二乘问题解决方案及数学模型化 3.相关线性代数知识导入 3.1 梯度 3.2 矩阵的逆 3.3 QR分解 四、最小二乘法 …

用 ChatGPT 运行 Python

最近&#xff0c;我一直在阅读一些关于ChatGPT的有趣文章。在一篇文章中&#xff0c;有人发明了一种新的语言&#xff0c;并让ChatGPT运行它。在另一篇文章中&#xff0c;有人在ChatGPT中运行一个虚拟机。后者启发我提出了下面这个问题。你能在ChatGPT中运行一个交互式Python会…