MyBatis 之一(概念、创建项目、操作模式、交互流程)
1. MyBatis 是什么
-
MyBatis 是一款优秀的持久层框架
-
MyBatis 也是一个 ORM (Object Relational Mapping)框架,即对象关系映射
-
它支持自定义 SQL、存储过程以及高级映射
-
MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
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://www.baidu.com',1);
4.2 添加 MyBatis 相关依赖
(1)新项目添加 MyBatis 依赖
(2)老项目添加 MyBatis 依赖
4.3 配置数据库的连接信息
# 开发环境配置文件# 配置数据库连接spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8username: rootpassword: 111111driver-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*/@DatapublicclassUserinfo {privateintid;privateStringusername;privateStringpassword;privateStringphoto;privateStringcreatetime;privateStringupdatetime;privateintstate;}
(2)创建 mapper 文件夹 中的 UserMapper 接口
/*** 接口加 @Mapper 后,此时这个接口就是 MyBatis interface* 参数加 @Param 后,就相当于给这个参数改了新的名字*/@MapperpublicinterfaceUserMapper {// 根据用户 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 类
@ServicepublicclassUserService {@ResourceprivateUserMapperuserMapper;publicUserinfogetUserById(Integerid) {returnuserMapper.getUserById(id);}}
5.4 添加 Controller
创建 controller 文件夹,添加控制层 UserController 类
// @RestController = @Controller + @ResponseBody@RestController@RequestMapping("/user")publicclassUserController {@AutowiredprivateUserServiceuserService;@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: debugmybatis: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 的方式,调用数据库,最终将结果返回给服务层,服务层再将结果返回给控制层,最终再由控制层将结果返回给前端