【JavaEE进阶】mybatis
目录:
一、Mybatis是什么
三个映射关系如下图:
二、mybatis的使用(前置工作+简单案例)
第一步:导入MAVEN依赖
第二步: 在spring项目当中新建数据源
第三步:新建一个实体类,是和数据库进行交互的实体类
第四步:新建一个mapper文件夹(src目录下面)
第五步:在mybatis下面新建一个UserMapper.xml的文件夹
第六步:在两个mapper标签之间编写查询的sql语句
resultType属性:用于标记返回的是什么类型,同时指定返回的对象是哪个
第七步:在其他类当中调用getAll方法
总结一下,mybatis的执行流程:
三、复杂操作
3.1根据id查询用户对象
第一步:在UserMapper当中编写一个根据id查询用户对象的方法
第二步:在配置文件当中编写查询的方法
mybatis两种占位符:$和#的区别
3.2把一个对象作为参数进行传递
第一步:在UserMapper当中新建一个以User为参数的方法
第二步:在配置文件当中直接获取user的属性
第三步:进行测试
3.3删改的操作
第一步:在mapper层编写增删改的方法
第二步:在xml文件当中配置增删改的方法(无需返回值)
第三步: 编写测试的方法
3.4新增数据操作(以新增一个User对象为例)
第一步:在mapper当中新建一个方法:
第二步:在xml文件当中配置一个新增方法
第三步:新建一个方法用于测试
四、springBoot单元测试
4.1添加springBoot的测试依赖
4.2生成需要测试方法的测试等价类
第一步:右键需要测试的方法,然后生成get和set方法
第二步:为测试类添加@SpringBootTest注解
第三步:在测试类当中使用@Autowired来获取bean进行测试
如何避免测试的数据影响正常数据库的数据(@Test @Transactional)
一、Mybatis是什么
mybatis是一款优秀的持久层框架(主要与数据库层,也就是mysql层打交道的),它支持自定义sql、存储过程以及数据库对应到实体的映射等等。
也就是把数据库当中的每一行记录与对象建立起来映射的关系。
三个映射关系如下图:
| 数据库当中的属性 | Java程序当中的属性 |
| 数据库表(table) | 类(class) |
| 记录(record) | 对象(object) |
| 字段(field) | 对象的属性(attribute) |
二、mybatis的使用(前置工作+简单案例)
第一步:导入MAVEN依赖
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
第二步: 在spring项目当中新建数据源
下面我选择的是application.properties文件配置的
需要在resource目录下面新建一个文件夹,文件夹的名称被命名为:mybatis。
后续的xml配置文件就需要在这个mybatis文件夹当中编写了。

配置文件的内容:
spring.datasource.url=jdbc:mysql://localhost:3306/my_blog_system?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=20021111aA#
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
############设置mybatis的保存路径
mybatis.mapper-locations=classpath:/mybatis/*Mapper.xml
第三步:新建一个实体类,是和数据库进行交互的实体类
在这个类当中,需要满足上面的一一对应的关系。
/*** @author 25043*/
@Data
public class User {private int id;private String username;private String password;}
第四步:新建一个mapper文件夹(src目录下面)
这个文件夹用于存放和数据库进行直接交互的实体类,但是这些类一般都是接口,我们只需要在这些接口当中定义一些方法即可。
例如在下面这个类当中,定义一个查询所有用户的方法:
/*** 使用这个注解,标记这个类是一个持久层的类* @author 25043*/
@Mapper
public interface UserMapper {/*** 查询所有用户* 查询用户@return*/List<User> getAll();
}
第五步:在mybatis下面新建一个UserMapper.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.springLearning.Mapper.UserMapper"></mapper>
需要注意的是:mapper namespace这个标签的内容为需要返回的User对象的全限定名。
第六步:在两个mapper标签之间编写查询的sql语句
其中,select标签为查询标签,其余的还有update标签(用于修改),指定的id为查询的方法
以及insert标签,用于新增。
<mapper namespace="com.example.springLearning.Mapper.UserMapper"><select id="getAll" resultType="com.example.springLearning.Entity.User">select *from user</select>
</mapper>
resultType属性:用于标记返回的是什么类型,同时指定返回的对象是哪个
第七步:在其他类当中调用getAll方法
需要注意的是,其他类调用的时候,一定要确保
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAll(){return userMapper.getAll();}
}
总结一下,mybatis的执行流程:

三、复杂操作
3.1根据id查询用户对象
第一步:在UserMapper当中编写一个根据id查询用户对象的方法
/*** 根据id查询用户* 用户的id@param id* 单个实体用户@return*/User getUserById(@Param("id") Integer id);
第二步:在配置文件当中编写查询的方法
<select id="getUserById" resultType="com.example.springLearning.Entity.User">select *from user where userId=${id};</select>

mybatis两种占位符:$和#的区别
| 占位符 | 主要区别 | 优缺点 |
| ${} | 直接替换,相当于直接拼接 | ①不可以解决sql注入; ②当查询的数据类型需要手动添加引号的时候,会报错(因为是直接拼接数据) |
| #{} | 占位符,也就是"?"进行替换 | ①可以解决sql注入; ②无需手动添加引号。 |
3.2把一个对象作为参数进行传递
第一步:在UserMapper当中新建一个以User为参数的方法
/*** 处理用户登录* 用户对象@param user* 用户对象@return*/User login(User user);
第二步:在配置文件当中直接获取user的属性

第三步:进行测试
@Testvoid login() {User user=new User();user.setUsername("zhangSan");user.setPassword("123");User userGet=userMapper.login(user);System.out.println(userGet);}
3.3删改的操作
第一步:在mapper层编写增删改的方法
/*** 删除user* user对象@param user* 删除@return*/Integer delete(User user);
注意这里的返回值一定要设置为包装类型,不可以是基本数据类型
第二步:在xml文件当中配置增删改的方法(无需返回值)
和查询操作类似,但是无需在标签当中指定resultType。
<select id="delete">delete from user where username=#{username};</select>
第三步: 编写测试的方法
@Testvoid testInsert(){User user=new User();user.setUsername("lisi");userMapper.delete(user);}
3.4新增数据操作(以新增一个User对象为例)
第一步:在mapper当中新建一个方法:
Integer insert(User user);
第二步:在xml文件当中配置一个新增方法
<select id="insert">insert into user(username,password) values(#{username},#{password});
</select>
第三步:新建一个方法用于测试
public int insert(User user){return userMapper.insert(user);
}
四、springBoot单元测试
4.1添加springBoot的测试依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
4.2生成需要测试方法的测试等价类
第一步:右键需要测试的方法,然后生成get和set方法

然后,就可以看到生成了测试的目录,并且在测试的目录下面生成了这样的代码:

第二步:为测试类添加@SpringBootTest注解

第三步:在测试类当中使用@Autowired来获取bean进行测试
@SpringBootTest
class UserServiceImplTest {@Autowiredprivate UserMapper userMapper;@Testvoid getAll() {}@Testvoid getUserById() {User user=userMapper.getUserById(2);System.out.println(user);}
}
如何避免测试的数据影响正常数据库的数据(@Test @Transactional)
只需要在一个测试的方法上面标注:@Test注解加上@Transactional两个注解即可。
@Test
@Transactional
void testInsert(){User user=new User();user.setUsername("张三");userMapper.delete(user);}
这样子,即使插入了数据,也会在方法调用结束之后,回滚事物。
相关文章:
【JavaEE进阶】mybatis
目录: 一、Mybatis是什么 三个映射关系如下图: 二、mybatis的使用(前置工作简单案例) 第一步:导入MAVEN依赖 第二步: 在spring项目当中新建数据源 第三步:新建一个实体类,是和…...
Redis的大key
什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值,而是该 key 所对应的 value 过大对于 string 类型来说,一般情况下超过 10KB 则认为是大 key;对于set、zset、hash 等类型来说,一般…...
MMPretrain
title: mmpretrain实战 date: 2023-06-07 16:04:01 tags: [image classification,mmlab] mmpretrain实战 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccTl9bOl-1686129437336)(null)] 主要讲解了安装,还有使用教程.安装教程直接参考官网.下面讲…...
栈和队列(数据结构刷题)[一]-python
文章目录 前言一、原理介绍二、用栈实现队列1.操作2.思路 三、关于面试考察栈里面的元素在内存中是连续分布的么? 前言 提到栈和队列,大家可能对它们的了解只停留在表面,再深入一点,好像知道又好像不知道的感觉。本文我将从底层实…...
【备战秋招】JAVA集合
集合 前言 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要 对对象进行存储。 另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多…...
setState详解
this. setState( [partialState], [callback]) 1.[partialState] :支持部分状态更改 this, setState({ x:100 //不论总共有多少状态,我们只修改了x,其余的状态不动 });callback :在状态更改/视图更新完毕后触发执行,也可以说只要执行了setS…...
Qt5.12.6配置Android Arm开发环境(windows)
1. 安装jdk1.8 2.安装Android Studio 并安装 SDK 与NDK SDK Tools 选择 26.0.3 SDK Platform 选择 Android SDK Platform 26 NDK选择19版本 安卓ARM环境配置成功如下: JDK1.8 , SDK 26 , NDK 19 在安装QT时要选择 ARMv7(32位CPU)与ARM64-v8a(64位CPU) 选择支持android平台…...
七、进程程序替换
文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…...
C++核心编程——详解运算符重载
文章目录💬 一.运算符重载基础知识①基本概念②运算符重载的规则③运算符重载形式④运算符重载建议 二.常用运算符重载①左移(<<)和右移(>>)运算符重载1️⃣重载后函数参数是什么?2️⃣重载的函数返回类型是什么?3️⃣重载为哪种…...
2023年前端面试汇总-CSS
1. CSS基础 1.1. CSS选择器及其优先级 对于选择器的优先级: 1. 标签选择器、伪元素选择器:1; 2. 类选择器、伪类选择器、属性选择器:10; 3. id 选择器:100; 4. 内联样式:1000&a…...
Java调用Pytorch实现以图搜图(附源码)
Java调用Pytorch实现以图搜图 设计技术栈: 1、ElasticSearch环境; 2、Python运行环境(如果事先没有pytorch模型时,可以用python脚本创建模型); 1、运行效果 2、创建模型(有则可以跳过…...
【EasyX】实时时钟
目录 实时时钟1. 绘制静态秒针2. 秒针的转动3. 根据实际时间转动4. 添加时针和分针5. 添加表盘刻度 实时时钟 本博客介绍利用EasyX实现一个实时钟表的小程序,同时学习时间函数的使用。 本文源码可从github获取 1. 绘制静态秒针 第一步定义钟表的中心坐标center&a…...
基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)
GMSL 图像采集卡 特性 ● PCIe Gen2.0 X8 总线; ● 支持V4L2调用; ● 1路CAN接口; ● 6路/12路 GMSL1/2摄像头输入,最高可达8MP; ● 2路可定义相机同步触发输入/输出; 优势 ● 采用PCIe主卡与FMC子…...
Kibana:使用 Kibana 自带数据进行可视化(一)
在今天的练习中,我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack,你可以参考如下的视频来开启 Elastic Stack 并进行下面的练习。你可以开通阿里云检…...
MySQL数据库基础 07
第七章 单行函数 1. 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类 2. 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换 3. 字符串函数4. 日期和时间函数4.1 获取日期、时间 4.2 日期与时间戳的转换 4.3 获…...
JVM | JVM垃圾回收
JVM | JVM垃圾回收 1、堆空间的基本结构2、内存分配和回收原则2.1、对象优先在 Eden 区分配2.2、大对象直接进入老年代2.3、长期存活的对象将进入老年代2.4、主要进行 gc 的区域2.5、空间分配担保3、死亡对象判断方法3.1、引用计数法3.2、可达性分析算法3.3、引用类型总结3.4、…...
avive零头撸矿
Avive 是一个透明的、自下而上替代自上而下的多元网络,旨在克服当前生态系统的局限性,实现去中心化社会。 aVive:一个基于 SBT 和市场的 deSoc,它使 dapps 能够与分散的位置 oracle 和 SBT 关系进行互操作。您的主权社交网络元宇宙…...
openGauss5.0之学习环境 Docker安装
文章目录 0.前言1. 准备软硬件安装环境1.1 软硬件环境要求1.2 修改操作系统配置1.2.1 关闭操作系统防火墙 1.3 设置字符集参数1.4 设置时区和时间(可选)关闭swap交换内存1.5 关闭RemoveIPC1.6 关闭HISTORY记录 2. 容器安装2. 1支持的架构和操作系统版本2…...
数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)
项目需求 录入进入房间的相关数据;从进入时间开始计时,计算滞留房间的时间;定时刷新数据,超过30分钟的人数,进行红色告警; 实现流程 为了完整地实现上述需求,我们可以按照以下步骤开发&#…...
【Linux】-关于调试器gdb的介绍和使用
作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 文章目录 前言一、Linux中的debug和release二、gdb的使用**1.进入调试****2.显示代码*…...
Cesium 视角控制全攻略:禁用鼠标交互的多种方法
1. 为什么需要禁用Cesium鼠标交互? 在开发基于Cesium的三维地理信息系统时,我们经常会遇到需要限制用户视角操作的场景。比如在展示固定路线的飞行演示时,如果允许用户随意旋转地图,可能会打乱预设的动画效果;在嵌入式…...
【deepseek】SYCL™ 2020 Specification 简介
SYCL™ 2020 Specification 简介 SYCL 2020 是由 Khronos Group 发布的异构计算标准,它是 SYCL(发音为 “sickle”)规范的最新主要版本。SYCL 是一种基于标准 C 的编程模型,旨在简化在各种硬件加速器(如 CPU、GPU、FPG…...
PyTorch 2.8镜像部署教程:RTX 4090D上启用NVIDIA Container Toolkit
PyTorch 2.8镜像部署教程:RTX 4090D上启用NVIDIA Container Toolkit 1. 环境准备与快速部署 在开始之前,请确保您的RTX 4090D显卡已安装550.90.07版本驱动,并确认系统满足以下硬件要求: 显卡:RTX 4090D 24GB显存&am…...
别再只盯着蓝牙和ZigBee了!用Telink TLSR8258芯片的2.4G私有协议,自己动手做个低功耗遥控器
从零构建2.4G私有协议遥控器:Telink TLSR8258实战指南 当市面上大多数IoT设备还在蓝牙和ZigBee的框架下挣扎时,Telink TLSR8258芯片的2.4G私有协议正在悄然改写低功耗无线通信的规则。我曾在一个智能农业项目中,需要控制200米外的灌溉阀门&am…...
Cherry Studio集成火山方舟模型实战:从接入到性能调优全解析
最近在项目中尝试将火山方舟的模型集成到 Cherry Studio 里,整个过程踩了不少坑,也总结了一些经验。今天就来和大家分享一下从接入到性能调优的完整实战过程,希望能帮到有同样需求的开发者。 1. 背景与痛点:为什么集成过程让人头疼…...
Delphi开发者必备:CEF4Delphi最新版安装与跨平台应用开发实战
Delphi开发者必备:CEF4Delphi最新版安装与跨平台应用开发实战 引言 作为一名长期深耕Delphi生态的开发者,你是否曾为跨平台应用开发中的浏览器嵌入需求而头疼?传统方案往往面临兼容性差、性能瓶颈或功能受限等问题。CEF4Delphi的出现彻底改…...
渗透测试中的隐藏技巧:利用crontab实现后门持久化(含避坑指南)
渗透测试中的隐藏技巧:利用crontab实现后门持久化(含避坑指南) 在红队演练中,后门持久化是维持访问权限的关键技术。传统的后门植入方式往往容易被安全设备或管理员发现,而利用系统原生功能实现隐蔽驻留则能显著提高攻…...
利用快马平台十分钟搭建tk风格免费登录入口网站原型
今天想和大家分享一个快速搭建登录页面的小技巧。最近在做一个新项目,需要先验证登录功能的可行性,但时间比较紧,不想花太多时间在前端页面上。正好发现了InsCode(快马)平台,用它十分钟就搞定了一个tk风格的登录入口原型ÿ…...
CompactGUI社区数据库:游戏压缩效果的终极共享指南
CompactGUI社区数据库:游戏压缩效果的终极共享指南 【免费下载链接】CompactGUI Transparently compress active games and programs using Windows 10/11 APIs 项目地址: https://gitcode.com/gh_mirrors/co/CompactGUI 你是否曾为电脑存储空间不足而烦恼&a…...
探索Comsol弱形式求解三维光子晶体能带
Comsol弱形式求解三维光子晶体能带。在光子学领域,三维光子晶体能带的研究至关重要。而Comsol作为一款强大的多物理场仿真软件,其弱形式求解方法为我们探索三维光子晶体能带提供了有效途径。 光子晶体与能带理论基础 光子晶体是一种具有周期性介电结构的…...
