【SpringBoot】-MyBatis详解+单表操作

作者:学Java的冬瓜
博客主页:☀冬瓜的主页🌙
专栏:【Framework】
主要内容:什么是MyBatis框架?MyBatis框架有什么用?MyBatis实现查询步骤详解。MyBatis实现单表的增删查改。MyBatis模糊查询,MyBatis结果集映射。

文章目录

  • 一、什么是MyBatis?
  • 二、使用MyBatis框架实现查询示例
    • 1、添加MyBatis框架支持
    • 2、设置数据库连接字符串 和 MyBatis的配置信息
    • 3、添加业务代码
  • 三、查询操作
    • 1、单表查询
      • a 单表传参查询
      • b 单表指定顺序(顺序or逆序)打印
  • 四、使用MyBatis实现增、删、改
    • 1、新增
      • a 返回影响行数
      • b 返回影响行数和id
    • 2、删除
    • 3、修改
  • 五、特殊情况处理
    • 1、模糊查询 去除多余引号的处理
    • 2、对象属性名和数据库表字段名不一致 的映射处理

一、什么是MyBatis?

MyBatis是一个开源的Java持久层框架,可以帮助开发人员简化数据库访问操作。它将Java对象和数据库表之间建立映射关系,通过配置文件和注解来定义SQL和参数映射关系,并提供了灵活的查询,插入,更新,删除等操作的API。

MyBatis的工作原理

MyBatis是一个对象关系映射框架(ORM Object Relational Mapping)。
核心操作有如下几步:
配置
首先需要编写MyBatis项目的配置文件,在SpringBoot中,就是application.yml或者application.properties文件。在application.yml中配置了数据库连接信息和映射文件(* Mapper.xml)的位置。
映射
在资源文件中(resources目录下)引入了映射文件(* Mapper.xml),映射文件定义了Java对象和数据库表之间的映射关系。
编译
如下图,在编译时,MyBatis会读取并解析配置文件和映射文件,并将其编译为可以执行的Java对象。
运行
当应用需要执行SQL操作时,会调用MyBatis的api来执行相应的方法。在下图中 (* Mapper.xml)相当于实现了接口Interface,在调用Interface的抽象方法时,会根据方法名在映射文件中找到对应的SQL语句,
再调用JDBC进行操作。
在这里插入图片描述

二、使用MyBatis框架实现查询示例

1、添加MyBatis框架支持

注意:和创建SpringBoot项目的过程完全一样,只是加入依赖时需要多添加MyBatis和MySql Driver依赖。

在这里插入图片描述

2、设置数据库连接字符串 和 MyBatis的配置信息

开始操作前声明:各种配置和接口、类定义好,项目可以正常运行并查询后,目录结构如下图:
在这里插入图片描述

a.设置数据库连接的相关信息

在application.xml(如果是application.properties使用相应的语法添加即可)下添加以下信息,以正确连接数据库。

spring:datasource:url: jdbc:mysql://localhost:3306/blog_system?characterEncoding=utf8&useSSl=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

b.Mybatis的 xml 保存路径和 xml 名称

在上面的配置文件中接着写上下面的信息,配置好MyBatis的组件之一 xml 的保存路径和 xml的名称。

Mybatis:# 此路径表示在 resources/mapper目录下创建 数据库对应表的 xml文件# 文件名称为 ***Mapper.xmlmapper-locations: classpath:mapper/*Mapper.xml

3、添加业务代码

a.添加UserEntity实体类

注意:实体类中的成员变量名应与对应数据库表的字段名相同,这样MyBatis才能够自动帮我们映射。

package com.example.demo.entity;import lombok.Data;@Data
public class UserEntity {private Integer userId;private String username;private String password;private String headPath;
}

b.添加UserMapper接口

在c中可以看到,查询结果是所有user,因此此处使用了一个List集合来接收用户。

package com.example.demo.mapper;import com.example.demo.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface UserMapper {List<UserEntity> getUserAll();
}

c.添加UserMapper.xml映射文件

注意:
namespaces参数是包名+接口名
SQL语句中的 id 对应UserMapper接口中的方法,表示对接口的具体实现方法。
resultType表示返回的实体类,包名+实体类名

<?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="getUserAll" resultType="com.example.demo.entity.UserEntity">select * from user</select>
</mapper>

d. 添加service调用UserMapper提供的操作数据库的方法

在这里插入图片描述

package com.example.demo.service;import com.example.demo.entity.UserEntity;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<UserEntity> getUserAll(){return userMapper.getUserAll();}
}

e.添加controller调用service提供的方法以操作数据库
在这里插入图片描述

package com.example.demo.controller;import com.example.demo.entity.UserEntity;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/getUserAll")public List<UserEntity> getUserAll(){return userService.getUserAll();}
}

f.启动服务器后再输入URL查询成功
在这里插入图片描述

三、查询操作

1、单表查询

单表查询可以分为非传参查询和传参查询,在传参查询时,在UserMapper.xml的sql语句中,需要给sql语句传参时我们会用到${key}#{key},因此,我们先来了解它们的区别:

${key}是字符直接替换。

${key} 缺点:容易被sql注入;优点:可以实现sql关键字传参
#{key}是进行预编译再填充?的位置:
#{key} 缺点:无法实现sql关键字(desc和asc)传参;优点:可以防止sql注入。

a 单表传参查询

单表非传参查询,在上面第二大点已经作为示例展示,下面我们来学习单表传参查询。由于我们已经搭建好MyBatis环境,并且在上面提到单元测试测试功能,因此添加方法和测试部分功能会很方便。以下是根据id获取用户信息的示例:

  • 1>在UserMapper接口中添加getUserById方法:接口中写抽象方法。
    在这里插入图片描述
  • 2>在UserMapper.xml文件中写出getUserById方法的实现:mapper.xml中对抽象方法的实现。
    在UserMapper.xml文件中,id为要实现的抽象方法(getUserById),resultType是返回值的类型(UserEntity)。
    在这里插入图片描述
  • 3>测试部分(单元测试跑一下):在UserMapper接口下右键->Generate->Test,然后选择getUserById方法,就将getUserById加入到单元测试中。再在单元测试中写下面一行代码,根据代码要打印获取到的用户信息。可以发现,确认无误。
    在这里插入图片描述

b 单表指定顺序(顺序or逆序)打印

  • 1> UserMapper接口中写抽象方法,由用户传递 排序方式 参数。
    在这里插入图片描述
  • 2> 在UserMapper的xml文件中针对UserMapper的接口进行排序方法实现。(注意MySql中asc和desc是关键字,这里要用$进行字符串替换,而不是#进行预编译)
    在这里插入图片描述

四、使用MyBatis实现增、删、改

1、新增

新增用户有两种方法:1> 新增一个信息,返回影响行数。2> 新增一个信息,返回这个信息的id(将会把MySql中的id写回到我们传递的新增的用户对象中),并返回影响行数。

a 返回影响行数

  • 1> 在UserMapper接口中写新增用户抽象方法:
    在这里插入图片描述

  • 2> 实现抽象方法
    在这里插入图片描述

  • 3> 单元测试(按照单表传参查询中步骤在Test目录下的对应包中添加关于UserMapper的新增方法的单元测试)
    在这里插入图片描述

  • 4> 运行结果:可以发现id的值并未取到,即只是返回了影响行数。
    在这里插入图片描述

b 返回影响行数和id

  • 1> 新增用户抽象方法:
    在这里插入图片描述

  • 2> 实现抽象方法:
    useGeneratedKeys属性表示指示是否使用数据库生成主键,设置为true时,表示将数据库表生成的主键值返回给实体对象,keyProperty属性指定数据库表的主键。
    在这里插入图片描述

  • 3> 单元测试
    在这里插入图片描述

  • 4> 运行结果:可以发现id的值已经取到,从代码中可知,id是被写回到我们进行传参的用户对象中。同时影响行数也成功获取。
    在这里插入图片描述

2、删除

  • 1> 接口中抽象方法
    在这里插入图片描述

  • 2> 实现抽象方法
    在这里插入图片描述

3、修改

  • 1> 接口中抽象方法
    在这里插入图片描述

  • 2> 实现抽象方法
    在这里插入图片描述

五、特殊情况处理

1、模糊查询 去除多余引号的处理

  • 1> 在UserMapper接口中写模糊查询用户抽象方法:
    在这里插入图片描述
  • 2> 在UserMapper的xml文件中针对UserMapper的接口进行 模糊查询方法实现。
    注意:模糊查询的格式为:%信息%,为了防止出错需要使用到concat函数,将3个字符串进行连接。
    否则如果使用%#{信息}%的格式,那么SQL中识别到的是:‘%’ ‘#{信息}’ ‘%’。即中间出现多余的引号。
    在这里插入图片描述

2、对象属性名和数据库表字段名不一致 的映射处理

处理方式:下列使用resultMap实现结果集映射。除此之外,还可使用MySql语句查询时用as进行字段和对象属性名一致也可以。

  • 下列 resultMap标签中:
    resultMap标签同一行,id为这个结果集的标识,查询语句select中的resultMap属性的内容就是这个id。
    type为返回的数据类型。
    resultMap标签内部第一行id表示实体类id属性和数据库表主键对应的id。
    resultMap标签内部result标签表示实体类其他属性和数据库其他字段对应。
    最后,resultMap的每一行中,property表示实体类的属性名,column表示数据库表中对应的字段名。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979219.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

TDSQL手动调整备份节点或冷备节点

一、背景描述 近期TDSQL数据库备份不稳定&#xff0c;有些set实例的备份任务未自动发起。经排查分析&#xff0c;存在多个set实例容量已经超过TB级别&#xff0c;且冷备节点都是同一台。因此&#xff0c;需要手动将当前备份节点改到其他备节点&#xff0c;开启增量备份&#x…

FLStudio怎么冻结轨道以及如何批量复制音符

FLStudio是一款功能强大的音乐制作软件&#xff0c;广泛用于音乐制作和打谱当中。我们在制作音乐时&#xff0c;经常会遇到处理大量音频轨道的情况&#xff0c;过多的音频轨道可能会导致电脑性能受限&#xff0c;从而影响工作流程。为了应对这个问题&#xff0c;FLStudio提供了…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架&#xff0c;用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式&#xff0c;并且可以轻松添加新的输出格式。 CppTest下载地址&#xff1a;下载地址1  下载地址2 下面结合实例分析下CppTest如…

小样本学习登Nature!计算效率高170倍,彻底起飞

中科院新提出的社会行为图谱SBeA登上Nature子刊&#xff01; SBeA是一个用于多动物3D姿势估计、身份识别和社会行为分类的小样本学习框架&#xff0c;能够全面量化自由群居动物的行为&#xff0c;使用较少的标记帧数&#xff08;约 400 帧&#xff09;进行多动物三维姿态估计。…

linux常用非基础命令/操作

本篇用于总结蒟蒻博主在使用linux系统的过程中会经常用到但老实记不住的一些非基础命令和操作&#xff0c;方便遗忘时查阅 一&#xff0c;关闭指定端口的进程以释放端口 每个端口都有一个守护进程&#xff0c;kill掉这个守护进程就可以释放端口 ①使用命令【netstat -anp | gre…

数据结构|树形结构|并查集

数据结构|并查集 并查集 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 有趣的并查集剧情演绎&#xff1a;【算法与数据结构】—— 并…

045、seq2seq

之——序列生成 杂谈 基于RNN实现&#xff0c;通过RNN生成器不断获取输入&#xff0c;更新隐藏状态&#xff0c;将最后生成的隐藏状态传递给解码器&#xff0c;然后自循环迭代直到输出停止。 正文 1.训练 训练时候解码器使用目标句子不断作为输入&#xff0c;就算解码错了输入…

linux休眠唤醒流程,及示例分析

休眠流程 应用层通过echo mem > /sys/power/state写入休眠状态&#xff0c;给一张大概流程图 这个操作对应在kernel/power/main.c的state这个attr的store操作 static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) …

ESP32-Thonny 拍摄图片到SD卡

前言&#xff1a; 代码运行在Thonny 添加main.py到单片机中&#xff1a; 可以先运行一下试试&#xff1a;会输出以下信息&#xff1a; 没有问题的话&#xff08;SD卡挂载成功&#xff0c;摄像头初始化成功&#xff09;运行一次主程序后&#xff0c;闪光灯会闪烁一下。 代码&…

js获取某月往前推一年或半年的年月数组

前言 需求&#xff1a;需要显示某月份往前推一年或者半年的费用情况&#xff0c;显示到柱形图上&#xff0c;后台接口只返回有数据的年份&#xff0c;这就需要前端拿全部月份数组去比对并显示。 开始 上代码&#xff1a; // date:选择的月份,比如:2024-04,//n:半年或者1年,…

PTA 天梯赛 L1-010 比较大小【C++】 L1-011 A-B 【C++ vector动态数组】【Python 字符串replace函数】

L1-010 比较大小 判断顺序很重要 #include<iostream> using namespace std; int main() {int a, b, c;cin >> a >> b >> c;int temp;if (a > b) {temp a;a b;b temp;}if (a > c) {temp a;a c;c temp;}if (b > c) {temp b;b c;c te…

C++ //练习 13.17 分别编写前三题中所描述的numbered和f,验证你是否正确预测了输出结果。

C Primer&#xff08;第5版&#xff09; 练习 13.17 练习 13.17 分别编写前三题中所描述的numbered和f&#xff0c;验证你是否正确预测了输出结果。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************…

【御控物联网平台】物联网平台常见通讯协议

随着物联网&#xff08;InternetofThings&#xff0c;IoT&#xff09;的快速发展&#xff0c;越来越多的设备和传感器连接到网络&#xff0c;使得数据的传递和交互变得更加智能化和高效化。在实现这种智能化和高效化的数据交互&#xff0c;过程中&#xff0c;各种不同的通信协议…

防火墙技术基础篇:什么是防火墙

防火墙技术基础篇&#xff1a;什么是防火墙 什么是防火墙&#xff1f; 在我们开始之前&#xff0c;让我们先想象一下一个真实的场景。你的家是你的私人领地&#xff0c;你不希望任何未经许可的人进入。为了保护你的家&#xff0c;你可能会安装一些安全设备&#xff0c;比如门…

webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用

本文讲的全部知识点&#xff0c;都是和webpack相关的。如果你之前有疑问&#xff0c;那本文一定能帮你搞清楚。 问题来源一般是类似下面代码&#xff08;webpack.json中&#xff09;&#xff1a; "scripts": {"dev": "cross-env NODE_ENVdevelopmen…

Kafak详解(1)

简介 消息队列 为什么要有消息队列 图-1 消息队列的使用 消息队列 1)消息Message&#xff1a;网络中的两台计算机或者两个通讯设备之间传递的数据。例如说&#xff1a;文本、音乐、视频等内容。 2)队列Queue&#xff1a;一种特殊的线性表(数据元素首尾相接)&#xff0c;特…

DSView Windows平台编译

在Windows平台编译开源逻辑分析仪软件DSView&#xff0c;因官方没有公布DSView Windows平台源码&#xff0c;主要解决Windows平台以下问题&#xff1a; libusb_get_pollfds不支持Windows平台&#xff0c;导致无法采集数据插入设备后&#xff0c;无法自动识别设备&#xff0c;U…

全新创维EV6 Ⅱ超充车型有哪些亮点?答案将在北京车展揭晓

4月25日-5月4日&#xff0c;阔别4年的北京车展盛大回归&#xff0c;创维汽车将携全新车型创维EV6 Ⅱ超充车型及系列创新技术&#xff0c;亮相北京中国国际展览中心顺义馆W3号馆 311展位&#xff0c;全面展示其在新能源汽车补能及智能化领域的前瞻思考和技术布局。 以顶级超充革…

YOLOV5检测+追踪使用deepstream部署(c++版)

文章目录 一、Deepstream1.1 简介1.2 图架构&#xff08;Graph architecture&#xff09;1.3 应用架构&#xff08;Application Architecture&#xff09; 二、配置文件方式运行Deepstream2.1 环境准备2.2 主机运行2.3 配置文件解析2.4 docker运行 三、代码方式运行Deepstream3…

2024年电气工程与能源、动力国际学术会议(IACEEEP 2024)

2024年电气工程与能源、动力国际学术会议(IACEEEP 2024) 2024 International Conference on Electrical Engineering and Energy, Power 一、【会议简介】 2024年电气工程与能源、动力国际学术会议&#xff0c;精彩纷呈&#xff0c;不容错过&#xff01; 在这个备受瞩目的会议…