1. MyBatis 是什么
MyBatis 是一款优秀的持久层框架
MyBatis 也是一个 ORM (Object Relational Mapping)框架,即对象关系映射
它支持自定义 SQL、存储过程以及高级映射
MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
MyBatis 是更简单完成程序和数据库交互的工具
2. 为什么学 MyBatis
因为对于 JDBC 来说,整个操作的步骤非常繁琐,所以学习 MyBatis 就是为了帮助我们更方便。更快速的操作数据库
3. 怎么学 MyBatis
学习 MyBatis 两步走
搭建 MyBatis 开发环境
使用 MyBatis 模式和语法操作数据库
4. 创建 MyBatis 项目
MyBatis 是 ORM 框架,也就是对象关系映射,在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,从而自动的完成数据与对象的互相转换
将输入数据(传入对象)+ SQL ——》映射为 原生 SQL
将结果集 ——》映射为 返回对象(输出对象)
ORM 把数据库映射为对象:
数据库表 ——》 映射为 类
记录(行数据) ——》映射为 对象
字段 ——》 映射为 对象的数据
一般 ORM 框架会将数据库模型的每张表都映射为一个 Java 类,也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换
4.1 创建数据库和数据表
-- 创建数据库
dropdatabaseifexists mycnblog;
createdatabase mycnblog DEFAULTCHARACTERSET utf8mb4;
-- 使⽤数据数据
use mycnblog;
-- 创建表[⽤户表]
droptableifexists userinfo;
createtable userinfo(
id intprimarykeyauto_increment,
username varchar(100) notnull,
passwordvarchar(32) notnull,
photo varchar(500) default'',
createtime datetimedefault now(),
updatetime datetimedefault now(),
`state`intdefault1
) defaultcharset'utf8mb4';
-- 创建⽂章表
droptableifexists articleinfo;
createtable articleinfo(
id intprimarykeyauto_increment,
title varchar(100) notnull,
content textnotnull,
createtime datetimedefault now(),
updatetime datetimedefault now(),
uid intnotnull,
rcount intnotnulldefault1,
`state`intdefault1
)defaultcharset'utf8mb4';
-- 创建视频表
droptableifexists videoinfo;
createtable videoinfo(
vid intprimarykey,
`title`varchar(250),
`url`varchar(1000),
createtime datetimedefault now(),
updatetime datetimedefault now(),
uid int
)defaultcharset'utf8mb4';
-- 添加⼀个⽤户信息
INSERTINTO`mycnblog`.`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);
-- ⽂章添加测试数据
insertinto articleinfo(title,content,uid)
values('Java','Java正⽂',1);
-- 添加视频
insertinto videoinfo(vid,title,url,uid) values(1,'java title','http://ww
w.baidu.com',1);
4.2 添加 MyBatis 相关依赖
(1)新项目添加 MyBatis 依赖
(2)老项目添加 MyBatis 依赖
4.3 配置数据库的连接信息
# 开发环境配置文件
# 配置数据库连接
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8
username: root
password: 111111
driver-class-name: com.mysql.cj.jdbc.Driver
4.4 配置 MyBatis 的 XML 保存路径
# 配置 mybatis.xml 保存路径
mybatis:
mapper-locations: classpath:mybatis/**Mapper.xml
5. 使用 MyBatis 的操作模式操作数据库
5.1 创建实体类 & 添加 mapper 接口
(1)创建 model 文件夹中 实体类 Userinfo
/**
* model 中的实体类
* @Data中包含变量的 get set toString
*/
@Data
publicclassUserinfo {
privateintid;
privateStringusername;
privateStringpassword;
privateStringphoto;
privateStringcreatetime;
privateStringupdatetime;
privateintstate;
}
(2)创建 mapper 文件夹 中的 UserMapper 接口
/**
* 接口加 @Mapper 后,此时这个接口就是 MyBatis interface
* 参数加 @Param 后,就相当于给这个参数改了新的名字
*/
@Mapper
publicinterfaceUserMapper {
// 根据用户 id 查询用户
publicUserinfogetUserById(@Param("id") Integerid);
}
5.2 创建 XML 实现上面的接口
在resources 中创建 mybatis 文件夹,在 mybatis 中创建 UserMapper.xml
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 是设置要实现的接口的具体包名 + 类名-->
<mappernamespace="com.example.mybatisdome1.mapper.UserMapper">
<selectid="getUserById"resultType="com.example.mybatisdome1.model.Userinfo">
select * from userinfo where id=${id}
</select>
</mapper>
5.3 添加 Service
创建 service 文件夹,添加服务层 UserService 类
@Service
publicclassUserService {
@Resource
privateUserMapperuserMapper;
publicUserinfogetUserById(Integerid) {
returnuserMapper.getUserById(id);
}
}
5.4 添加 Controller
创建 controller 文件夹,添加控制层 UserController 类
// @RestController = @Controller + @ResponseBody
@RestController
@RequestMapping("/user")
publicclassUserController {
@Autowired
privateUserServiceuserService;
@RequestMapping("/getuserbyid")
publicUserinfogetUserById(Integerid) {
if(id==null) returnnull;
returnuserService.getUserById(id);
}
}
运行程序
5.5 开启 MyBatis SQL 打印
在 application-dev.yml 中
# 开启 MyBatis SQL 打印
logging:
level:
com.example.mybatisdome1: debug
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
6. MyBatis 框架交互流程
前端程序通过 Ajax 访问,Ajax 的信息到达控制器 Controller 这一层
控制器就会进行参数的校验,校验参数没问题之后,然后接下来就是将数据发送给服务层
服务层只是组织者(相当于代理,就是管理调用几个接口,进行接口的排序),接下来就是调用 Mapper
调用两个 Mapper(InterFace 进行声明,XML 进行实现),最终在实现时因为加了 @Mapper,所以 MyBatis 就会将 InterFace 和 xml 进行关联,最终会将方法中具体的执行 SQL,生成为原始的 SQL 语句,并且 MyBatis 会调用 JDBC
MyBatis 是基于 JDBC 的,MyBatis 在执行时会生成 JDBC 的代码和相应 SQL,然后再通过 JDBC 的方式,调用数据库,最终将结果返回给服务层,服务层再将结果返回给控制层,最终再由控制层将结果返回给前端