当前位置: 首页 > news >正文

MyBatis查询数据库(全是精髓)

1. 什么是MyBatis?

简单说,MyBatis就是一个完成程序与数据库交互的工具,也就是更简单的操作和读取数据库的工具。

2. 怎么学习Mybatis

Mybatis学习只分为两部分:

  • 配置MyBatis开发环境
  • 使用MyBatis模式和语法操作数据库

3. 第一个MyBatis查询

开始搭建MyBatis之前,我们先来看一下MyBatis在整个框架的定位,框架交互流程图:

MyBatis也是一个ORM框架,ORM(Object Relational Mappping),即对象关系映射。在面向对象编程语言中,将关系型数据库与对象建立起映射关系,进而自动完成数据与对象的相互转换:

  1. 将输入数据+SQL映射成原生的SQL
  2. 将结构及映射为返回对象,即输出对象

3.1 创建数据库和表

-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;-- 使用数据数据
use mycnblog;-- 创建表[用户表]
drop table if exists  userinfo;
create table userinfo(id int primary key auto_increment,username varchar(100) not null,password varchar(32) not null,photo varchar(500) default '',createtime timestamp default current_timestamp,updatetime timestamp default current_timestamp,`state` int default 1
) default charset 'utf8mb4';-- 创建文章表
drop table if exists  articleinfo;
create table articleinfo(id int primary key auto_increment,title varchar(100) not null,content text not null,createtime timestamp default current_timestamp,updatetime timestamp default current_timestamp,uid int not null,rcount int not null default 1,`state` int default 1
)default charset 'utf8mb4';-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(vid int primary key,`title` varchar(250),`url` varchar(1000),createtime timestamp default current_timestamp,updatetime timestamp default current_timestamp,uid int
)default charset 'utf8mb4';-- 添加一个用户信息
INSERT INTO `mycnblog`.`userinfo` (`id`, `username`, `password`, `photo`, `createtime`, `updatetime`, `state`) VALUES 
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1);-- 文章添加测试数据
insert into articleinfo(title,content,uid)values('Java','Java正文',1);-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java title','http://www.baidu.com',1);

3.2 创建MyBatis项目

3.3 配置连接字符串和MyBatis

3.3.1 设置MyBatis配置

如果是application.properties添加如下内容:

#配置数据库的连接字符串
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog
spring.datasource.username=root
spring.datasource.password=1111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
# 将数据库中的下换线转换成驼峰,比如 user_name -> userName
mybatis-plus,configuration,map-underscore-to-camel-case=true
# 配置打印 MyBatis 执行的 SQL
mybatis.configuration,log-impl=org.apache,ibatis,logging.stdout,StdoutImpl
# 配置打印 MyBatis 执行的 SQL
Logging.level.com.example.demo=debug

3.4 添加业务代码

下面按照后端开发的工程思路。也就是下面的流程来实现MyBatis查询所有用户的功能:

3.4.1 添加实体类

先添加用户的实体类:

@Data
public class User { private int id;private String username;private String password;private String photo;private Date createTime;private Date updateTime;
}

3.4.2 添加mapper接口

数据持久层接口定义:

@Mapper
public interface UserMapper {public List<User> getAll();
}

3.4.3 添加UserMapper.xml

数据持久层的实现,mybatis的固定xml格式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"></mapper>

UserMapper.xml查询所有用户具体实现SQL:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"><select id="getAll" resultType="com.example.demo.model.User">select * from userinfo </select>
</mapper>

 以下是堆标签的说明:

  • <mapper>标签:需要指定namespace属性,表示命名空间,值为mapper接口的全限定名,包括全包名.类名
  • <select>查询标签:是用来执行数据库的查询操作的:                             

               id:是和interface(接口)中定义的方法名称一样的,表hi堆积恶口的具体实现方法

               resultType:时返回的数据类型,也就是开头我们定义的实体类 

3.4.4 添加Service 

服务层实现代码如下:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAll(){return userMapper.getAll();}
}

3.3.5 添加Controller 

控制器层的实现代码如下;

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/getall")public List<User> getAll(){return userService.getAll();}}

上述代码写完,则很难哥哥MyBatis的查询功能就实现完了,接下来使用postman来测试一下

3.3.6 使用 postman 测试

 4. 增删改操作

接下来,我们实现一个用户的增加、删除、修改操作,对应的MyBatis的标签如下:

  • <insert>标签:插入语句
  • <update>标签:修改语句
  • <delete>标签:删除语句

4.1 增加用户操作

controller实现代码:

    @RequestMapping("/add")public int add(@RequestBody User user){return userService.getadd(user);}

mapper接口代码

public int add(User user);

 mapper.xml

<insert id="add">insert into userinfo(username,password,photo,state)values(#{username},#{password},#{photo},1)
</insert>

postman访问

默认情况会返回受影响的行数

4.2 修改用户操作

controller代码:

@RequestMapping("/update")
public int getupdate(Integer id,String name){return userService.update(id,name);
}

mapper.xml实现代码:

<update id="update">update userinfo set username=#{name} where id=#{id}
</update>

切记修改操作只能用post方法接收参数 

4.3 删除用户操作

    <delete id="delById">delete from userinfo where id=#{id}</delete>

5. 查询操作

5.1 单表查询

 controller:

@RequestMapping("/getuser")
public User getUserById(Integer id) {return userService.getUserById(id);
}

Mapper.xml

<select id="getUserById" resultType="com.example.demo.model.User">select * from userinfo where id=#{id}
</select>

这里上面添加业务代码中 我们都已经提及了,所以不做具体的解释了,我们直接切入重点,参数占位符#{}和${}

5.1.1 参数占位符#{}和${}

  • #{}:预编译处理
  • ${}:字符直接替换

预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的 set ⽅法来赋值。直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

我们在执行#{}的查询操作的时候,控制栏会显示

当我们使用${}的时候:

 这个就是区别所在

 5.1.2 ${}优点

在我们使用淘宝一系列的软件的时候,会有按照价格从高到底排序和从低到高排序,此时我们使用的sql是

<select id="getAllBySort" parameterType="java.lang.String" resultType="com.
example.demo.model.User">select * from userinfo order by id ${sort}
</select>

从小到大查询:

SELECT * FROM your_table ORDER BY id ASC;

从大到小查询:

SELECT * FROM your_table ORDER BY id DESC;

 只有末尾差一个desc,如果我们使用#{sort}就不可以查询,因为使用#{sort}查询的时候,如果传递的值是String则会加上单引号,导致sql错误

5.1.3 SQL注入问题

SQL注入是一种常见的安全漏洞,它允许攻击者通过在应用程序的用户界面中插入恶意的SQL代码来执行未经授权的数据库查询。以下是一个简单的SQL注入示例:

假设有一个简单的登录页面,用户通过提供用户名和密码登录。系统使用以下查询来验证用户是否存在:

SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';

正常情况下,如果用户输入了有效的用户名和密码,他们将被成功验证,否则登录将失败。

然而,如果应用程序没有正确处理用户输入,攻击者可以尝试输入恶意的输入,例如:

' OR '1'='1'; --

如果这个输入被简单地拼接到原始的SQL查询中,那么查询就变成了:

SELECT * FROM users WHERE username = '' OR '1'='1'; --' AND password = '输入的密码';

这个查询中的' OR '1'='1'; --部分使得条件永远为真('1'='1'永远成立),并且--后面的内容是SQL注释,它会使查询的其余部分被忽略。

因此,无论用户输入了什么密码,这个查询都会返回第一个用户,因为条件始终为真。攻击者可能会成功绕过身份验证,进而登录到系统中,即使他们没有提供有效的用户名和密码。

为了防止SQL注入,应用程序应该使用参数化查询或预编译语句,而不是简单地拼接用户输入到SQL查询中。这样可以确保用户输入不会被解释为SQL代码。所以我们应该尽量使用#{}预编译

6. 动态SQL

在 MyBatis 中,动态 SQL 是一种用于根据条件生成不同 SQL 片段的机制。<if><where><set> 是 MyBatis 动态 SQL 中常用的元素之一。

下面简要介绍一下 <if><where><set> 的用法:

6.1 if标签

<if> 元素:<if> 元素允许你在 SQL 中包含条件判断,以便根据条件动态生成 SQL 片段。例如:

<select id="getUserByCondition">SELECT * FROM usersWHERE<if test="username != null and username != ''">username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if>
</select>

但是我们可以发现如果我们 第一个条件不满足的话,第二个条件满足sql语句就会出现问题变成

SELECT * FROM users WHERE AND email = #{email} 所以我们就要提到where标签

6.2 where标签

<where> 元素:<where> 元素用于将所有条件组装在一个 WHERE 子句中,并自动处理条件之间的 AND 连接。示例:

<select id="getUserByCondition" parameterType="map" resultType="User">SELECT * FROM users<where><if test="username != null and username != ''">AND username = #{username}</if><if test="email != null and email != ''">AND email = #{email}</if></where>
</select>

<where> 元素会自动去除不必要的 AND。

6.3 set标签

<set> 元素:<set> 元素用于动态生成 UPDATE 语句中的 SET 子句,根据传入的参数动态设置更新的字段。示例:

<update id="updateUser" parameterType="User">UPDATE users<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="email != null">email = #{email},</if></set>WHERE id = #{id}
</update>

但是如果set中的条件只满足一个的话就会出现一个问题 在末尾会多出一个,来,这个时候我们就需要trim标签了

6.4 trim标签

<trim> 元素是用于处理动态 SQL 时非常有用的元素之一。它允许你定义一种修剪(trim)行为,用于删除生成 SQL 语句中多余的字符,例如多余的逗号、AND 或 OR 等。

<!-- 在 set 子句中使用 trim 元素 -->
<update id="updateUser" parameterType="User">UPDATE users<set><trim suffixOverrides=","><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="email != null">email = #{email},</if></trim></set>WHERE id = #{id}
</update>

trim标签中具有很多的参数我们一一介绍一下:

prefix(可选): 在整个 <trim> 元素内容的最前面插入指定的前缀。示例:

<trim prefix="AND (" suffix=")" suffixOverrides="AND"><!-- content -->
</trim>

suffix(可选): 在整个 <trim> 元素内容的最后面插入指定的后缀。示例

<trim prefix="AND (" suffix=")" suffixOverrides="AND"><!-- content -->
</trim>

prefixOverrides(可选): 从整个 <trim> 元素内容的最前面开始检查,去除第一个匹配的指定前缀。示例:

<trim prefix="AND (" suffix=")" prefixOverrides="AND"><!-- content -->
</trim>

suffixOverrides(可选): 从整个 <trim> 元素内容的最后面开始检查,去除第一个匹配的指定后缀。示例:

<trim prefix="AND (" suffix=")" suffixOverrides="AND"><!-- content -->
</trim>

相关文章:

MyBatis查询数据库(全是精髓)

1. 什么是MyBatis&#xff1f; 简单说&#xff0c;MyBatis就是一个完成程序与数据库交互的工具&#xff0c;也就是更简单的操作和读取数据库的工具。 2. 怎么学习Mybatis Mybatis学习只分为两部分&#xff1a; 配置MyBatis开发环境使用MyBatis模式和语法操作数据库 3. 第一…...

elementPlus+vue3引入icon图标

安装包管理&#xff0c;推荐使用 yarn npm包有时候会有包冲突&#xff0c;在项目的根目录下执行&#xff0c;在终端下 # Yarn $ yarn add element-plus/icons-vue在main.js或main.ts中进行全局注册&#xff0c;导入所有图标 import * as ElementPlusIconsVue from element-plu…...

Spring框架中的bean管理(XML和注解及属性的注入)

Spring框架中IOC就是将创建对象的权力反转给Spring框架&#xff0c;我们无需自己创建对象&#xff0c;直接在Spring框架的容器中获取即可。 bean中配置的就是需要让Spring管理的类。 XML的bean管理 先写个“HelloWorld”: <bean id"User" class"com.ffyc.…...

MySQL 存储过程提高数据库效率和可维护性

MySQL 存储过程是一种强大的数据库功能&#xff0c;它允许你在数据库中存储和执行一组SQL语句&#xff0c;类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 什么是MySQL存储过程&#xff1f; MySQL存储过程是一…...

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…...

竞赛选题 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python

文章目录 1 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的驾…...

59 权限提升-Win溢出漏洞及ATSCPS提权

目录 知识点必备&#xff1a;windows权限认识(用户及用户组)0x01 普通权限0x02特殊权限 演示案例:基于WEB环境下的权限提升-阿里云靶机基于本地环境下的权限提升-系统溢出漏洞基于本地环境下的权限提升-AT&SC&PS命令 案例给到的思路点总结如下:涉及资源: 这个章节会讲到…...

【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...

关于昨天 Solv 携手 zCloak 与新加坡和加纳两个央行合作的 Project DESFT&#xff0c;很多朋友都发来恭喜和祝福&#xff0c;并希望了解详情。这个事我们秘密努力了半年多&#xff0c;终于有一个阶段性的成果。这里我转载中文版官宣新闻稿&#xff0c;欢迎大家关注。等我忙过这…...

requests库进行爬虫ip请求时遇到的错误解决方法

问题背景 在使用requests库进行HTTP请求时&#xff0c;用户遇到了一个AuthenticationRequired&#xff08;身份验证必须&#xff09;的错误。然而&#xff0c;当使用urllib.request.urlopen执行相同的操作时&#xff0c;却能够成功。同时&#xff0c;用户提供了自己的系统信息…...

目标检测—YOLO系列(二 ) 全面解读论文与复现代码YOLOv1 PyTorch

精读论文 前言 从这篇开始&#xff0c;我们将进入YOLO的学习。YOLO是目前比较流行的目标检测算法&#xff0c;速度快且结构简单&#xff0c;其他的目标检测算法如RCNN系列&#xff0c;以后有时间的话再介绍。 本文主要介绍的是YOLOV1&#xff0c;这是由以Joseph Redmon为首的…...

Redis维护缓存的方案选择

Redis中间件常常被用作缓存&#xff0c;而当使用了缓存的时候&#xff0c;缓存中数据的维护&#xff0c;往往是需要重点关注的&#xff0c;尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。 1、先删除缓存&#xff0c;再更新数据库 导致数据不一致的…...

LeetCode236. Lowest Common Ancestor of a Binary Tree

文章目录 一、题目二、题解 一、题目 Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest…...

基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统

文/朱季谦 环境准备&#xff1a;安装Gin与Gorm 本文搭建准备环境&#xff1a;GinGormMySql。 Gin是Go语言的一套WEB框架&#xff0c;在学习一种陌生语言的陌生框架&#xff0c;最好的方式&#xff0c;就是用我们熟悉的思维去学。作为一名后端Java开发&#xff0c;在最初入门…...

【开源】基于Vue和SpringBoot的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…...

Windows11怎样投屏到电视上?

电视屏幕通常比电脑显示器更大&#xff0c;能够提供更逼真的图像和更震撼的音效&#xff0c;因此不少人也喜欢将电脑屏幕投屏到电视上&#xff0c;缓解一下低头看电脑屏幕的烦恼。 Windows11如何将屏幕投射到安卓电视&#xff1f; 你需要在电脑和电视分贝安装AirDroid Cast的电…...

ubuntu中用docker部署jenkins,并和码云实现自动化部署

1.部署jenkins docker network create jenkins docker run --name jenkins-docker --rm --detach \--privileged --network jenkins --network-alias docker \--env DOCKER_TLS_CERTDIR/certs \--volume jenkins-docker-certs:/certs/client \--volume jenkins-data:/var/jen…...

for,while,do-while,死循环,嵌套循环,跳转关键字,随机数

1.for循环 public class ForDemo1 {public static void main(String[] args) {for (int i 0; i < 5; i) {System.out.println("HelloWorld");}System.out.println("--------------------------------------------");for (int i 1; i <10 ; i) {Sy…...

【六袆 - MySQL】SQL优化;Explain SQL执行计划分析;

Explain SQL执行计划分析 概念:English Unit案例分析1.分析的SQL2.执行计划分析 【如图】MySQL执行计划参数以及它们的影响或意义:概念: MySQL执行计划(Execution Plan)是数据库系统根据查询语句生成的一种执行策略,用于指导数据库引擎执行查询操作。 English Unit This…...

【AI视野·今日NLP 自然语言处理论文速览 第六十二期】Wed, 25 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 25 Oct 2023 (showing first 100 of 112 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MuSR: Testing the Limits of Chain-of-thought with Multistep Soft R…...

各种符号地址,可以直接复制粘贴使用

字符符号 - 文本数字工具 | 偷懒工具 toolight.cn...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...