【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=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表示数据库表中对应的字段名。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题实战4:寻找两个正序数组的中位数

题目内容 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.0…

微博评论爬取

import requests import csv# 打开CSV文件以写入数据 f open(data.csv, modea, encodingutf-8-sig, newline) csv_writer csv.DictWriter(f, fieldnames[昵称, 性别, 归属地, 内容]) csv_writer.writeheader()# 定义一个函数用于获取评论内容 def GetContent(max_id):# 设置请…

SRS服务接入华为云CDN

CDN简介: CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网…

为何3C电子精密件测量首选闪测仪?

在工业生产中&#xff0c;精密件的测量是至关重要的环节&#xff0c;它直接关系到产品的质量和性能。大部分3c电子工厂以及精密五金加工厂中&#xff0c;产品质检环节中大部分测量仪器都采用闪测仪。为什么呢&#xff1f; 测量精度与稳定性 闪测仪能够提供更高的测量精度和稳定…

window11上修改字符编码方式

windos11字符编码方式为gbk。我们有时候要用cmd命令行检测中文的代码里面含有中文的时候就会出现乱码&#xff0c;将gbk更改为utf-8后便可以解决这一情况。 步骤&#xff1a; 1、windows上【设置】-【时间和语言】【语言与区域】-【管理语言设置】 打开区域界面&#xff0c;点…

Linux 终端中的目录切换

目录 ⛳️推荐 前言 理解 Linux 中的路径 利用 cd 命令变更目录 故障解决 文件或目录不存在 非目录错误 特殊目录符号 测试你的知识 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击…

PCB走线宽度、PCB走线宽度计算、PCB走线宽度和电流

目录 一、什么是PCB走线宽度&#xff1f; 二、什么是走线&#xff1f; 三、哪些因素对走线宽度至关重要&#xff1f; 1、信号走线 2、电源走线 3、直线宽度和信号反射 四、怎么计算PCB走线宽度&#xff1f; 1、使用PCB走线宽度计算器 2、使用方程式 五、怎么计算PCB 走…

Java 【数据结构】 二叉树(Binary_Tree)【神装】

登神长阶 第五神装 二叉树 Binary-Tree 目录 &#x1f3b7;一.树形结构 &#x1fa97;1.概念 &#x1f3b8;2.具体应用 &#x1f3b9; 二.二叉树&#xff08;Binary Tree&#xff09; &#x1f3ba;1.概念 &#x1f3bb;2.表现形式 &#x1fa95;3.特殊类型 &#x1f941…

【C语言__基础概念__复习篇8】

目录 前言 一、C语言是什么 二、C语言的发展历史 三、编译器的选择 3.1 编译和链接 3.2 编译器的对比 3.3 VS如何使用 四、main函数 五、关键字 六、字符和ASCII编码 七、字符串和\0 八、转义字符 九、注释 十、数据类型 10.1 数据类型的介绍 10.2 数据类型大小的计…

互联网大佬座位排排坐:马化腾第一,雷军第二

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这是马化腾、雷军、张朝阳、周鸿祎的座位&#xff0c;我觉得是按照互联网地位排序的。 马化腾坐头把交椅&#xff0c;这个没毛病&#xff0c;有他在的地方&#xff0c;其他几位都得喊声“大哥”。雷军坐第二把交椅…

Linux进程详解二:创建、状态、进程排队

文章目录 进程创建进程状态进程排队 进程创建 pid_t fork(void) 创建一个子进程成功将子进程的pid返回给父进程&#xff0c;0返回给新创建的子进程 fork之后有两个执行分支&#xff08;父和子&#xff09;&#xff0c;fork之后代码共享 bash -> 父 -> 子 创建一个进…

上汽大通:依托电子签网络,升级产业供应链协同

2023年12月&#xff0c;法大大发布了中国首部《汽车行业合同数智化白皮书》&#xff08;点击阅读及下载&#xff1a;中国首部&#xff01;《汽车行业合同数智化白皮书》重磅发布 | 附下载&#xff09;。该白皮书中基于法大大自身参与汽车行业合同数智化建设的实践和思考&#x…

一次Ambari安装记录

引言 Ambari是一个开源的Apache项目,它提供了一个直观易用的Web界面,用于管理、监控和配置Apache Hadoop集群。它是一个集群管理工具,可以帮助管理员轻松地部署、管理和监控Hadoop集群的各种组件,如HDFS、YARN、MapReduce、Hive、HBase等。通过Ambari,用户可以在集群中添…

使用R语言生成频数分布表

概要 使用R语言生成频数分布表 在R语言中&#xff0c;可以使用freq()函数来生成频数分布表。首先&#xff0c;将需要分组的数据存储在一个向量中。然后&#xff0c;使用freq()函数将这个向量作为参数输入&#xff0c;即可生成频数分布表。以下是一个示例&#xff1a; 示例 …

力扣-2259移除指定数字得到的最大结果

思路&#xff1a; 1. def removeDigit(self, number: str, digit: str) -> str:&#xff1a;这是一个类方法&#xff0c;接受两个参数 number 和 digit&#xff0c;分别表示输入的数字字符串和要移除的数字字符&#xff0c;返回一个字符串。 2. n len(number)&#xff1a…

【linux】chmod权限开放(整个文件夹)

文章目录 起因权限查看权限修改 失败权限修改成功 起因 想要共享conda环境给同事&#xff0c;发现同事没权限。 权限查看 ls #查看当前目录 ls -l # 查看当前目录的东西和权限正常情况下是显示 三个rwx分别属于user&#xff0c;group&#xff0c;others 前面第一个rwx 是针…

抖店2024现状,嘴上抱怨内卷不好做,做起来就一做一个不吱声

我是王路飞。 身边有朋友在做抖店的&#xff0c;你要是问他现在抖店做着怎么样&#xff1f; 他绝对会说现在的抖店非常内卷&#xff0c;流量不好搞&#xff0c;达人不好对接&#xff0c;很难做...... 但是私底下做起来&#xff0c;一做一个不吱声~ 这也是现在抖店的一个真实…

【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 A算法与DWA算法的融合是一个高效的路径规划策略&#xff0c;这种策略将A算法的全局路径规划能力与DWA算法的局部避障能力结合起来&#xff0c;以期达到更快、更安全的导航效果。以下是对这种融合策略的详细描述。 一、基本概…

RISC-V CVA6 在 Linux 下相关环境下载与安装

RISC-V CVA6 在 Linux 下相关环境下载与安装 所需环境与源码下载 CVA6 源码下载 首先&#xff0c;我们可以直接从 GitHub 一次性拉取所有源码&#xff1a; git clone --recursive https://github.com/openhwgroup/cva6.git如果这里遇到网络问题&#xff0c;拉取失败&#x…

Vue--》深入了解 VueUse 功能性工具集

今天博主为大家介绍一款实用性的插件名字叫做 VueUse &#xff0c;它是专门为 Vue.js 生态系统设计的功能性工具集合。其提供了许多可重用的功能函数&#xff0c;可以帮助开发者更轻松地构建 Vue.js 应用程序。其提供了大量的功能&#xff0c;包括状态管理、副作用管理、组合式…