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

news2025/1/12 15:51:24

作者:学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=false
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

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

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

Mybatis:
  # 此路径表示在 resources/mapper目录下创建 数据库对应表的 xml文件
  # 文件名称为 ***Mapper.xml
  mapper-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 {
    @Autowired
    private 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 {
    @Autowired
    private 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://www.coloradmin.cn/o/1618550.html

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

相关文章

【智能算法】蜉蝣算法(MA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;K Zervoudakis等人受到自然界蜉蝣交配繁殖行为启发&#xff0c;提出了蜉蝣算法&#xff08;Mayfly Algorithm, MA&#xff09;。 2.算法原理 2.1算法思想 MA灵感来自蜉蝣交配…

简化图卷积 笔记

1 Title Simplifying Graph Convolutional Networks&#xff08;Felix Wu、Tianyi Zhang、Amauri Holanda de、 Souza Jr、Christopher Fifty、Tao Yu、Kilian Q. Weinberger&#xff09;【ICML 2019】 2 Conclusion This paper proposes a simplified graph convolutional m…

《HCIP-openEuler实验指导手册》1.4 Apache MPM工作模式调整

MPM介绍 二、配置步骤 查看MPM当前工作模式 方法一&#xff1a; httpd -M | grep mpm方法二&#xff1a; 浏览器访问&#xff1a;http://IP:端口/server-status 方法三&#xff1a; cat /etc/httpd/conf.modules.d/00-mpm.conf查看 LoadModule mpm_event_module modules/mo…

嵌入式学习59-ARM8(中断,ADC,内核定时器和传感器)

什么是中断顶半部和底半部 &#xff1f; &#xff08;部分记忆&#xff09;背 上半部&#xff1a; …

探索亚马逊云科技「生成式 AI 精英速成计划」

目录 前言「生成式 AI 精英速成计划」技术开发课程学习课程学习 总结 前言 亚马逊云科技&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;作为全球领先的云计算服务提供商&#xff0c;一直以来在推动人工智能&#xff08;AI&#xff09;领域的发展中扮演着重要…

鸿蒙OpenHarmony【小型系统运行案例】 (基于Hi3516开发板)

运行 启动系统 在完成Hi3516DV300的烧录后&#xff0c;还需要设置BootLoader引导程序&#xff0c;才能运行OpenHarmony系统。 在Hi3516DV300任务中&#xff0c;单击Configure bootloader&#xff08;Boot OS&#xff09;进行配置即可。 说明&#xff1a; DevEco Device Tool…

python爬虫之爬取微博评论(4)

一、获取单页评论 随机选取一个微博&#xff0c;例如下面这个 【#出操死亡女生家属... - 冷暖视频的微博 - 微博 (weibo.com) 1、fnf12&#xff0c;然后点击网络&#xff0c;搜索评论内容&#xff0c;然后预览&#xff0c;就可以查看到网页内容里面还有评论内容 2、编写代码…

【无线通信】OQPSK

调制 sps 8; RolloffFactor 0.2; FilterSpanInSymbols 10;bits randi([0, 1], 224*8, 1); % 1792symbols bits*2 - 1; % 1792 re -symbols(2:2:end); % 896 im -symbols(1:2:end); % 896pFilterTx comm.RaisedCosineTransmitFilter(...Shape, Square root, ...Rollo…

【全网首发】Mogdb 5.0.6新特性:CM双网卡生产落地方案

在写这篇文章的时候&#xff0c;刚刚加班结束&#xff0c;顺手写了这篇文章。 前言 某大型全国性行业核心系统数据库需要A、B两个物理隔离的双网卡架构方案&#xff0c;已成为行业标准。而最新发布的MogDB 5.0.6的CM新增支持流复制双网段部署&#xff0c;用于网卡级高可用容灾(…

LlamaIndex 加 Ollama 实现 Agent

AI Agent 是 AIGC 落地实现的场景之一&#xff0c;与 RAG 不同&#xff0c;RAG 是对数据的扩充&#xff0c;是模型可以学习到新数据或者本地私有数据。AI Agent 是自己推理&#xff0c;自己做&#xff0c;例如你对 AI Agent 说我要知道今天上海的天气怎么样&#xff0c;由于 AI…

WAF防范原理

目录 一、什么是WAF 二、纵深安全防御 WAF的组网模式 WAF配置全景 WAF端 服务器 攻击端 拦截SQL注入&#xff0c;XSS攻击&#xff0c;木马文件上传 要求&#xff1a; 使用WAF&#xff0c;通过配置策略要求能防御常见的web漏洞攻击&#xff08;要求至少能够防御SQL、XSS、文…

阿赵UE学习笔记——30、HUD简单介绍

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下HUD的基础使用。 一、 什么是HUD HUD(Head-Up Display)&#xff0c;也就是俗称的抬头显示。很多其他领域里面有用到这个术语&#xff0c;比如开车的朋友可能会接触过&#xf…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑&#xff0c;判断对象类型是否是InitializingBean的子类型&#xff0c;如果是&#x…

BI项目规划第二讲:BI项目实施方案这样设计就够了

在上一篇文章中&#xff0c;我们对BI项目规划中的确定项目范围、组建项目团队两方面进行了详细的解读。 随着项目团队的建立和角色分配的明确&#xff0c;接下来的工作将转向具体的项目实施策略&#xff0c;这是确保项目顺利进行的另一个关键环节。 BI项目实施方案是在项目开…

<前端>Electron-builder为公证后的app打更新信息latest.yml

MacOS下&#xff0c;Electron-builder可以很方便的为测试包app打更新信息&#xff08;latest-mac.yml&#xff09;。 但是&#xff0c;正式发布的时候&#xff0c;不可能用测试包app&#xff0c;因为还没有进行公证。如何为公证的app打latest-mac.yml呢。 其实观察latest-mac.y…

真实世界的密码学(四)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十六章&#xff1a;加密何时何地失败 本章涵盖 使用加密时可能遇到的一般问题 遵循烘烤良好的加密的要点 加密从业者的危险和责任 问候…

【IR 论文】Query2doc — 使用 LLM 做 Query Expansion 来提高信息检索能力

论文&#xff1a;Query2doc: Query Expansion with Large Language Models ⭐⭐⭐⭐⭐ Microsoft Research, EMNLP 2023 文章目录 背景介绍Query2doc 论文速读实现细节实验结果和分析总结分析 背景介绍 信息检索&#xff08;Information Retrieval&#xff0c;IR&#xff09;指…

(5)步态识别论文研读——GaitDAN:基于对抗域适应的跨视角步态识别

GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation | IEEE Journals & Magazine | IEEE Xplore GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation 基于对抗与适应 摘要&#xff1a;视角变化导致步态外观存在显着差异。因…

虚假新闻检测——Adapting Fake News Detection to the Era of Large Language Models

论文地址&#xff1a;https://arxiv.org/abs/2311.04917 1.概论 尽管大量的研究致力于虚假新闻检测&#xff0c;这些研究普遍存在两大局限性&#xff1a;其一&#xff0c;它们往往默认所有新闻文本均出自人类之手&#xff0c;忽略了机器深度改写乃至生成的真实新闻日益增长的现…

stabel-TTS

文章目录 model arch model arch github测试网页 text encoder 换成DiT结构&#xff1b;decoder 用flow结构&#xff0c;text 到mel的时长对齐&#xff0c;使用MAS&#xff0c;和Glow-TTS的结构很像【encoder从transformer变成了diffusion】