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

【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

目录&#xff1a; 一、Mybatis是什么 三个映射关系如下图&#xff1a; 二、mybatis的使用&#xff08;前置工作简单案例&#xff09; 第一步&#xff1a;导入MAVEN依赖 第二步&#xff1a; 在spring项目当中新建数据源 第三步&#xff1a;新建一个实体类&#xff0c;是和…...

Redis的大key

什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值&#xff0c;而是该 key 所对应的 value 过大对于 string 类型来说&#xff0c;一般情况下超过 10KB 则认为是大 key&#xff1b;对于set、zset、hash 等类型来说&#xff0c;一般…...

MMPretrain

title: mmpretrain实战 date: 2023-06-07 16:04:01 tags: [image classification,mmlab] mmpretrain实战 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccTl9bOl-1686129437336)(null)] 主要讲解了安装,还有使用教程.安装教程直接参考官网.下面讲…...

栈和队列(数据结构刷题)[一]-python

文章目录 前言一、原理介绍二、用栈实现队列1.操作2.思路 三、关于面试考察栈里面的元素在内存中是连续分布的么&#xff1f; 前言 提到栈和队列&#xff0c;大家可能对它们的了解只停留在表面&#xff0c;再深入一点&#xff0c;好像知道又好像不知道的感觉。本文我将从底层实…...

【备战秋招】JAVA集合

集合 前言 一方面&#xff0c; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象 的操作&#xff0c;就要 对对象进行存储。 另一方面&#xff0c;使用Array存储对象方面具有一些弊端&#xff0c;而Java 集合就像一种容器&#xff0c;可以动态地把多…...

setState详解

this. setState( [partialState], [callback]) 1.[partialState] :支持部分状态更改 this, setState({ x:100 //不论总共有多少状态&#xff0c;我们只修改了x&#xff0c;其余的状态不动 });callback :在状态更改/视图更新完毕后触发执行&#xff0c;也可以说只要执行了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平台…...

七、进程程序替换

文章目录 一、进程程序替换&#xff08;一&#xff09;概念&#xff08;二&#xff09;为什么程序替换&#xff08;三&#xff09;程序替换的原理&#xff08;四&#xff09;如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换&#xff0c;会不会影响父进程呢? &…...

C++核心编程——详解运算符重载

文章目录&#x1f4ac; 一.运算符重载基础知识①基本概念②运算符重载的规则③运算符重载形式④运算符重载建议 二.常用运算符重载①左移(<<)和右移(>>)运算符重载1️⃣重载后函数参数是什么&#xff1f;2️⃣重载的函数返回类型是什么&#xff1f;3️⃣重载为哪种…...

2023年前端面试汇总-CSS

1. CSS基础 1.1. CSS选择器及其优先级 对于选择器的优先级&#xff1a; 1. 标签选择器、伪元素选择器&#xff1a;1&#xff1b; 2. 类选择器、伪类选择器、属性选择器&#xff1a;10&#xff1b; 3. id 选择器&#xff1a;100&#xff1b; 4. 内联样式&#xff1a;1000&a…...

Java调用Pytorch实现以图搜图(附源码)

Java调用Pytorch实现以图搜图 设计技术栈&#xff1a; 1、ElasticSearch环境&#xff1b; 2、Python运行环境&#xff08;如果事先没有pytorch模型时&#xff0c;可以用python脚本创建模型&#xff09;&#xff1b; 1、运行效果 2、创建模型&#xff08;有则可以跳过&#xf…...

【EasyX】实时时钟

目录 实时时钟1. 绘制静态秒针2. 秒针的转动3. 根据实际时间转动4. 添加时针和分针5. 添加表盘刻度 实时时钟 本博客介绍利用EasyX实现一个实时钟表的小程序&#xff0c;同时学习时间函数的使用。 本文源码可从github获取 1. 绘制静态秒针 第一步定义钟表的中心坐标center&a…...

基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)

GMSL 图像采集卡 特性 ● PCIe Gen2.0 X8 总线&#xff1b; ● 支持V4L2调用&#xff1b; ● 1路CAN接口&#xff1b; ● 6路/12路 GMSL1/2摄像头输入&#xff0c;最高可达8MP&#xff1b; ● 2路可定义相机同步触发输入/输出&#xff1b; 优势 ● 采用PCIe主卡与FMC子…...

Kibana:使用 Kibana 自带数据进行可视化(一)

在今天的练习中&#xff0c;我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack&#xff0c;你可以参考如下的视频来开启 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 是一个透明的、自下而上替代自上而下的多元网络&#xff0c;旨在克服当前生态系统的局限性&#xff0c;实现去中心化社会。 aVive&#xff1a;一个基于 SBT 和市场的 deSoc&#xff0c;它使 dapps 能够与分散的位置 oracle 和 SBT 关系进行互操作。您的主权社交网络元宇宙…...

openGauss5.0之学习环境 Docker安装

文章目录 0.前言1. 准备软硬件安装环境1.1 软硬件环境要求1.2 修改操作系统配置1.2.1 关闭操作系统防火墙 1.3 设置字符集参数1.4 设置时区和时间&#xff08;可选&#xff09;关闭swap交换内存1.5 关闭RemoveIPC1.6 关闭HISTORY记录 2. 容器安装2. 1支持的架构和操作系统版本2…...

数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)

项目需求 录入进入房间的相关数据&#xff1b;从进入时间开始计时&#xff0c;计算滞留房间的时间&#xff1b;定时刷新数据&#xff0c;超过30分钟的人数&#xff0c;进行红色告警&#xff1b; 实现流程 为了完整地实现上述需求&#xff0c;我们可以按照以下步骤开发&#…...

【Linux】-关于调试器gdb的介绍和使用

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、Linux中的debug和release二、gdb的使用**1.进入调试****2.显示代码*…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

标注工具核心架构分析——主窗口的图像显示

&#x1f3d7;️ 标注工具核心架构分析 &#x1f4cb; 系统概述 主要有两个核心类&#xff0c;采用经典的 Scene-View 架构模式&#xff1a; &#x1f3af; 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 &#x1f527; 关键函数&…...

MeanFlow:何凯明新作,单步去噪图像生成新SOTA

1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架&#xff0c;旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念&#xff0c;这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换&#xff0c;显…...