一、MyBatis 是什么?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎 所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和 映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记 录。
简单来说 MyBatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具。
针对 “MyBatis 是一款优秀的持久层框架” 进行分析和补充:
MyBatis也是一个 ORM (Object Relational Mapping,即对象关系映射)框架。
在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动的完成数据与对象的相互转换:
- 将输入数据(即传入对象)+ SQL 映射成原生 SQL。
- 将结果集映射为返回对象,即输出对象。\
ORM 把数据库映射为对象:
- 数据库表(table) --> 类(class)
- 记录(record,行数据) --> 对象(object)
- 字段(field) --> 对象的属性(attribute)
一般的 ORM 框架,会将数据库模型的每张表都映射为一个 Java 类。
即,使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换。
即:MyBatis 可以当作是一座 “桥梁”:
将数据库 和 程序,映射起来。
MySQL 和 MyBatis 是不一样的:
MySQL 提供了一个 数据存取(数据管理)的软件。
而 MyBatis 是一个 “中间桥梁”,用于连接程序和数据库,建立映射关系,进行 数据操作 的中间层(持久层)。
二、为什么要学习 MyBatis
对于后端开发来说,程序是由以下两个重要的部分组成的:
- 后端程序
- 数据库
而这两个重要的组成部分要通讯,就要依靠数据库连接工具,那数据库连接工具有哪些?比如之前我们 学习的 JDBC,还有今天我们将要介绍的 MyBatis,那已经有了 JDBC 了,为什么还要学习 MyBatis?
这是因为 JDBC 的操作太繁琐了,我们回顾一下 JDBC 的操作流程:
- 创建数据库连接池
DataSource
- 通过
DataSource
获取数据库连接Connection
- 编写要执行带
?
占位符的SQL
语句 - 通过
Connection
及SQL
创建操作命令对象Statement
- 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
- 使用
Statement
执行SQL
语句 - 查询操作:返回结果集
ResultSet
,更新操作:返回更新的数量 - 处理结果集
- 释放资源
JDBC 操作示例回顾
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class TestJDBC {
public static void main(String[] args) throws SQLException {
//让用户手动输入数据到数据库中
Scanner scanner = new Scanner(System.in);
//1. 创建数据源
DataSource dataSource = new MysqlDataSource();
//设置数据库所在的地址
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
//设置登录数据库的用户名
((MysqlDataSource)dataSource).setUser("root");
//设置登录数据库的密码
((MysqlDataSource)dataSource).setPassword("1234");
//2. 让代码和数据库服务器之间建立连接
Connection connection = dataSource.getConnection();
//3. 操作数据库,以插入数据为例
// 关键所在:构造一个 SQL 语句
// 在 JDBC 中构造 SQL 语句,不必带上 ;
// ; 只是在命令行中用来区分不同的语句,现在是直接在代码中操作
String sql = "insert into JDBC values(1,'张三')";
// 此处光是一个 String 类型的 sql 还不行,需要把这个 String 包装成一个 “语句对象”
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//用户手动输入数据
System.out.println("请输入 ID:");
int id = scanner.nextInt();
System.out.println("请输入 姓名:");
String name = scanner.next();
//? 相当于告诉 java程序,这两个字段的值 还不确定,此时就使用 ? 先占个位置
// 再使用 PreparedStatement 的 setXXX 方法 进行替换,这里的setXXX方法很多,需要让这里的方法和数据库的列的类型匹配
String sql2 = "insert into JDBC values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql2);
//进行替换操作
statement.setInt(1,id); //下标从 1 开始计算,把第一个 ? 替换成 id 这样的值
statement.setString(2,name);
System.out.println("statement: " + statement); //通过这个打印操作,可以看到拼装好之后的 SQL 长啥样
//4. 执行 SQL
// SQL 里面如果是 insert, update, delete ,都使用 executeUpdate 方法,
// SQL 里面如果是 select,则使用 executeQuery 方法
// 返回值就表示这个操作,影响到了几行,就相当于在控制台里输入 sql 之后,得到的数字
int ret = preparedStatement.executeUpdate();
int ret2 = statement.executeUpdate();
System.out.println(ret);
System.out.println(ret2);
//5. 此时 SQL 已经执行完毕,然后还需要释放资源
preparedStatement.close();
statement.close();
connection.close();
}
}
从上述代码和操作流程可以看出,对于 JDBC 来说,整个操作非常的繁琐,我们不但要拼接每一个参 数,而且还要按照模板代码的方式,一步步的操作数据库,并且在每次操作完,还要手动关闭连接等, 而所有的这些操作步骤都需要在每个方法中重复书写。于是我们就想,那有没有一种方法,可以更简单、更方便的操作数据库呢?
答案是肯定的,这就是我们要学习 MyBatis 的真正原因,它可以帮助我们更方便、更快速的操作数据库。
三、怎么学 MyBatis
MyBatis 学习只分为两部分:
- 配置 MyBatis 开发环境。
- 使用 MyBatis 模式和语法操作数据库。
1. 创建 MyBatis 项目
准备工作:创建数据库 和 数据表
-- 创建数据库
drop database if exists Mybatis;
create database Mybatis DEFAULT CHARACTER SET utf8;
-- 使⽤数据数据
use Mybatis;
-- 创建表[⽤户表]
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
);
-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(
vid int primary key,
`title` varchar(250),
`url` varchar(1000),
createtime datetime default now(),
updatetime datetime default now(),
uid int
);
-- 添加⼀个⽤户信息
INSERT INTO `Mybatis`.`userinfo` (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48',
1);
-- ⽂章添加测试数据
insert into articleinfo(title,content,uid)
values('Java','Java正⽂',1);
-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java
title','http://www.baidu.com',1);
将上面的代码复制到本地的 MySQL。
1.1 添加 MyBatis 相关依赖
这里会涉及两个场景:
- 项目创建的时候,引入 MyBatis 相关依赖。
- 老项目添加 MyBatis。
1. 新建一个 MyBatis 项目
- 创建新项目:
\
- MyBatis 项目是建立在 Spring MVC 项目上的,因此,下面三个框架依赖必不可少:
\
- 添加 MyBatis 项目:
\
- 引入可驱动的数据库:
- 点击
finish
即可完成。
2. 老项目中引入 MyBatis 相关依赖
使用 Edit Starter
插件进行添加。
在 pom.xml
文件中的 dependencies
标签中,找到一个空行(人造一个也行),鼠标右击,选择 generate
:
下面为获取依赖的官方网址:
选择要添加的依赖:
\
\
1.2 配置数据库连接字符串
不要立即启动项目,否则就会报错:
\
- 在
resources
下创建三个.yml
文件
(现在的学习还不会涉及到生产环境)
- 配置开发环境配置文件:
注意:关于 driver-class-name
中所写的驱动名称
- 驱动名称:我们使用的是 MySQL,因此我们填写的是 MySQL 的驱动名称。
- 如果使用的 MySQL 是
5.x
之前的版本,则用com.mysql.jdbc.Driver
。
如果版本大于5.x
,则用com.mysql.cj.jdbc.Driver
。
\
- 在主配置文件中激活开发环境
\
此时启动项目后就不会报错了:
\
1.3 配置 MyBatis 保存的 xml 的目录
MyBatis 有两种操作方法:
- 使用
xml
的形式。 - 注解。(MyBatis 3.1 版本之后提供)
但是,注解的方式并不好用,我们主要还是关注 xml
形式的操作。
- 一般我们在
resources
目录下,创建一个子目录,来存放xml
文件:
\
- 由于此配置是公共的,所以我们在主配置文件配置 MyBatis 的 xml 保存路径:
\
四、使用 MyBatis 的操作模式操作数据库
MyBatis 的操作模式
MyBatis 的操作模式,包含两个部分:
- Interface(接口,里面是方法的定义)
- xml 文件(对 方法 的实现,使用 SQL 语句)
在 Interface 接口中会加一个注解,这个注解是MyBatis里的注解 @Mapper
,将普通的接口变为 MyBatis 里面的接口,将接口里面的方法映射进 xml
文件。
\
MyBatis 查询:实现一个根据用户id来查询用户信息的操作
数据库中已经创建好的表:
\
1. 定义接口
现在根目录底下创建几个包:
- model 与数据库交互
- controller 与前端交互
- server 决定调用哪些映射方法
- mapper 操作数据,实现映射