【MyBatis】操作数据库——入门

在这里插入图片描述

文章目录

  • 为什么要学习MyBatis
  • 什么是MyBatis
  • MyBatis 入门
    • 创建带有MyBatis框架的SpringBoot项目
    • 数据准备
    • 在配置文件中配置数据库相关信息
    • 实现持久层代码
    • 单元测试

为什么要学习MyBatis

前面我们肯定多多少少学过 sql 语言,sql 语言是一种操作数据库的一类语言,数据库是保证数据能够持久化存储的一种集合。在众多 sql 语言中,MySQL就是其中一种,并且是人们使用较多的一种 sql 语言,而就是因为 MySQL 使用较简单,使用的人较多,所以就出现了 JDBC 编程,也就是 Java 的一个 API,可以让我们通过 Java 代码来操作我们的数据库,但是呢?JDBC 编程的操作太复杂了,为什么会说 JDBC 操作复杂呢?看下面这段代码。

package com.example.mybatis20231226.Dao;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class UserDao {DataSource dataSource = null;public UserDao(DataSource dataSource) {this.dataSource = dataSource;}public void addUser() throws SQLException {Connection connection = null;PreparedStatement statement = null;try {connection = dataSource.getConnection();String sql = "insert into user values (?,?,?);";statement = connection.prepareStatement(sql);statement.setString(2, "小明");statement.setInt(3, 0);statement.execute();} catch (SQLException e) {throw new RuntimeException(e);} finally {if (statement != null) {statement.close();}if (connection != null) {connection.close();}}}
}

使用 JDBC 操作,需要创建出 DataSource 数据源对象、Connection 对象、PrepareStatement 对象,甚至是 ResultSet 对象,并且在使用完这些资源之后还不能忘记释放掉这些资源,这些 JDBC 很多的操作都是重复的,所以就出现了能够简化 JDBC 操作的框架——MyBatis。

什么是MyBatis

MyBatis的发展历程可以追溯到2001年,当时Clinton Begin发起了一个名为iBATIS的开源项目。iBATIS最初是一个专注于密码软件开发的开源项目,但后来逐渐发展成为一个基于Java的持久层框架。

在2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会,接下来的6年中,开源软件世界发生了巨大的变化,一切开发实践、基础设施、许可,甚至数据库技术都彻底改变了。

2010年,核心开发团队决定离开Apache软件基金会,并且将iBATIS改名为MyBatis。之后,MyBatis迁移到了Google Code,并在2013年11月再次迁移到了GitHub。

在功能上,MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。使得数据持久层的设计更为灵活和高效。

这里是 MyBatis 的中文官方网站https://mybatis.net.cn/

在这里插入图片描述
在 Spring 中,三层架构分别是Controller(控制层)、Service(业务逻辑层)和Dao(数据访问层),我们的 MyBatis 就处于三层架构的 Dao 层。

在这里插入图片描述
简单来说,MyBatis 就是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库的工具。

MyBatis 入门

首先我们先通过一个使用了 MyBatis 框架的程序来看看 MyBatis 有多么的方便。

创建带有MyBatis框架的SpringBoot项目

在创建项目的时候勾选上 MyBatis FrameworkMySQL Driver

在这里插入图片描述
MyBatis 不是只能用于 Java 的 Spring 框架,它可以独立存在,只是因为 MyBatis 的实用性的方便,所以 Idea 才将 MyBatis 给集成进来了。那么既然选择了 MyBatis,为什么还要选择 MySQL Driver 呢?前面我们说了,MyBatis 是一种框架,他操作的是数据库,只是简化了 JDBC 的操作,所以底层还是 JDBC。

当勾选了 MyBatis 框架了之后,在 SpringBoot 项目的 pom.xml 文件中可以发现已经自动导入了 MyBatis 和 MySQL 的依赖。

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.3</version><scope>test</scope>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

如果我们已经创建完成了SpringBoot项目了之后,想要在当前项目添加进去 MyBatis 依赖的话,可以使用前面的 Edit Starters 插件来继续添加进去 MyBatis 依赖。

在这里插入图片描述
当然我们也可以去 maven 中央仓库通过添加 MyBatis 依赖的坐标到 pom.xml 文件中来加入依赖,其实上一个在创建 SpringBoot 项目的时候勾选 MyBatis 选项也是将 MyBatis 的坐标添加进去 pom.xml 文件中,只不过这个是 Idea 帮我们自动完成了。

注意:手动添加 Mybatis 依赖的时候,需要注意 Spring 版本和 MyBatis 版本的对应关系。

数据准备

我们先在本地数据库中存储一些数据,作为后面 MyBatis 操作的数据。

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[⽤⼾表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`username` VARCHAR ( 127 ) NOT NULL,`password` VARCHAR ( 127 ) NOT NULL,`age` TINYINT ( 4 ) NOT NULL,`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',`phone` VARCHAR ( 15 ) DEFAULT NULL,`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;-- 添加⽤⼾信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

在这里插入图片描述
在 Java 中创建出 UserInfo 类与数据库中一行的数据对应。这里为什么要与数据库中的列对应以及可不可以不对应,我们后面再说。

package com.example.mybatis20231226.Model;import lombok.Data;import java.util.Date;@Data
public class UserInfo {private int id;private String username;private String password;private int age;private int gender;private String phone;private int deleteFlag;private Date createTime;private Date updateTime;
}

在配置文件中配置数据库相关信息

我这里选择的是 YAML 配置文件配置,properties 也类似。

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: xxxxxxdriver-class-name: com.mysql.cj.jdbc.Driver

如果MySQL使用的是5.x之前版本的话,driver-class-name选项的值要使用 com.mysql.jdbc.Driver ,大于5.x版本就使用 com.mysql.jdbc.cj.Driver

实现持久层代码

MyBatis 持久层接口规范一般都叫XxxMapper。

package com.example.mybatis20231226.Mapper;import com.example.mybatis20231226.Model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select * from userinfo")public List<UserInfo> selectAll();
}

注意这里的 @Mapper 注解要选择 org.apache.ibatis.annotations 包下的。
在这里插入图片描述
在MyBatis中,@Mapper注解主要用于标识接口,它表示该接口是一个MyBatis的映射器接口。这个注解可以帮助简化代码和提高代码的可读性。

当你使用@Mapper注解标记一个接口时,MyBatis会自动为该接口生成实现类,该实现类包含了该接口中所有方法对应的SQL语句和执行逻辑。而在Spring中使用@Mapper注解,Spring会扫描到这个接口,并将其实例化为一个Bean,自动注入到MyBatis的SqlSession中。这样,你就可以通过直接调用接口方法的方式来执行相应的SQL语句,而不需要手动编写实现代码。

@Select("select * from userinfo")
public List<UserInfo> selectAll();

public List<UserInfo> selectAll() 是方法的声明,而这个 @Select("select * from userinfo") 则是这个方法的实现。Select 说明这个方法是一个查询方法。

那么有人会问了,这里类为什么会选择使用 interface 接口,而不是 class 呢?如果你是 class 的话,那么方法的具体实现就是需要我们写出来的,而上面说了这个方法的实现是通过 @Select("select * from userinfo") 注解实现的,如果我们再在这个方法中写上实现的话,就会导致冲突出现问题,而 interface 接口中的所有方法都是抽象方法,是不需要写出方法的实现的,正好对应 MyBatis 注解来实现,所以 interface 接口是最好的选择。

单元测试

当我们写完上面的代码之后,是否需要再创建一个测试类来测试这个方法呢?可以这样,但是这样比较麻烦,我们可以通过单元测试的方法快速的测试我们的代码功能。

单元测试是一种对软件中的最小可测试单元进行检查和验证的测试活动。在软件开发过程中,单元测试是在最低级别进行的测试活动,通常针对软件的独立单元进行,这些单元可能是函数、类、模块或组件。单元测试的目标是确保每个单元都能按照预期的方式工作,并且能够与其他单元协调工作。
对于单元测试中单元的含义,要根据实际情况去判定其具体含义。例如,在C语言中,单元通常指的是一个函数;在Java中,单元通常指的是一个类;在图形化的软件中,单元可能指的是一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。

我们在需要单元测试的类中右键选择generate。

在这里插入图片描述

选择 Test。

在这里插入图片描述
在这里插入图片描述
当点击ok之后,就会生成一个单元测试代码:

package com.example.mybatis20231226.Mapper;import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;@Slf4j
class UserInfoMapperTest {@BeforeEachvoid setUp() {}@AfterEachvoid tearDown() {}@Testvoid selectAll() {}
}

然后我们只需要完成单元测试中函数的实现的可以了。

package com.example.mybatis20231226.Mapper;import com.example.mybatis20231226.Model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;import java.util.List;import static org.junit.jupiter.api.Assertions.*;@Slf4j
class UserInfoMapperTest {//通过@Autowired注解拿到Bean@Autowiredprivate UserInfoMapper userInfoMapper;@BeforeEachvoid setUp() {log.info("selectAll 执行之前");}@AfterEachvoid tearDown() {log.info("selectAll 执行之后");}@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}
}

当我们运行会发现,运行出现了问题:

在这里插入图片描述

为什么会出现这种错误呢?出现这种错误就是因为 Spring 环境没有正确启动。所以我们需要在类上加上类注解 @SpringBootTest 来为这个类加上 Spring 上下文管理。

@SpringBootTest
@Slf4j
class UserInfoMapperTest {
}
package com.example.mybatis20231226.Mapper;import com.example.mybatis20231226.Model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
@Slf4j
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@BeforeEachvoid setUp() {log.info("selectAll 执行之前");}@AfterEachvoid tearDown() {log.info("selectAll 执行之后");}@Testvoid selectAll() {List<UserInfo> list = userInfoMapper.selectAll();log.info(list.toString());}
}

在这里插入图片描述

在这里插入图片描述
通过这种单元测试就达到了测试代码功能的作用,那么 MyBatis 的详细基础操作我就放在下一篇文章了。

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

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

相关文章

https证书配置过程

相关网址&#xff1a; FreeSSL首页 - FreeSSL.cn一个提供免费HTTPS证书申请的网站 ACME v2证书自动化快速入门 acme.sh简单教程-CSDN博客

2012 关闭Windows Defender

使用“Win R”组合键打开运行窗口&#xff0c;输入“gpedit.msc”命令&#xff0c;按回车键进入组策略编辑器。在组策略编辑器中&#xff0c;依次点击“计算机配置”-“管理模板”-“Windows组件”-“Windows Defender”。在右侧找到“关闭Windows Defender”选项&#xff0c;…

2023-12-16 LeetCode每日一题(统计区间中的整数数目)

2023-12-16每日一题 一、题目编号 2276. 统计区间中的整数数目二、题目链接 点击跳转到题目位置 三、题目描述 给你区间的 空 集&#xff0c;请你设计并实现满足要求的数据结构&#xff1a; **新增&#xff1a;**添加一个区间到这个区间集合中。 **统计&#xff1a;**计算…

爬虫引流(简单实现这个功能)

下面实现的这种方式过于简单&#xff0c;如果对爬虫有过了解的读者可以直接滤过这篇博客&#xff0c;因为确实没什么用。 实现原理 因为在你使用 request 获取网页源代码的过程中&#xff0c;实际上是通过向服务器发送请求来获取网页内容的。每一次请求都会被服务器记录下来&…

QGIS003:【08选择工具栏】-按范围选择、按属性选择、按位置选择

摘要:QGIS工程工具栏包括按范围选择、按属性选择、按位置选择、取消选择等选项,本文介绍各选项的基本操作。 实验数据: 链接:https://pan.baidu.com/s/15GfuR15CxA2OQzURjmjwaQ?pwd=u8sf 提取码:u8sf 一、按范围选择 有矩形框选、多边形选择、手绘选择以及按半径扩展…

【AIGC风格prompt】风格类绘画风格的提示词技巧

风格类绘画风格的提示词展示 主题&#xff1a;首先需要确定绘画的主题&#xff0c;例如动物、自然景观、人物等。 描述&#xff1a;根据主题提供详细的描述&#xff0c;包括颜色、情感、场景等。 绘画细节&#xff1a;描述绘画中的细节&#xff0c;例如表情、纹理、光影等。 场…

【C++】手撕 Vector类

目录 1&#xff0c;vector类框架 2&#xff0c;vector () 3&#xff0c;pinrt() 4&#xff0c;vector(int n, const T& value T()) 5&#xff0c;vector(const vector& v) 6&#xff0c;vector(InputIterator first, InputIterator last) 7&#xff0c;~vector…

Windows磁盘空间占用分析工具-WizTree

文章目录 WizTree作用WizTree树状分析图WizTree特点获取网址 WizTree作用 平时我们电脑用久了&#xff0c;产生很多文件&#xff0c;导致盘符空间不足&#xff0c;但是不知道那些文件占用比较多&#xff0c;这就需要磁盘空间分析工具-WizTree来分析文件占用情况 WizTree树状分…

计算机组成原理实训

文章目录 一、指令操作1、PC程序计数器2、目标编码3、总线规则4、算数运算5、逻辑运算6、源编码7、微变址 二、编码和微地址1、指令操作2、我的操作 问题描述 一、指令操作 1、PC程序计数器 PC装载&#xff08;E/M IP 00&#xff09;&#xff1a; 当 E/M IP 设置为 00 时&…

spring-session升级之坑

项目场景&#xff1a; 因为某些组件低版本存在漏洞问题&#xff0c;本次对项目的springboot版本从1.x升级到了2.x&#xff0c;因为其他相关的中间件也随着一起升级&#xff0c;在升级最后发现项目用户信息无法获取到了。 问题描述 接口获取用户信息报错&#xff0c;获取用户信…

进位模拟数位拆分和最大公约数最小公倍数

一、进位模拟与数位拆分 1、AB 100以内的A B问题 题目描述&#xff1a; 小明只认识100以内的正整数&#xff0c;如果大于100的正整数&#xff0c;他只会拿这个数的后两位做运算。 输入 每行两个整数分别为A和B&#xff0c;中间以空格分开&#xff0c;数据有多组。 输出 输出小…

【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点

ROS2第一个节点 引言1 认识ROS2节点1.1 节点之间的交互1.2 节点的命令行指令1.3 工作空间1.4 功能包1.4.1 功能包获取安装1.4.2 功能包相关的指令 ros2 pkg 2 ROS2构建工具—Colcon2.1 安装Colcon2.2 测试编译2.3 Colcon其他指令 3 使用RCLPY编写节点3.1 创建Python功能包3.2 编…

java初始化map的四种方式

第一种 最常见的方式(新建Map对象) public class Demo{ private static final Map<String, String> myMap new HashMap<String, String>(); static{myMap.put("a", "b"); myMap.put("c", "d"); } } 1234567第二种…

浏览器事件循环

一、浏览器的进程模型 浏览器是一个多进程多线程的应用程序&#xff0c;浏览器内部工件极其复杂&#xff0c;为了减少连环崩溃的几率&#xff0c;当启动浏览器后&#xff0c;它会自动启动多个进程&#xff0c;其中&#xff0c;有以下主要进程&#xff1a; 1.浏览器进程 浏览…

2023-12-14 LeetCode每日一题(用邮票贴满网格图)

2023-12-14每日一题 一、题目编号 2132. 用邮票贴满网格图二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stam…

git常用命令详解

git常用命令详解 Git 是一个分布式版本控制系统&#xff0c;用于追踪文件的变化并协作开发。以下是一些常用的 Git 命令及其详细说明&#xff1a; 初始化仓库&#xff1a; git init说明&#xff1a; 在当前目录下初始化一个新的 Git 仓库。 克隆仓库&#xff1a; git clone &…

快速上手:探索Spring MVC的学习秘籍!

SpringMVC概述 1&#xff0c;SpringMVC入门案例1.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器访问步骤10:修改Controller返回值解…

单片机数据发送程序

#include<reg51.h> //包含单片机寄存器的头文件 /***************************************************** 函数功能&#xff1a;向PC发送一个字节数据 ***************************************************/ void Send(unsigned char dat) { SBUFdat; whil…

【新手向】VulnHub靶场MONEYBOX:1 | 详细解析

MONEYBOX:1 安装靶机 作为一名新手&#xff0c;首先要配置好环境&#xff0c;才能进行下一步的操作。 将下载的ova文件导入VirtualBox。 VirtualBox下载地址&#xff1a;https://www.oracle.com/cn/virtualization/technologies/vm/downloads/virtualbox-downloads.html 选择…