2023.11.25 关于 MyBatis 的配置与使用

目录

引言

MyBatis 介绍

掌握两个点

在框架中的定位

创建数据库

配置 MyBatis 

引入依赖

配置文件

创建实体类 

构建 Mapper 层代码实现

添加 mapper 接口

添加 UserMapper.xml 

实现 Service 层 

实现 Controller 层

最终测验 


阅读下面文章之前建议了解并创建一个 Spring Boot 项目

Spring Boot 项目的创建与使用


引言

  • 所谓的 SSM 项目
  • 现在其实指的就是 Spring Boot + Spring MVC + MyBatis 

MyBatis 介绍

  • MyBatis 是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
  • 简单来说 Mybatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具

掌握两个点

  • 配置 MyBatis 开发环境
  • 使用 MyBatis 模式和语法操作数据库

在框架中的定位

  • 框架交互流程图

创建数据库

  • 既然我们要讲解 MyBatis 的配置与使用,数据库的创建是必不可少的
  • 此处我们在本机的 MySQL 数据库中创建一个 message 数据库
  • 且在 message 数据库中再创建一个 user 表,用来存放用户信息
drop database if exists message;
create database message;
use message;create table user(id int primary key auto_increment,name varchar(20),age int
);insert into user values(null,"xiaolin",18);
insert into user values(null,"maolin",20);
insert into user values(null,"xiaomei",19);

配置 MyBatis 

引入依赖

  • 我们在 pom.xml 中引入相关依赖
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version>
</dependency>

配置文件

  • 此处配置均在配置文件 application.properties 下添加
# 配置数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/message?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
# 此处填你自己设置的数据库密码
spring.datasource.password=1111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • 配置连接字符串
# 配置 mybatis xml 的文件路径
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
  • 配置 MyBatis 中的 XML 路径
  • 我们需在 resources/mapper 创建所有表的 xml 文件

注意:

  • 当我们仅引入依赖,未配置上述文件
  • 此时启动我们的 SSM 项目,一定会发生报错,即启动失败

  • 数据库连接配置文件:该文件包含了连接数据库所需的信息,如数据库的 URL、用户名、密码等,如果未配置该文件,那么应用程序将无法连接到数据库,从而无法进行数据的读写操作

  • mybatis xml 文件路径:该文件定义了 mybatis 的 SQL 映射语句和结果映射。如果未配置该文件,则 mybatis 将无法找到 SQL 映射语句,从而无法执行数据库操作

创建实体类 

  • 此处我们创建一个 User 实体类为了对应上我们在 message 数据库中创建的 user 表
  • 从而建立好一个映射关系
  • 两点要求:
  • 具有 getter 和 setter 方法
  • 属性名必须与 sql 字段名一致
import lombok.Data;@Data
public class User {private int id;private String name;private int age;
}
  • 此处我们使用 LomBok 来通过注解给 User 实体类添加上 getter 和 setter 方法

构建 Mapper 层代码实现

  • MyBatis 通过两个部分建立后端和数据库的联系
  • 接口(该接口中的每个方法 均映射了 XML 文件中的具体 SQL 语句)
  • XML 实现接口(用来写具体的 SQL 语句)


添加 mapper 接口

  • 此处我们创建一个 UserMapper 接口
  • 接口下的每个方法就对应 对数据库 user 表的一个操作
  • 这里实现的是根据 id 查询用户信息
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;//添加 @Mapper 注解 代表该接口会伴随着 项目的启动而注入到容器中
@Mapper
public interface UserMapper {
//    根据 id 查询用户信息User getUserById(@Param("user_id") Integer id);
}

注意:

  • 此处的 @Param 注解用于给方法的参数重命名

添加 UserMapper.xml 

  • 该 xml 文件需与上述的 mapper 接口相对应

添加 *Mapper.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.demo.mapper.UserMapper"></mapper>
  • 因为此处的 UserMapper.xml 需与上文的 UserMapper 接口相对应
  • 即 namespace 需填 UserMapper 接口的文件路径

  • 又因为此处我们需要写的是 根据 id 查询用户信息,即应该使用 select 语句
<?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="getUserById" resultType="com.example.demo.entity.User">select * from user where id = ${user_id}</select></mapper>
  • 该新添加的 select 标签具有三处对应关系

实现 Service 层 

  • 在 MyBatis 中,服务层(Service 层)的主要作用是封装业务逻辑
  • 实现业务流程的复杂性,提高代码的可重用性和可维护性
  • 简单来说 服务层中的方法一般用来编排 mapper 层的各个接口,从而实现所需的业务逻辑
  • Controller 会调用 Service 层的方法,而不是直接调用 Mapper 层的方法

实例理解 :

  • 有一个业务逻辑需要在 user 表中连续插入多条数据,则可在 service 层通过 for 循环的方式调用 mapper 层中对应的方法来实现该逻辑

  • 此处我们的业务逻辑很简单
  • 仅实现根据 id 查询用户信息即可

  • UserService 类中具体代码实现
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;//添加 @Service 注解 代表该类会伴随着 项目的启动而注入到容器中
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Integer id) {return userMapper.getUserById(id);}
}

实现 Controller 层

  •  控制器层用于直接与客户端进行交互
  • 接收客户端 HTTP 请求,并实现相应的业务逻辑

  • 此处客户端的 HTTP 请求正是想根据 id 查询用户信息

  • UserController 类中具体代码实现
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@ResponseBody
@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/get-user-by-id")public User getUserById(Integer id) {if(id == null){return null;}return userService.getUserById(id);}
}

最终测验 

  • 我们在浏览器的 URL 框中输入与 UserController 所对应的 URL 地址,从而实现调用到 getUserById 方法

  • 如上图所示,我们成功查询到了数据库中 id = 1 的用户信息

  • 看完上述文章后,重新理解下图

  • 这便是上述文章所写的整个交互过程

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

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

相关文章

树状数组专题

折叠 区间修改&#xff0c;区间查询&#xff0c;这一类题通常都可以使用线段树解决&#xff0c;但对于此题&#xff0c;树状数组同样可以&#xff0c;而且常数较小&#xff0c;代码简单。 思路&#xff1a; 考虑使用树状数组去维护差分数组&#xff0c;即对于 a i a_i ai​,我们…

使用qemu调试arm内核

参考书籍《奔跑吧Linux内核》–笨叔 下载Linux-5.0源码 https://benshushu.coding.net/public/runninglinuxkernel_5.0/runninglinuxkernel_5.0/git/files或者直接git源码 git clone https://e.coding.net/benshushu/runninglinuxkernel_5.0/runninglinuxkernel_5.0.git安装必…

【React】Memo

组件重新渲染时缓存计算的结果。 实例&#xff1a;count1计算斐波那契数列&#xff0c;count2和count1可以触发数值变化。使用memo可以使只有在count1变化时触发斐波那契数列计算函数&#xff0c;而count2变化时不触发斐波那契数列计算函数。 import { useMemo } from "r…

点云从入门到精通技术详解100篇-基于深度学习的语义分割与室内稠密点云地图研究(续)

目录 3.2稠密点云地图的预处理 3.2.1 基于密度的点云离群点去除 3.2.2 基于超体素聚类的点云地图预分割

SpringCloud微服务网关Gateway:gateway基本实现、断言工厂、过滤器工厂、浏览器同源策略、跨域问题解决方案

Gateway网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0和Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API路由管理方式 为什么…

【面试题】介绍一下类加载过程,什么是双亲委派模型

背景 java 文件在运行之前&#xff0c;必须经过编译和类加载两个过程&#xff1a; 编译过程&#xff1a;把 .java 文件 编译成 .class 文件类加载过程&#xff1a;把 .class 文件加载到 JVM 内存里&#xff0c;加载完成后就会得到一个 class 对象&#xff0c;我们就可以使用 n…

Vue快速实践总结 · 上篇

文章目录 模板语法数据绑定事件处理计算属性监视属性&#xff08;监听器&#xff09;条件渲染列表渲染数据监视原理内置指令总结生命周期组件化编程组件使用步骤组件的嵌套this指向单文件组件ref、props 脚手架(Vue CLI)render函数 参考自己的Vue专栏以及Vue官方文档 模板语法 …

目标检测YOLO实战应用案例100讲-基于改进YOLO深度学习模型的烟支外观质量检测

目录 前言 研究意义 国内外研究现状 烟支缺陷检测的研究

Java PriorityQueue

一般情况下, 我们使用队列是为了能够建造队列的先进先出 (First-In-First-Out) 模式的, 达到一种资源的公平分配, 先到达的任务 (元素) 先处理, 但有时需要在队列中基于优先级处理对象。 存入队列中的任务 (元素) 具有优先级, 需要根据优先级修复里面的数据。而在 JDK 1.5 引入…

Java 泛型知识总结

1、基础知识 泛型是 JDK5 引入的参数化类型特性&#xff0c;所谓参数化类型就是把类型当成参数一样传递&#xff0c;它使得一个类型在定义类、接口和方法时成为一个参数&#xff0c;类似于方法声明中的形式参数&#xff0c;不同之处在于形式参数的输入是值&#xff0c;而类型形…

微机原理_5

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8086微处理器CLK引脚输入时钟信号是由(提供。 A. 8284 B. 8288 C.8287 D. 8289 2.下面4个寄存器中,不能作为间接寻址的寄存器是(…

go语言基础 break和contine区别

背景 break和continue是编程语言的标准语法&#xff0c;几乎在所有的语言都有类似的用法。 go语言及所有其他编程语言for循环或者其他循环 区别 for i : 0; i < 10; i {if i 5 {continue}fmt.Println(i)for j : 0; j < 3; j {fmt.Println(strconv.Itoa(j) "a&q…

Java + openCV更换证件照背景色

最近在小红书上看到很多更换证件照背景色的需求&#xff0c;联想到以前自己也更换过证件照背景色而且还是付费的&#xff0c;碰巧最近在看一本书《JavaOpenCV高效入门》&#xff0c;于是查找资料&#xff0c;找到了通过技术解决这个需求的办法。 先看效果图&#xff08;图片来自…

使用CMake构建

使用CMake构建 CMake是一个工具,用于简化跨不同平台的开发项目的构建过程。CMake自动生成生成系统,如Makefiles和Visual Studio项目文件。 CMake是一个自带的第三方工具证明文件。本主题描述了如何使用CMake3.1.0带Qt 5。 开始使用CMake 开始find_package找到Qt附带的库和…

java源码之变量和运算符

1、源码使用背景 2、基础讲解 1、数据类型变量 数据类型包括基本数据类型与引用数据类型。 基本数据类型&#xff1a;整数类型、浮点类型、字符类型与布尔类型&#xff08;1&#xff09;整数类型&#xff1a;byte&#xff08;1字节&#xff09;、short&#xff08;2字节&…

职场如战场!!!

一、与他们相处的经历和故事 尊重他人&#xff1a;无论是同事还是领导&#xff0c;在职场中都应该相互尊重。尊重他人的看法、意见和信仰&#xff0c;可以建立积极的工作关系&#xff0c;促进工作效率。 跟随公司文化&#xff1a;不同的公司有不同的文化&#xff0c;理解和遵循…

62 权限提升-烂土豆dll劫持引号路径服务权限

目录 演示案例:Win2012-烂士豆配合令牌窃取提权-Web权限Win2012-DLL劫持提权应用配合MSF-Web权限Win2012-不安全的服务权限配合MSF-本地权限Win2012-不带引号服务路径配合MSF-Web&#xff0c;本地权限补充说明: dll劫持提权及AlwaysInstallElevated等说明关于Windows相关知识点…

vue 中 keep-alive 组件的作用

Vue中的<keep-alive>组件主要用于缓存不活动的组件实例&#xff0c;而不是销毁它们。当组件在<keep-alive>内时&#xff0c;它的激活和停用状态会被相应的触发。这对于性能优化特别有用&#xff0c;尤其是对于那些需要大量计算或产生大量DOM操作的组件。 在<ke…

yo!这里是异常相关介绍

目录 前言 异常的概念 异常的抛出与捕获 捕获过程 重新抛出 规范 异常体系 自定义 标准库 异常的优缺点 后记 前言 对于程序运行时发生的错误&#xff0c;比如内存错误、除0错误等类型&#xff0c;你会如何处理&#xff1f;是使用assert终止程序或是使用exit返回错误…

Linux中的实时线程

目录 一、Linux线程调度策略二、SCHED_RR 为什么比 SCHED_OTHER 要实时呢三、如何使用线程调度相关API1、相关API介绍2、示例代码 一、Linux线程调度策略 在 Linux 中&#xff0c;调度策略&#xff08;scheduling policy&#xff09;是操作系统用来决定进程或线程调度顺序的算法…