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

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是持久层框架&#xff0c;⽤于简化JDBC的开发。 2.准备工作 2.1 创建⼯程 数据库: 2.2 配置数据库连接字符串 以application.yml⽂件为例: 2.3 写持久层代码 Data public class UserInfo {private Integer id;private String username;private Stri…...

KDP数据平台:以实战案例验证技术领先力

本文由智领云 LeetTools 工具自动生成 申请试用&#xff1a; https://www.leettools.com/feedback/ 在当今快速发展的技术环境中&#xff0c;数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP&#xff08;Kubernetes Data Platform&#xff09;在数据处理和…...

[Linux] 什么是 Shell?

一、什么是 shell ? shell在英语中的意思就是外壳&#xff0c;所以我们习惯称shell程序为壳程序。那为什么又会被叫做壳程序呢&#xff1f;那是因为shell程序是在内核上面的&#xff0c;属于操作系统的外壳部分&#xff0c;因此我们就称之为壳程序(shell)。 在 Linux 中&#…...

大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用

快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后&#xff0c;使用 langchain 导入大模型&#xff0c;并打印出大模型信息Task2 使用 langchian 加载数据&#xff0c;并把数据打印出来Task…...

python环境安装之后,cmd输入python回车会打开微软商店

坑爹&#xff01;python环境安装之后&#xff0c;cmd输入python回车会打开微软商店 最近发现&#xff0c;安装python环境成功之后&#xff0c;可能会出现cmd输入python验证是否安装成功老会打开微软商店&#xff01; 解决&#xff0c;打开系统环境配置&#xff0c;找到刚安装…...

USB Type-C如何取9V、12V、15V、20V电压-PD快充协议芯片ECP5701

相信大家在生活中也发现了&#xff0c;现在越来越多的设备都改用这种type-C接口的母座进行取电了。 因为欧盟决议 &#xff1a;自2024年起部分消费电子产品必须提供单一的USB-C充电接口。 那么这种type-C接口相比之前的Micro-B接口有着一个很大的优势就是可以有更高的电压&…...

Go 语言 Map 17

Go 语言提供了一个强大的 Map 结构体&#xff0c;用于存储键值对。Map 可以用来存储数据&#xff0c;快速查找和修改数据。下面是 Go 语言 Map 的使用教程。 什么是 Map&#xff1f; Map 是一个键值对的集合&#xff0c;它可以存储任意类型的键和值。Map 中的每个键都是唯一的…...

移植bash到openharmony

1.交叉工具链 下载地址&#xff1a; http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist 进入ohos-sdk-full&#xff0c;下载一个sdk版本&#xff0c;这里下载的版本是version-Master_Version-OpenHarmony_5.0.0.35-20240805_020232-ohos-sdk-full.tar.gz。 解…...

git stash详细教程

git stash详细教程 基本命令: git stash: 保存当前未提交的更改&#xff0c;并恢复到干净的工作目录。git stash list: 列出所有的 stash。git stash show: 显示最新 stash 的简要内容。git stash show -p: 显示最新 stash 的详细内容。 应用和删除: git stash apply: 应用最新…...

UDP网络攻击

UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的网络传输协议&#xff0c;以其速度快和资源消耗小的特点&#xff0c;在多种网络服务中发挥着重要作用&#xff0c;UDP的无连接特性也使其成为DDoS攻击的优选协议。 UDP攻击概念 UDP攻击是一种网络攻击手段…...

漏洞扫描的重要性,如何做好漏洞扫描服务

随着互联网技术的飞速发展&#xff0c;网络安全问题已成为不容忽视的重大挑战。其中&#xff0c;系统漏洞威胁作为最常见且严重的安全危险之一&#xff0c;对组织和个人的信息资产构成了巨大威胁。下面我们就来了解下漏洞扫描的好处、漏洞扫描的操作方法以及如何做好网络安全。…...

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例(十六)

本期看点&#xff1a; 正文开始&#xff1a; 切片的长度和容量 在Go语言中&#xff0c;切片&#xff08;slice&#xff09;是一个引用类型&#xff0c;它是对底层数组的抽象表示&#xff0c;提供了动态长度的、灵活的序列类型。切片包含三个重要的属性&#xff1a;指向底层数…...

通过Golang实现中间人攻击,查看和修改https流量包

要查看和修改 HTTPS 流量包&#xff0c;需要使用一个能够执行 中间人攻击&#xff08;Man-in-the-Middle, MITM&#xff09; 的代理工具。这个工具将拦截并解密 HTTPS 流量&#xff0c;然后允许查看和修改流量包的内容&#xff0c;再将其重新加密并发送到目标服务器。 完整的 …...

MySQL 安装与配置指南

MySQL 是一种广泛使用的关系型数据库管理系统&#xff0c;为各种应用程序提供高效的数据存储和管理解决方案。本文将介绍如何在不同的操作系统中安装 MySQL&#xff0c;以及如何进行基本的配置&#xff0c;以确保数据库系统的最佳性能和稳定性。 一、环境准备 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框架&#xff1f; 为什么使用UnitTest框架? UnitTest核心要素&#xff08;unitest 的组成部分&#xff09; 1.TestCase&#xff08;最核心的模块&#xff09; 2.TestSuite 3.TestRunner 4.TestLoader 5.Fixture TestCase&#xff08…...

大话LLM之向量数据库

向量数据库是一种专门设计的存储系统&#xff0c;旨在高效处理和查询高维向量数据&#xff0c;通常用于人工智能和机器学习应用中&#xff0c;以实现快速准确的数据检索。 好的&#xff0c;今天我们就来聊聊人工智能和向量数据库的事儿。现在人工智能发展得特别快&#xff0c;特…...

EmguCV学习笔记 C# 2.2 Matrix类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址&#xff1a;VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…...

[Windows CMD] 查看网络连接状态 netstat -na | findstr “TCP“

在 Windows 系统中&#xff0c;我们可以使用 netstat 命令来查看网络连接状态&#xff0c;并使用 findstr 命令来过滤出 TCP 和 UDP 的连接。 查看所有网络连接的状态 netstat -na netstat -na: 显示所有网络连接的状态&#xff0c;-n 表示显示数字地址而非域名&#xff0c;…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...