MyBatis 框架的思想及其第一次使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MyBatis 框架的思想及其第一次使用

引言



ORM 框架


ORM(Object Relational Mapping):对象关系映射。

MyBatis 是一个 ORM 框架。在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动地完成数据与对象的互相转换。


a1b2314e88374dcabf0b2f1928567f29.png


MyBatis 核心


MyBatis 的核心有两个:一是接口,二是 " xml 文件 ".

此外,我认为还有一个较为核心的东西就是实体类。


映射关系:


① 数据表 => 实体类

② 一条记录 => 一个对象

③ 表中字段 => 对象的属性


b86182b5199642aa96470d400d5e974d.png


MyBatis 的第一次使用



一、创建一个 Spring MVC 项目


创建一个 Spring MVC 项目,不再多说。


但当我们真正用到 MyBatis 的时候,就需要选择下面的依赖:


一个是 " MyBatis Framework ",另一个是 " MySQL Driver "

前者表示框架,后者表示驱动 ( 根据你需要连接的数据库商家进行选择 )


8a00297a5b274e1aa9ef12f826fd10a8.png


二、搭好配置文件



概览步骤


步骤:

步骤1:创建好配置文件 ( yml / properties )

步骤2:选择运行环境 ( 开发环境 / 运行环境 ),【下面步骤以开发环境为例】

步骤3:在配置文件中,连接数据库

步骤4:在配置文件中,开启 MyBatis SQL 打印,以便我们日常测试

步骤5:在配置文件中,配置 " xml 文件 " 保存路径


18548f5caadb46809b0679a2a5d9ca3d.png


步骤1


创建 " application.yml "


步骤2


创建 " application-dev.yml " 和 " application-prod.yml "


步骤3


连接数据库固定代码:


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


注意事项:


① 使用 MyBatis 连接数据库是写在配置文件中的,它是系统类别的配置文件,所有的格式都是固定写法。


② 以往我们使用 JDBC 编程的时候, " url ", " username ", " password " 这三个属性是必不可少的,现在呢,我们需要额外添加一个 " driver-class-name " 属性,它表示需要连接哪种数据库的名称。如果你需要连接的是 Oracle 数据库,就填写 Oracle 的专属名称;如果你需要连接的是 MySQL数据库,就填写 MySQL 的专属名称。


步骤4


开启 MyBatis SQL 打印日志


logging:
  level:
    com:
      example:
        demo: debug
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


注意事项:

这一步不是必须的,但能够方便于我们测试,我认为初学者必须要配置。


步骤5


配置 " xml 文件 " 路径:


mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml


注意事项:


① 这里的配置代码,应该写在公共的 " application.yml " 文件下,因为不论是开发环境,还是生产环境,都需要这段公共代码。


② 前文提到,MyBatis 的核心就在于接口和 " xml 文件 " ,所以 " xml 文件 " 就应该放置在 【resources】目录下。此外,由于日后我们的 " xml 文件 " 在一个项目中不止一份,所以我们应该创建一个【mybatis】目录。


③ 这里配置 " xml 文件 " 是一种标准写法,它告知了 MyBatis 框架 " xml 文件 " 是在哪个目录底下的哪种格式,如下图所示:


707bf622a28249a7a3f21c376d562c2c.png

总览配置


由于我们暂时不涉及云服务器上的数据库,所以我们只展示 " 公共的 yml 文件 " 和 " 开发环境的 yml 文件 ".


6bd6a9589cef4c6e9584295ed148620f.png


注意事项


① MyBatis 框架的配置既多又杂,很多写法都是固定的,这就像 " 1+1=2 " 一样,我们无需知道为什么,直接用就可以了,我们可以将这些零零碎碎的代码片段,放置我们的代码仓库中,方便我们后续使用。


② 从 0 到 1 是比较难的,尤其是这种搭配环境的事情,确实比较折腾人,但多做几次,就能够很好的熟悉整个过程。


三、正式查询数据库



概览步骤


步骤1:准备数据库

步骤2:根据数据库的字段,创建实体类

步骤3:创建 Mapper 接口

步骤4:创建 " xml 文件 "

步骤5:创建 Service 类

步骤6:创建 Controller 类


24818e901b7b405a9e7785fd3660bc8c.png


步骤1


准备数据库:

创建一个名为 " 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 '123.png',
    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
);
-- 添加一个用户信息
insert into userinfo (id, username, password, `state`) values (null, 'Jack', '123', 1);
insert into userinfo (id, username, password, photo, `state`) values (null, '李明', '321', '李明.png',  1);
insert into userinfo (id, username, password, `state`) values (null, 'Rose', '456', 1);
-- 文章添加测试数据
insert into articleinfo(title,content,uid) values ('C++','C++语法',1);
insert into articleinfo(title,content,uid) values ('Java','JavaWeb',2);
insert into articleinfo(title,content,uid) values ('Python','基本结构',3);


步骤2


根据数据库的字段,创建实体类:


535763e1c5d84dafb9e8745d927ce2e3.png


@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;
}


注意事项:


创建实体类的步骤非常关键! 我们需要仔细地将 Java 和 数据库对应起来。

① Java 实体类的类名应该和数据表的表名吻合。

② 实体类中的属性 (成员变量) 应该和表中的字段吻合。


为什么一定要这样做?


① 首先,这是一种标准。

② 其次,这里的实体类需要与项目中的 " xml " 文件、mapper 接口联系起来,只要其中一个环节出错,那么就会出现整个项目抛异常的情况,到那个时候,可能就不仅仅是代码层面的报错,也有可能是框架报错。所以,为了避免调试这样的麻烦事,我们不能随心所欲,我们应该与之前数据库设计好的那样去约定实体类。


步骤3


创建 Mapper 接口:


@Mapper
public interface UserMapper {
    // 根据用户 id 来查询某个用户的所有信息
    public UserInfo getUserById(@Param("id") Integer id);
}


步骤4


创建 " 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">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select * from userinfo where id = #{id}
    </select>
</mapper>


注意事项:


① " namespace " 属性,填入的是 Mapper 接口。( 需要具体到包名、接口名 )

② 如果我们进行查询操作,就使用 select 标签;修改操作,就使用 update 标签…


③ 在上面的 select 标签中," id " 属性表示 Mapper 接口中的方法名;" resultType" 属性表示当前查询操作返回的类型 ( 需要具体到包名、实体类名 )


④ 最重要的是 SQL 语句,它决定了我们是否真正对数据库执行了操作。下面的 #{id} 就表示 JDBC 中的问号,表示占位符。后面我还会介绍 ${id}.


select * from userinfo where id = #{id}
-- select * from userinfo where id = ?


备注: 在写上面的 SQL 语句之前,我们应该先在自己的数据库上进行原 SQL 的测试,如果原 SQL 没问题了,那么我们再变换形式写在 " xml " 文件中,这样不容易出错。


接口和 " xml 文件 " 的对应关系


接口和 " xml 文件 " 的对应关系是整个 MyBatis 的核心,虽然这里的关联关系并不难,但操作起来非常的乱,且容易出错,所以我们应该重视起来。


c1e54fba01ca45498af32dfb4bc91013.png



步骤5


创建 Service 类:


在 UserService 类中,我们采取 " 属性注入 " 的方式,将 " userMapper " 对象存入进来,之后就能使用接口中的方法了。


@Service
public class UserService {
    @Resource
    private UserMapper userMapper;
    public UserInfo getUserById(Integer id) {
        return userMapper.getUserById(id);
    }
}


备注: 属性注入不仅可以存入类,也可以存入接口。


步骤6


创建 Controller 类:


在 UserController 类中,我们依然采取 " 属性注入 " 的方式,将 " userService " 对象存入进来,之后就能使用类中的方法了。

在这里,我们明确了给前端返回的是一个数据,也明确了路由、传入参数。


@RestController
public class UserController {
    @Resource
    private UserService userService;
    @RequestMapping("/get_user")
    public UserInfo getUserId(Integer id) {
        if (id == null) return null;
        return userService.getUserById(id);
    }
}


注意事项


这里需要思考,我们为什么不使用 " Controller 类 " 直接调用 " Mapper 接口 ",而是让 " Service " 在中间插了一杠子?


① 首先,这是一个 Web 项目查询数据库的标准步骤。


② 其次,这样分层地拆分程序,能够更好地解耦合,也能够更好地为后端分工。


与前端交互的事情,就让 " Controller " 层去做,交互出了问题,直接看这一层。

调用接口的事情,就让 " Service " 层去做,出了问题,直接定位这一层。

查询数据库的事情,就让 " Mapper " 接口去做…


225a8a63c9f040669025d420d8dcc01e.png


四、查询结果验证



后端运行启动类,前端传入一个 id = 2 的参数,查询结果:


cf335977c1224a6ea97922df46a0564d.png

我们查看 MyBatis 日志文件:发现 #{id} 就是一个占位符,相当于一个问号,只有前端传入参数进来的时候,才会进行替换。


b2f7a062bc854c229e06cd3f35a0be71.png


Spring Boot 单元测试



定义


单元测试,就是指对软件中的最小可测试单元进行检查和验证的过程。

最小可测单元就是方法,方法无法再拆分了。


框架


一般来说,当我们成功创建一个 Spring Boot 项目的时候," pom.xml " 会自动为我们生成下面的依赖。


ce860bc73cf548248369073baa73d8ef.png


作用


① 单元测试可以非常简单、直观、快速地测试某一个功能是否正确。

② 使用单元测试可以帮我们在打包的时候,发现一些问题,因为在打包之前,所有的单元测试必须通过,否则就不能打包成功。

使用单元测试,在测试功能的时候,可以不污染连接的数据库,也就是可以不对数据库进行任何改变的情况下,进行测试。( 使用 " @Transactional " 注解实现 )


生成测试类步骤


步骤1: 在你需要进行测试的 类 / 接口 中,点击鼠标右键进行如下操作。

注意事项: 点击鼠标右键之前,我们鼠标必须要挪动到下面的红色框框中,否则就不会出现 " Test " 选项。


01a9d906c96d4e53a5ca57dc1b0f6fbc.png

步骤2: 勾选你需要测试的成员方法,其他的选项默认即可,框架会自动帮我们生成的。


d4e54f5d9e3b44898fde41b3f867809a.png


步骤3: 系统会自动帮我们生成一个测试类,在测试类中,有对应的同名测试方法。测试类的保存路径在 " 绿色的 java 文件下 " ,与 " 蓝色的 java 文件 " 保存形式很相似。


d512fe036b254a8c8687f4bc5b452f6d.png


点击方法启动,开始测试


@SpringBootTest // 表示当前单元测试运行在 Spring Boot 环境中
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    @Test
    void getUserById() {
        UserInfo userInfo = userMapper.getUserById(2);
        System.out.println("测试结果:" + userInfo);
    }
}


测试结果:


ca460d49a19f4e8a945968a2470e0c5f.png


注意事项:


① 这是 Spring Boot 的单元测试,所以需要添加 " @SpringBootTest " 注解。

② 使用 " 属性注入 " 的方式来存入对象,后续就可以拿到原类的方法了。

③ 属性注入时,既可以使用 " @Autowired " 注解,也可以使用 " @Resource " 注解。但前者放在专业版 IDEA 下时,软件会报错,但不影响测试运行。


总结



第一次使用 MyBatis 框架的时候,其实是比较难的。我认为,这个难点就是存在于折腾环境这件事上,并不是业务代码层面上的难点。关于配置环境,只要出现一点问题,就会出现意想不到的报错异常,看到你头皮发麻,所以,每次我们配置环境的时候,都需要按照标准写法来,不要随心所欲。只有环境搭建好了,才能真正地使用 SQL 语句。


然而,MyBatis 对 JDBC 进行了封装,只要我们有 JDBC 的基础,学习起来就很快了。最起码,思想层面我们就不用问更多为什么了。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
Java 数据库连接 Maven
后端框架学习-----mybatis(使用mybatis框架遇到的问题)
这篇文章总结了在使用MyBatis框架时可能遇到的几个常见问题及其解决方法,包括配置文件注册、接口绑定、方法名匹配、返回类型匹配、Maven资源导出、时区设置和字符编码问题。
|
24天前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
1月前
|
Java 数据库连接 mybatis
mybatis框架图
文章介绍了MyBatis框架的起源、发展和其作为持久层框架的功能,提供了MyBatis的框架图以帮助理解其结构和组件。
mybatis框架图
|
1月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
1月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
1月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
1月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
2月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
58 4
|
24天前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
12 0
|
30天前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
143 0