文章目录
- 一、概念
- 二、为什么学 MyBatis
- 三、怎么学 MyBatis
- 四、第⼀个MyBatis查询
- 4.1 MyBatis 在整个框架中的定位
- 4.2 准备:创建库和表
- 4.3 配置 MyBatis 开发环境
- 4.3.1 添加MyBatis框架⽀持
- 4.3.1.1 ⽼项⽬添加支持
- 扩展:在⽼项⽬中快速添加框架 - EditStarters插件
- 4.3.1.2 新项⽬添加MyBatis支持
- 4.3.2 配置连接字符串和 MyBatis xml 保存路径
- 扩展:添加 SQL 日志打印
- 4.4 添加业务代码
- 4.4.1 添加实体类层(model)
- 4.4.2 添加 mapper 接⼝
- 4.4.3 添加 UserInfoMapper.xml
- 扩展:Mapper 接口中的方法与 XML文件中的具体实现快速跳转 - MabatisX
- 4.4.4 添加 Service
- 4.4.5 添加 Controller
一、概念
MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的记录。MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换
简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具
二、为什么学 MyBatis
对于后端开发来说,程序是由以下两个重要的部分组成的: 后端程序和数据库
⽽这两个重要的组成部分要通讯,就要依靠数据库连接⼯具,那数据库连接⼯具有哪些?⽐如之前我们学习的 JDBC,还有今天我们将要介绍的 MyBatis,那已经有了 JDBC 了,为什么还要学习 MyBatis?这是因为 JDBC 的操作太繁琐了,我们回顾⼀下 JDBC 的操作流程:
- 创建数据库连接池 DataSource
- 通过 DataSource 获取数据库连接 Connection
- 编写要执⾏带 ? 占位符的 SQL 语句
- 通过 Connection 及 SQL 创建操作命令对象 Statement
- 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
- 使⽤ Statement 执⾏ SQL 语句
- 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量
- 处理结果集
- 释放资源
想要了解 JDBC 大家可以参考这一篇博客 !!
对于 JDBC 来说,整个操作⾮常的繁琐,我们不但要拼接每⼀个参数,⽽且还要按照模板代码的⽅式,⼀步步的操作数据库,并且在每次操作完,还要⼿动关闭连接等,⽽所有的这些操作步骤都需要在每个⽅法中重复书写。于是我们就想,那有没有⼀种⽅法,可以更简单、更⽅便的操作数据库呢?
答案是肯定的,这就是我们要学习 MyBatis 的真正原因,它可以帮助我们更⽅便、更快速的操作数据库
三、怎么学 MyBatis
MyBatis 学习只分为两部分:
- 配置 MyBatis 开发环境;
- 使⽤ MyBatis 模式和语法操作数据库
四、第⼀个MyBatis查询
4.1 MyBatis 在整个框架中的定位
开始搭建 MyBatis 之前,我们先来看⼀下 MyBatis 在整个框架中的定位,框架交互流程图:
在前面我们提到过 MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:
- 将输⼊数据(即传⼊对象)+SQL 映射成原⽣ SQL
- 将结果集映射为返回对象,即输出对象
ORM 把数据库映射为对象:
- 数据库表(table)–> 类(class)
- 记录(record,⾏数据)–> 对象(object)
- 字段(field) --> 对象的属性(attribute)
⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换,接下来我们来看 MyBatis 的使⽤吧
4.2 准备:创建库和表
具体 SQL 如下:创建 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 '',
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
);
4.3 配置 MyBatis 开发环境
4.3.1 添加MyBatis框架⽀持
添加 MyBatis 框架⽀持分为两种情况:⼀种情况是对⾃⼰之前的 Spring 项⽬进⾏升级,另⼀种情况是创建⼀个全新的 MyBatis 和 Spring Boot 的项⽬,下⾯我们分别来演示这两种情况的具体实现
4.3.1.1 ⽼项⽬添加支持
如果是在⽼项⽬中新增功能,添加框架⽀持:
<!-- 添加 MyBatis 框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- 添加 MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
添加了 MyBatis 之后,为什么还需要添加 MySQL 驱动呢?
MyBatis 是后端程序和数据库连接的桥梁,它是一个代理!但具体连接的实现还得是通过具体的数据库驱动 !不⽌有 MySQL,还有 SQLServer、DB2 等等…因此这两个都是需要添加的
扩展:在⽼项⽬中快速添加框架 - EditStarters插件
直接在插件中搜索如下并安装,成功后重启 IDEA
EditStarters 插件的使⽤⽅法:
-
在 pom.xml 中 右击鼠标,点击 Generate 后点击 Edit Starters
-
跳转到如下窗口后,直接在SQL模块中选择 MyBatis框架支持 和 MySQL驱动 即可
4.3.1.2 新项⽬添加MyBatis支持
Mybatis新项⽬创建和创建 Spring Boot 项⽬一样,只是需要额外添加依赖就行,如下图所示:
4.3.2 配置连接字符串和 MyBatis xml 保存路径
此步骤需要在配置文件如 application.yml 中进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML 保存路径的配置
1. 配置连接字符串
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: ****
password: ****
# 驱动名称
driver-class-name: com.mysql.cj.jdbc.Driver
注意事项: 如果使⽤ MySQL 是 5.x 之前的使⽤的是“com.mysql.jdbc.Driver”,如果是⼤于 5.x 使⽤的是“com.mysql.cj.jdbc.Driver”
2. 配置 MyBatis xml 保存路径
MyBatis 的 XML文件中保存的是查询数据库的具体 SQL操作,而XML 具体保存路径配置如下:
# 配置 mybatis.xml 保存路径 在 resources/mybatis 创建所有表的 xml ⽂件
mybatis:
mapper-locations: classpath:mybatis/**Mapper.xml
注意:上述格式表示 在 mybatis 目录下,后缀为Mapper.xml 的文件都是 mybatis.xml文件,用来实现接口中声明的方法
配置好之后就需要在配置的路径下创建规定目录,如下:
具体的 xml 文件,我们后面再讲 !!
扩展:添加 SQL 日志打印
在上述配置文件中补充如下:
#设置日志级别
logging:
level:
com:
example:
demo: debug
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.4 添加业务代码
下⾯按照后端开发的⼯程思路,也就是下⾯的流程来实现 MyBatis 查询⽤户的功能
4.4.1 添加实体类层(model)
规范业务代码,先创建 model 层对应的包(后续每一层如此),再添加⽤户的实体类 UserInfo如下
package com.example.demo.model;
import lombok.Data;
@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;
}
注意: 用户实体类中的属性要和数据库中用户表的字段对应 !!
4.4.2 添加 mapper 接⼝
数据持久层的接⼝定义:
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface UserInfoMapper {
//以下的 @Param 建议加上,不然某些场景读取不到参数
public UserInfo getUserById(@Param("id") Integer ID);//表示 参数ID是@Param读取的 id,即xml文件中${id}中的 id
}
注意:
- 必须添加 @Mapper 注解,声明这里的接口是 Mapper 接口,定义方法声明,具体方法实现交给对应的 xml 文件
- @Param 建议加上,不然某些场景读取不到参数
- 上述参数ID是@Param读取的 id,即xml文件中${id}中的 id
4.4.3 添加 UserInfoMapper.xml
上面我们讲过,所有的xml文件都是保存在如下目录,其中UserInfoMapper.xml 是来实现 UserInfoMapper 接口中所有声明的方法 !!
UserInfoMapper.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">
<!--namespace 需要实现的接口的具体包名加接口名-->
<mapper namespace="com.example.demo.mapper.UserInfoMapper">
<!-- select id中的id表示要实现接口中的具体方法 resultType:表示查询返回的类型,也就是开头定义的实体类-->
<select id="getUserById" resultType="com.example.demo.model.UserInfo">
select *
from userinfo
where id = #{id};
</select>
</mapper>
上述格式是固定的,下面我们对其中的标签属性进行解释:
-
< mapper >标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接⼝的全限定
名,包括全包名.类名。 -
< select > 查询标签:是⽤来执⾏数据库的查询操作的:
id:是和 Interface(接⼝)中定义的⽅法名称⼀样的,表示对接⼝的具体实现⽅法。
resultType:是返回的数据类型,也就是开头我们定义的实体类
扩展:Mapper 接口中的方法与 XML文件中的具体实现快速跳转 - MabatisX
细心的你可能发现了代码中出现的小鸟 !! 它就是 MabatisX 插件,能够实现快速跳转 !
直接在 插件中下载安装即可使用 !!
4.4.4 添加 Service
服务层的作用是去调用并组装接口的 !服务层代码实现如下:
package com.example.demo.service;
import com.example.demo.mapper.UserInfoMapper;
import com.example.demo.model.UserInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserService {
@Resource
private UserInfoMapper userInfoMapper;
public UserInfo getUserById(Integer ID){
return userInfoMapper.getUserById(ID);
}
}
4.4.5 添加 Controller
Controller 层是验证前端传来的参数 !
package com.example.demo.controller;
import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getuser")
public UserInfo getUserById(Integer ID) {
if (ID == null) {
return null;
}
return userService.getUserById(ID);
}
}
以上代码写完,整个 MyBatis 的查询功能就实现完了,我们通过 URL 访问查询 id为 41 的用户信息,如下:
由此可见,成功的查询到了 数据库中的用户信息 !!以上就通过 Mybatis 实现了一个简单的用户查询功能 !!