MyBatis(初阶)
1.什么是MyBtis
MyBatis是持久层框架,⽤于简化JDBC的开发。
2.准备工作
2.1 创建⼯程

数据库:

2.2 配置数据库连接字符串
以application.yml⽂件为例:

2.3 写持久层代码
@Data
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
添加mapper接口:

@Mapper会告诉Spring,把对象交给Spring管理
2.4 单元测试

3. MyBatis的基础操作(注解)
3.1 打印日志
在Mybatis当中我们可以借助⽇志,查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
#打印mtbatis日志的配置
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.2 传递参数
@Mapper
public interface UserInfoMapper {@Select("select * from userinfo")List<UserInfo> selectAll();@Select("select * from userinfo where id= 1 ")UserInfo selectOne();@Select("select * from userinfo where id=#{id} ")UserInfo selectOne1(Integer id);//参数重命名@Select("select * from userinfo where id=#{userId} ")UserInfo selectOne2(@Param("userId") Integer id);}
首先要添加@SpringBootTest注解,启动Spring容器,才能注入
@SpringBootTest
@Slf4j
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}@Testvoid selectOne() {log.info(userInfoMapper.selectOne().toString());}@Testvoid selectOne1() {log.info(userInfoMapper.selectOne1(1).toString());}@Testvoid selectOne2() {log.info(userInfoMapper.selectOne2(1).toString());}
}
3.3 增
①
②获取自增ID:


③对INSERT的参数进行重命名:
如果对对象进行重命名:

此时会报错:

修改:
#{对象名.属性名}

3.4 删

3.5 改


3.6 查
①
@Mapper
public interface UserInfoMapper {/*** 查询* @return*/@Select("select * from userinfo")List<UserInfo> selectAll();@Select("select * from userinfo where id=#{id}")UserInfo selectOne(Integer id);//对参数进行重命名@Select("select * from userinfo where id=#{id123}")UserInfo selectOne2(@Param("id123") Integer id);}

②结果映射
MyBatis会自动把mysql返回的数据,和java对象进行映射(规则:名称一致)
如果mysql字段名和java对象的属性不一致:
方法一:对字段进行重命名(不推荐)

方法二:@Results注解

想重复利用的话,进行命名:

方法三: 自动转驼峰

4. MyBatis XML配置⽂件
4.1 配置数据库连接字符串和MyBatis

4.2 写持久层代码
1. 方法定义Interface
2. 方法实现 XXX.xml
4.2.1 添加mapper接口

4.2.2 添加UserInfoXMLMapper.xml 
数据持久成的实现,MyBatis的固定xml格式:

4.2.3 单元测试(同注释)

4.3 增删改查
4.3.1 增
UserInfoXMLMapper接⼝:
@Mapper
public interface UserInfoXMLMapper {Integer insert(UserInfo userInfo);}
UserInfoXMLMapper.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.example.demo.mapper.UserInfoXMLMapper"><insert id="insert">insert into userinfo (username,password,age,gender,phone)values(#{username},#{password},#{age},#{gender},#{phone})</insert></mapper>
单元测试:
@Slf4j
@SpringBootTest
class UserInfoXMLMapperTest {@Autowiredprivate UserInfoXMLMapper userInfoXMLMapper;@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setUsername("java108");userInfo.setPassword("java108");userInfo.setAge(1);userInfo.setGender(2);userInfo.setPhone("456567899231");Integer result= userInfoXMLMapper.insert(userInfo);log.info("影响行数:{}, 插入的结果ID:{}",result,userInfo.getId());}}
返回自增ID:

4.3.2 删
@Mapper
public interface UserInfoXMLMapper {Integer delete(Integer id);}


4.3.3 改



4.3.4 查


此操作需要写全限定类名

下面来看映射操作(<resultMap标签>):
其它两种方法:1)给字段设置别名 2)配置自动转驼峰

此时有结果的映射,这个就不需要了:

5. 其他查询操作
5.1 多表查询


看打印日志:


可以看出:sql语句返回的结果有username和age,但是打印的结果没有
这是为什么呢?
因为对象里面没有username和age,所以加上

此时打印结果为:

总结:SQL中直接查询多个表,把查询的结果放在一个对象即可
5.2 #{} 和 ${}(常见面试题)
首先看Interger类型的:
使用$查询:即时SQL

使用#查询:预编译SQL

再看String类型
#:

使用$的时候报错:少了个' '

那就需要加上:

总结:使用#时,如果参数为String,会自动加上' ',$不会,$符合是直接拼接
5.3 排序
使用#,会报错


此时#给asc自动加上引号,报错
使用$,运行正确

总结:排序时,不能使用#,如果使用#,会给参数加上' '
5.4 like查询
使用#号,报错:

又多加了一个引号,报错
使用$符号,正常运行:

注意:模糊查询时,如果使用#,需要搭配mysql的内置函数concat,而不能直接使用

那既然#符号不适用某些场景,那可以只使用$嘛?
不可以,$符号存在漏洞
5.5 $符号漏洞SQL注入
SQL注⼊:
是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。
举个例子:
正常访问:
select * from userinfo where username = 'admin'
把admin改为 'or 1 = ' 1,即select * from userinfo where username =' 'or 1 = ' 1'
此时数据库会将usrname = '' 和'1'看作一对去执行,但其实参数是'or 1 = '
其中参数or被当做了SQL语句的⼀部分
#和$区别其中之一就是预编译SQL和即时SQL的区别
1)预编译SQL性能更高
2)预编译SQL不存在SQL注入的问题
实际开发中,能使用#的,都使用#,使用$时,一定要考虑到SQL注入的问题
6.数据库连接池
6.1 介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个
- 没有使⽤数据库连接池的情况:
每次执⾏SQL语句,要先创建⼀个新的连接对象,然后执⾏SQL语句,SQL 语句执⾏完,再关闭连接对象释放资源.这种重复的创建连接,销毁连接⽐较消耗资源

- 使⽤数据库连接池的情况:
程序启动时,会在数据库连接池中创建⼀定数量的Connection对象,当客⼾请求数据库连接池,会从数据库连接池中获取Connection对象,然后执⾏SQL,SQL语句执⾏完,再把 Connection归还给连接池.

6.2 优点
1. 减少了⽹络开销
2. 资源重⽤
3. 提升了系统的性能
6.3 使用
常见的数据库连接池:
- C3P0
- DBCP
- Druid
- Hikari
⽬前⽐较流⾏的是Hikari,Druid
6.3.1 Hikari
Hikari : SpringBoot默认使⽤的数据库连接池

6.3.2 Druid
如果想把默认的数据库连接池切换为Druid数据库连接池,引⼊相关依赖即可
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency>
相关文章:
MyBatis(初阶)
1.什么是MyBtis MyBatis是持久层框架,⽤于简化JDBC的开发。 2.准备工作 2.1 创建⼯程 数据库: 2.2 配置数据库连接字符串 以application.yml⽂件为例: 2.3 写持久层代码 Data public class UserInfo {private Integer id;private String username;private Stri…...
KDP数据平台:以实战案例验证技术领先力
本文由智领云 LeetTools 工具自动生成 申请试用: https://www.leettools.com/feedback/ 在当今快速发展的技术环境中,数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP(Kubernetes Data Platform)在数据处理和…...
[Linux] 什么是 Shell?
一、什么是 shell ? shell在英语中的意思就是外壳,所以我们习惯称shell程序为壳程序。那为什么又会被叫做壳程序呢?那是因为shell程序是在内核上面的,属于操作系统的外壳部分,因此我们就称之为壳程序(shell)。 在 Linux 中&#…...
大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用
快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后,使用 langchain 导入大模型,并打印出大模型信息Task2 使用 langchian 加载数据,并把数据打印出来Task…...
python环境安装之后,cmd输入python回车会打开微软商店
坑爹!python环境安装之后,cmd输入python回车会打开微软商店 最近发现,安装python环境成功之后,可能会出现cmd输入python验证是否安装成功老会打开微软商店! 解决,打开系统环境配置,找到刚安装…...
USB Type-C如何取9V、12V、15V、20V电压-PD快充协议芯片ECP5701
相信大家在生活中也发现了,现在越来越多的设备都改用这种type-C接口的母座进行取电了。 因为欧盟决议 :自2024年起部分消费电子产品必须提供单一的USB-C充电接口。 那么这种type-C接口相比之前的Micro-B接口有着一个很大的优势就是可以有更高的电压&…...
Go 语言 Map 17
Go 语言提供了一个强大的 Map 结构体,用于存储键值对。Map 可以用来存储数据,快速查找和修改数据。下面是 Go 语言 Map 的使用教程。 什么是 Map? Map 是一个键值对的集合,它可以存储任意类型的键和值。Map 中的每个键都是唯一的…...
移植bash到openharmony
1.交叉工具链 下载地址: http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist 进入ohos-sdk-full,下载一个sdk版本,这里下载的版本是version-Master_Version-OpenHarmony_5.0.0.35-20240805_020232-ohos-sdk-full.tar.gz。 解…...
git stash详细教程
git stash详细教程 基本命令: git stash: 保存当前未提交的更改,并恢复到干净的工作目录。git stash list: 列出所有的 stash。git stash show: 显示最新 stash 的简要内容。git stash show -p: 显示最新 stash 的详细内容。 应用和删除: git stash apply: 应用最新…...
UDP网络攻击
UDP(User Datagram Protocol)作为一种无连接的网络传输协议,以其速度快和资源消耗小的特点,在多种网络服务中发挥着重要作用,UDP的无连接特性也使其成为DDoS攻击的优选协议。 UDP攻击概念 UDP攻击是一种网络攻击手段…...
漏洞扫描的重要性,如何做好漏洞扫描服务
随着互联网技术的飞速发展,网络安全问题已成为不容忽视的重大挑战。其中,系统漏洞威胁作为最常见且严重的安全危险之一,对组织和个人的信息资产构成了巨大威胁。下面我们就来了解下漏洞扫描的好处、漏洞扫描的操作方法以及如何做好网络安全。…...
unity程序简易框架
1. 框架基本结构 2. 单例模式基类模块 2.1 BaseManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager<T> where T:new() {private static T instance;public static T GetInstance(){if (instance == …...
Go小技巧易错点100例(十六)
本期看点: 正文开始: 切片的长度和容量 在Go语言中,切片(slice)是一个引用类型,它是对底层数组的抽象表示,提供了动态长度的、灵活的序列类型。切片包含三个重要的属性:指向底层数…...
通过Golang实现中间人攻击,查看和修改https流量包
要查看和修改 HTTPS 流量包,需要使用一个能够执行 中间人攻击(Man-in-the-Middle, MITM) 的代理工具。这个工具将拦截并解密 HTTPS 流量,然后允许查看和修改流量包的内容,再将其重新加密并发送到目标服务器。 完整的 …...
MySQL 安装与配置指南
MySQL 是一种广泛使用的关系型数据库管理系统,为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL,以及如何进行基本的配置,以确保数据库系统的最佳性能和稳定性。 一、环境准备 1.1 系统要求 …...
android13布局查看工具 无源码查看布局 在线查找ui布局id
总纲 android13 rom 开发总纲说明 目录 1.前言 2.工具介绍 2.1工具1 2.2工具2 2.3工具3 2.4工具4 3.彩蛋 1.前言 Android 13提供了一些工具来帮助开发人员查看和优化应用的布局。方便的让我们找到具体应用的布局文件等信息。 2.工具介绍 2.1工具1 老版本DDMS&#x…...
【自动化测试必学语言】python:UnitTest框架
目录 介绍 框架 什么是UnitTest框架? 为什么使用UnitTest框架? UnitTest核心要素(unitest 的组成部分) 1.TestCase(最核心的模块) 2.TestSuite 3.TestRunner 4.TestLoader 5.Fixture TestCase(…...
大话LLM之向量数据库
向量数据库是一种专门设计的存储系统,旨在高效处理和查询高维向量数据,通常用于人工智能和机器学习应用中,以实现快速准确的数据检索。 好的,今天我们就来聊聊人工智能和向量数据库的事儿。现在人工智能发展得特别快,特…...
EmguCV学习笔记 C# 2.2 Matrix类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址:VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…...
[Windows CMD] 查看网络连接状态 netstat -na | findstr “TCP“
在 Windows 系统中,我们可以使用 netstat 命令来查看网络连接状态,并使用 findstr 命令来过滤出 TCP 和 UDP 的连接。 查看所有网络连接的状态 netstat -na netstat -na: 显示所有网络连接的状态,-n 表示显示数字地址而非域名,…...
从枚举到成像:VisionMaster连接海康工业相机的实战避坑指南
1. 工业相机连接前的硬件准备 第一次用VisionMaster连接海康工业相机时,硬件连接是最容易出问题的环节。我遇到过不少新手工程师因为电源接反或者网线没插好,折腾半天找不到设备的情况。这里分享几个关键细节: 首先是供电问题。海康工业相机通…...
创业团队如何用Taotoken低成本试验多个AI模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何用Taotoken低成本试验多个AI模型 对于资源有限的创业团队而言,在开发产品原型或验证AI功能时,…...
JSON Lint深度解析:如何用PHP实现专业级JSON验证与错误处理
JSON Lint深度解析:如何用PHP实现专业级JSON验证与错误处理 【免费下载链接】jsonlint JSON Lint for PHP 项目地址: https://gitcode.com/gh_mirrors/jso/jsonlint 在当今数据驱动的Web开发中,JSON已成为数据交换的标准格式。然而,当…...
AM335x嵌入式开发实战:从硬件设计到软件调试的避坑指南
1. 项目概述:为什么AM335x值得深挖,又为何“坑”多?如果你正在嵌入式领域,尤其是工业控制、人机交互或者物联网网关这些方向选型,TI的AM335x系列处理器大概率会进入你的视野。这颗基于ARM Cortex-A8内核的芯片…...
NotebookLM辅助CRISPR靶点筛选实操:从NCBI SRA原始数据到脱靶风险摘要,限时开放实验日志包
更多请点击: https://intelliparadigm.com 第一章:NotebookLM生物学研究辅助 NotebookLM 是 Google 推出的基于 LLM 的研究型笔记工具,专为科研人员设计,其核心能力在于对私有文档(如 PDF、TXT)进行深度语…...
别再被VS2019的CMake报错劝退!从‘RC命令失败’看Windows C++开发环境那些坑
破解Windows C开发环境迷局:从CMake报错到系统级解决方案 当你在Visual Studio 2019中满怀期待地点击"生成解决方案",却看到控制台突然弹出"RC命令失败"的红色错误时,那种挫败感每个C开发者都深有体会。这不仅仅是一个简…...
Spread.NET 10-19.1 都可以提供
关于 Spread.NET提供类似 Excel 的电子表格体验。Spread.NET 可帮助您创建电子表格、网格、仪表板和窗体。它包含一个强大的计算引擎,提供 450 多个函数,并支持导入和导出 Excel 电子表格。利用丰富的 .NET 电子表格 API 和强大的计算引擎,您…...
CentOS LVM实战:动态调整home与root分区空间,解决系统盘爆满难题
1. 当服务器根分区告急时,你该怎么办? 最近接手了一台运行了3年的CentOS服务器,刚登录就发现系统弹出了"磁盘空间不足"的警告。df -h一看,好家伙,根分区(/)已经用了98%,而…...
终极指南:如何在Jetson/Raspberry Pi上快速部署CLIP-as-service边缘AI搜索服务 [特殊字符]
终极指南:如何在Jetson/Raspberry Pi上快速部署CLIP-as-service边缘AI搜索服务 🚀 【免费下载链接】clip-as-service 🏄 Scalable embedding, reasoning, ranking for images and sentences with CLIP 项目地址: https://gitcode.com/gh_mi…...
超漂亮的影视APP下载页官网html源码
超级好看的电影影视APP下载官网下载地址:https://pan.quark.cn/s/1d8f089b24c8...






