【 初识 Spring MyBatis 查询数据库 】

news2024/11/18 7:28:05

文章目录

  • 一、概念
  • 二、为什么学 MyBatis
  • 三、怎么学 MyBatis
  • 四、第⼀个MyBatis查询
    • 4.1 MyBatis 在整个框架中的定位
    • 4.2 准备:创建库和表
    • 4.3 配置 MyBatis 开发环境
      • 4.3.1 添加MyBatis框架⽀持
        • 4.3.1.1 ⽼项⽬添加支持
          • 扩展:在⽼项⽬中快速添加框架 - EditStarters插件
        • 4.3.1.2 新项⽬添加MyBatis支持
      • 4.3.2 配置连接字符串和 MyBatis xml 保存路径
        • 扩展:添加 SQL 日志打印
    • 4.4 添加业务代码
      • 4.4.1 添加实体类层(model)
      • 4.4.2 添加 mapper 接⼝
      • 4.4.3 添加 UserInfoMapper.xml
        • 扩展:Mapper 接口中的方法与 XML文件中的具体实现快速跳转 - MabatisX
      • 4.4.4 添加 Service
      • 4.4.5 添加 Controller

一、概念

MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的记录。MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换

简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具

二、为什么学 MyBatis

对于后端开发来说,程序是由以下两个重要的部分组成的: 后端程序和数据库

在这里插入图片描述

⽽这两个重要的组成部分要通讯,就要依靠数据库连接⼯具,那数据库连接⼯具有哪些?⽐如之前我们学习的 JDBC,还有今天我们将要介绍的 MyBatis,那已经有了 JDBC 了,为什么还要学习 MyBatis?这是因为 JDBC 的操作太繁琐了,我们回顾⼀下 JDBC 的操作流程:

  1. 创建数据库连接池 DataSource
  2. 通过 DataSource 获取数据库连接 Connection
  3. 编写要执⾏带 ? 占位符的 SQL 语句
  4. 通过 Connection 及 SQL 创建操作命令对象 Statement
  5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
  6. 使⽤ Statement 执⾏ SQL 语句
  7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量
  8. 处理结果集
  9. 释放资源

想要了解 JDBC 大家可以参考这一篇博客 !!


对于 JDBC 来说,整个操作⾮常的繁琐,我们不但要拼接每⼀个参数,⽽且还要按照模板代码的⽅式,⼀步步的操作数据库,并且在每次操作完,还要⼿动关闭连接等,⽽所有的这些操作步骤都需要在每个⽅法中重复书写。于是我们就想,那有没有⼀种⽅法,可以更简单、更⽅便的操作数据库呢?

答案是肯定的,这就是我们要学习 MyBatis 的真正原因,它可以帮助我们更⽅便、更快速的操作数据库

三、怎么学 MyBatis

MyBatis 学习只分为两部分:

  1. 配置 MyBatis 开发环境;
  2. 使⽤ MyBatis 模式和语法操作数据库

四、第⼀个MyBatis查询

4.1 MyBatis 在整个框架中的定位

开始搭建 MyBatis 之前,我们先来看⼀下 MyBatis 在整个框架中的定位,框架交互流程图:

在这里插入图片描述

在前面我们提到过 MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:

  1. 将输⼊数据(即传⼊对象)+SQL 映射成原⽣ SQL
  2. 将结果集映射为返回对象,即输出对象

ORM 把数据库映射为对象:

  1. 数据库表(table)–> 类(class)
  2. 记录(record,⾏数据)–> 对象(object)
  3. 字段(field) --> 对象的属性(attribute)

⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换,接下来我们来看 MyBatis 的使⽤吧

4.2 准备:创建库和表

具体 SQL 如下:创建 mycnblog 库,并创建用户表和文章表

-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8;
-- 使⽤数据数据
use mycnblog;
-- 创建表[⽤户表]
drop table if exists userinfo;
create table userinfo(
id int primary key auto_increment,
username varchar(100) not null,
password varchar(32) not null,
photo varchar(500) default '',
createtime datetime default now(),
updatetime datetime default now(),
`state` int default 1
);
-- 创建⽂章表
drop table if exists articleinfo;
create table articleinfo(
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
createtime datetime default now(),
updatetime datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
);

4.3 配置 MyBatis 开发环境

4.3.1 添加MyBatis框架⽀持

添加 MyBatis 框架⽀持分为两种情况:⼀种情况是对⾃⼰之前的 Spring 项⽬进⾏升级,另⼀种情况是创建⼀个全新的 MyBatis 和 Spring Boot 的项⽬,下⾯我们分别来演示这两种情况的具体实现

4.3.1.1 ⽼项⽬添加支持

如果是在⽼项⽬中新增功能,添加框架⽀持:

<!-- 添加 MyBatis 框架 -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.4</version>
</dependency>

<!-- 添加 MySQL 驱动 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

添加了 MyBatis 之后,为什么还需要添加 MySQL 驱动呢?

MyBatis 是后端程序和数据库连接的桥梁,它是一个代理!但具体连接的实现还得是通过具体的数据库驱动 !不⽌有 MySQL,还有 SQLServer、DB2 等等…因此这两个都是需要添加的

扩展:在⽼项⽬中快速添加框架 - EditStarters插件

直接在插件中搜索如下并安装,成功后重启 IDEA

在这里插入图片描述

EditStarters 插件的使⽤⽅法:

  1. 在 pom.xml 中 右击鼠标,点击 Generate 后点击 Edit Starters
    在这里插入图片描述
    在这里插入图片描述

  2. 跳转到如下窗口后,直接在SQL模块中选择 MyBatis框架支持 和 MySQL驱动 即可
    在这里插入图片描述

4.3.1.2 新项⽬添加MyBatis支持

Mybatis新项⽬创建和创建 Spring Boot 项⽬一样,只是需要额外添加依赖就行,如下图所示:

在这里插入图片描述

4.3.2 配置连接字符串和 MyBatis xml 保存路径

此步骤需要在配置文件如 application.yml 中进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML 保存路径的配置

1. 配置连接字符串

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
    username: ****
    password: ****
    # 驱动名称
    driver-class-name: com.mysql.cj.jdbc.Driver

注意事项: 如果使⽤ MySQL 是 5.x 之前的使⽤的是“com.mysql.jdbc.Driver”,如果是⼤于 5.x 使⽤的是“com.mysql.cj.jdbc.Driver”

2. 配置 MyBatis xml 保存路径

MyBatis 的 XML文件中保存的是查询数据库的具体 SQL操作,而XML 具体保存路径配置如下:

# 配置 mybatis.xml 保存路径 在 resources/mybatis 创建所有表的 xml ⽂件
mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml

注意:上述格式表示 在 mybatis 目录下,后缀为Mapper.xml 的文件都是 mybatis.xml文件,用来实现接口中声明的方法

配置好之后就需要在配置的路径下创建规定目录,如下:
在这里插入图片描述

具体的 xml 文件,我们后面再讲 !!

扩展:添加 SQL 日志打印

在上述配置文件中补充如下:

#设置日志级别
logging:
  level:
    com:
      example:
        demo: debug

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.4 添加业务代码

下⾯按照后端开发的⼯程思路,也就是下⾯的流程来实现 MyBatis 查询⽤户的功能

在这里插入图片描述

在这里插入图片描述

4.4.1 添加实体类层(model)

规范业务代码,先创建 model 层对应的包(后续每一层如此),再添加⽤户的实体类 UserInfo如下
在这里插入图片描述

package com.example.demo.model;

import lombok.Data;

@Data
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String photo;
    private String createtime;
    private String updatetime;
    private int state;
}

注意: 用户实体类中的属性要和数据库中用户表的字段对应 !!

在这里插入图片描述


4.4.2 添加 mapper 接⼝

数据持久层的接⼝定义:

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserInfoMapper {
    //以下的 @Param 建议加上,不然某些场景读取不到参数
    public UserInfo getUserById(@Param("id") Integer ID);//表示 参数ID是@Param读取的 id,即xml文件中${id}中的 id
  }

注意:

  1. 必须添加 @Mapper 注解,声明这里的接口是 Mapper 接口,定义方法声明,具体方法实现交给对应的 xml 文件
  2. @Param 建议加上,不然某些场景读取不到参数
  3. 上述参数ID是@Param读取的 id,即xml文件中${id}中的 id

4.4.3 添加 UserInfoMapper.xml

上面我们讲过,所有的xml文件都是保存在如下目录,其中UserInfoMapper.xml 是来实现 UserInfoMapper 接口中所有声明的方法 !!

在这里插入图片描述

UserInfoMapper.xml 具体实现如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 需要实现的接口的具体包名加接口名-->
<mapper namespace="com.example.demo.mapper.UserInfoMapper">

    <!-- select id中的id表示要实现接口中的具体方法  resultType:表示查询返回的类型,也就是开头定义的实体类-->
    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select *
        from userinfo
        where id = #{id};
    </select>
    
</mapper>

上述格式是固定的,下面我们对其中的标签属性进行解释:

在这里插入图片描述

  1. < mapper >标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接⼝的全限定
    名,包括全包名.类名。

  2. < select > 查询标签:是⽤来执⾏数据库的查询操作的:
    id:是和 Interface(接⼝)中定义的⽅法名称⼀样的,表示对接⼝的具体实现⽅法。
    resultType:是返回的数据类型,也就是开头我们定义的实体类


扩展:Mapper 接口中的方法与 XML文件中的具体实现快速跳转 - MabatisX

细心的你可能发现了代码中出现的小鸟 !! 它就是 MabatisX 插件,能够实现快速跳转 !

在这里插入图片描述

直接在 插件中下载安装即可使用 !!

在这里插入图片描述


4.4.4 添加 Service

服务层的作用是去调用并组装接口的 !服务层代码实现如下:

package com.example.demo.service;

import com.example.demo.mapper.UserInfoMapper;
import com.example.demo.model.UserInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserService {
    @Resource
    private UserInfoMapper userInfoMapper;

    public UserInfo getUserById(Integer ID){
        return userInfoMapper.getUserById(ID);
    }
}

4.4.5 添加 Controller

Controller 层是验证前端传来的参数 !

package com.example.demo.controller;

import com.example.demo.model.UserInfo;
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;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getuser")
    public UserInfo getUserById(Integer ID) {
        if (ID == null) {
            return null;
        }
        return userService.getUserById(ID);
    }
}

以上代码写完,整个 MyBatis 的查询功能就实现完了,我们通过 URL 访问查询 id为 41 的用户信息,如下:

在这里插入图片描述

在这里插入图片描述

由此可见,成功的查询到了 数据库中的用户信息 !!以上就通过 Mybatis 实现了一个简单的用户查询功能 !!


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

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

相关文章

ChatGPT 速通手册——不同相似度算法的分值介绍

不同相似度算法的分值介绍 在信息大暴涨的今天&#xff0c;人类已经不可能出现通才、全才式的人物。利用 ChatGPT 来询问我们未知领域的知识是很好的习惯和用法。但对严肃知识的学习&#xff0c;一定要通过权威来源复核审校&#xff0c;保证自己所学知识的正确。否则&#xff…

【安全学习笔记】信息收集-CDN相关的技术(CDN绕过)

CDN相关的技术&#xff08;CDN绕过&#xff09; CDN&#xff1a;内容分发网络&#xff0c;它是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容…

104. 二叉树的最大深度【75】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 101. 对称二叉树【74】 力扣此题地址&#xff1a; 104. 二叉树的最大深度 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根…

【并发编程】Java并发之关键字synchronized使用和原理

文章目录 前言一、synchronized的四种应用方式修饰一个代码块修饰一个方法修饰一个静态的方法修饰一个类 二、synchronized底层语义原理三、理解Java对象头与Monitor四、synchronized代码块底层原理五、synchronized方法底层原理六、Java虚拟机对synchronized的优化偏向锁轻量级…

Finetuner+:为企业实现大模型微调和私有化部署

如 ChatGPT、GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问&#xff0c;他在 OpenAI、Google 等大公司被预训练了不少的行业内专业知识&#xff0c;所以加入你的公司后&#xff0c;你只需要输入 Prompt 给他&#xff0c; 介绍一些业务上的背景知识&#xff0c;他就能…

清除Github提交历史commit

如果提交代码到Github仓库时&#xff0c;不小心把敏感信息&#xff08;比如登陆账号和登陆密码&#xff09;提交了上去&#xff0c;尽快处理。 git log 查看提交记录 git log定位你误操作的那一个版本 ‘be757abcb2b6c2b86b489384aeb4619d9b8c94c7’ 比如这个是你提交版本的…

2023全网汇总PMP备考攻略(附答题技巧)

一&#xff0c;多复习和学习新版考纲 01《PMBOK》看三遍 这边建议看三遍《PMBOK》&#xff0c;更有利于我们巩固知识&#xff0c;查缺补漏。 第一遍 第一遍是老师带着我们去看。这个时候一定要非常专心&#xff0c;千万不要上课走神或者玩手机。因为这一遍老师会告诉我们&a…

FreeRTOS源码获取以及解释各个文件作用

1.源码可以在官网:FreeRTOS官网&#xff1a;https://www.freertos.org/下载 2.FreeRTOS源码内容介绍 名称 描述 FreeRTOS FreeRTOS内核 FreeRTOS-Plus FreeRTOS组件 tools 工具 GitHub-FreeRTOS-Home FreeRTOS的GitHub仓库链接 Quick_Start_Guide 快速入门指南官方…

C/C++ Linux进程操作

目录 一、简介 二、创建进程 1. fork 2. wait 3. exit 三、多进程高并发设计 四、孤儿进程 五、僵尸进程 六、守护进程 七、总结 一、简介 进程是什么&#xff1f; 答&#xff1a;可以简单理解为&#xff0c;一个 .exe 的应用程序&#xff0c;就是运行在进程中的&a…

ChatGPT时代,我们可能站到了自然语言编程的大门口

ChatGPT大火&#xff0c;我现在有种感觉&#xff1a;我们可能站到了自然语言编程的门口&#xff0c;一脚下去&#xff0c;也许能把门踹开。 当然&#xff0c;也可能会踢到一块铁板。 回顾我们的编程之路&#xff0c;基本上就是一个编程门槛不断降低的历史。 最早的一批前辈们…

OSCP-Fail(rsync、fail2ban提权)

目录 扫描 rsync 提权 扫描 rsync 基于nmap,确信将进一步研究rsync。 为此,将使用netcat使用的rsync枚举。 使用netcat,我们可以列出rsync托管的当前共享。 我们看到“fox”和“fox home

万字长文带我弄懂JS基础!!!

js的学习笔记 文章目录 js的学习笔记JS基础篇js 的输出js的基本语法js语句js的注释js的变量js数据类型简介js对象简介js函数简介js的作用域js中的事件js字符串js运算符js条件语句js循环for/in循环 js的break和continuejs之typedefnullundefinedjs类型转换**constructor属性**St…

人类思维VS AI智能:谁是未来的胜者?

在“人工智能&#xff08;AI&#xff09;是否会取代人类”的问题上&#xff0c;谷歌的首席执行官埃德拉里博斯&#xff08;Ed Larrabee&#xff09;说&#xff1a;“我不认为 AI会取代人类。”而英国首相鲍里斯约翰逊则认为&#xff1a;“我们不能让 AI成为我们的敌人。”现在&…

MySQL解压版安装步骤

百度网盘有安装版、解压包安装包以及visual插件 链接&#xff1a;https://pan.baidu.com/s/1XXvWa40FYX5mtqofW_knIg 提取码&#xff1a;ky2q 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 解压压缩包&#xff0c;进入bin目录&#xff0c;地址栏输…

从C出发 26 --- 指针 : 一种特殊的变量

指针是变量&#xff0c; 是特殊的变量 在计算机内部逻辑上是一个一个存储单元&#xff0c;每个存储单元是一个字节 8 G /16 G 表示的是存储单元的数量 如果要确定某一个具体的存储单元&#xff0c;要怎么办&#xff1f; 可以编号&#xff0c;这里的 0 1 2 3 指的就是内存地…

如何利用TURF分析来对餐厅菜品进行组合搭配?

1.数据源说明 1.1 数据简单说明 本数据源采用的是某餐厅8月份的销售明细表。本文会主要用到一下字段值&#xff1a; order_id&#xff0c; 产品订单号dishes_name&#xff0c;菜品名称counts, 消费数量amounts&#xff0c;消费金额 1.2 数据截图 以下是数据源的截图 1.3…

【移动端网页布局】移动端网页布局基础概念 ⑤ ( 视网膜屏技术 | 二倍图概念 | 代码示例 )

文章目录 一、视网膜屏技术二、二倍图概念三、代码示例 一、视网膜屏技术 PC 端 和 早期的 移动端 网页中 , CSS 中配置的 1 像素 对应的就是物理屏幕中的 1 像素 ; Retina 视网膜屏幕 技术出现后 , 将多个物理像素压缩到一块屏幕中 , 可以达到更高的分辨率 , 画面显示效果更好…

【Linux】磁盘与文件系统

目录 一、磁盘的物理结构 二、磁盘逻辑抽象 三、文件系统 1、Super Block 2、Group Descriptor Table 3、inode Table 4、Data Blocks 5、inode Bitmap 6、Block Bitmap 四、Linux下文件系统 1、inode与文件名 2、文件的增删查改 2.1、查看文件内容 2.2、删除文件…

Node工程的依赖包管理方式 | 京东云技术团队

作者&#xff1a;京东零售 陈震 在前端工程化中&#xff0c;JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源&#xff0c;它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。 目前比较常见的前端包管理器有 n…

uniapp打包app,调用相机功能时在真机调试可以,打包成app之后不行

在打包成app之后报如图所示错误&#xff1a; 解决&#xff1a; 在app模块配置勾选上相机这一项&#xff0c;如图&#xff1a; 这是主要针对上面这个报错的&#xff0c;当然还有一下情况比较类似&#xff0c;就是相机功能在真机调试下可以&#xff0c;打包之后就不行了。我总结…