目录
引言
MyBatis 介绍
掌握两个点
在框架中的定位
创建数据库
配置 MyBatis
引入依赖
配置文件
创建实体类
构建 Mapper 层代码实现
添加 mapper 接口
添加 UserMapper.xml
实现 Service 层
实现 Controller 层
最终测验
阅读下面文章之前建议了解并创建一个 Spring Boot 项目
Spring Boot 项目的创建与使用
引言
- 所谓的 SSM 项目
- 现在其实指的就是 Spring Boot + Spring MVC + MyBatis
MyBatis 介绍
- MyBatis 是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
- 简单来说 Mybatis 是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具
掌握两个点
- 配置 MyBatis 开发环境
- 使用 MyBatis 模式和语法操作数据库
在框架中的定位
- 框架交互流程图
创建数据库
- 既然我们要讲解 MyBatis 的配置与使用,数据库的创建是必不可少的
- 此处我们在本机的 MySQL 数据库中创建一个 message 数据库
- 且在 message 数据库中再创建一个 user 表,用来存放用户信息
drop database if exists message; create database message; use message; create table user( id int primary key auto_increment, name varchar(20), age int ); insert into user values(null,"xiaolin",18); insert into user values(null,"maolin",20); insert into user values(null,"xiaomei",19);
配置 MyBatis
引入依赖
- 我们在 pom.xml 中引入相关依赖
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency>
配置文件
- 此处配置均在配置文件 application.properties 下添加
# 配置数据库连接 spring.datasource.url=jdbc:mysql://localhost:3306/message?characterEncoding=utf8&useSSL=false spring.datasource.username=root # 此处填你自己设置的数据库密码 spring.datasource.password=1111 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 配置连接字符串
# 配置 mybatis xml 的文件路径 mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
- 配置 MyBatis 中的 XML 路径
- 我们需在 resources/mapper 创建所有表的 xml 文件
注意:
- 当我们仅引入依赖,未配置上述文件
- 此时启动我们的 SSM 项目,一定会发生报错,即启动失败
- 数据库连接配置文件:该文件包含了连接数据库所需的信息,如数据库的 URL、用户名、密码等,如果未配置该文件,那么应用程序将无法连接到数据库,从而无法进行数据的读写操作
- mybatis xml 文件路径:该文件定义了 mybatis 的 SQL 映射语句和结果映射。如果未配置该文件,则 mybatis 将无法找到 SQL 映射语句,从而无法执行数据库操作
创建实体类
- 此处我们创建一个 User 实体类为了对应上我们在 message 数据库中创建的 user 表
- 从而建立好一个映射关系
- 两点要求:
- 具有 getter 和 setter 方法
- 属性名必须与 sql 字段名一致
import lombok.Data; @Data public class User { private int id; private String name; private int age; }
- 此处我们使用 LomBok 来通过注解给 User 实体类添加上 getter 和 setter 方法
构建 Mapper 层代码实现
- MyBatis 通过两个部分建立后端和数据库的联系
- 接口(该接口中的每个方法 均映射了 XML 文件中的具体 SQL 语句)
- XML 实现接口(用来写具体的 SQL 语句)
添加 mapper 接口
- 此处我们创建一个 UserMapper 接口
- 接口下的每个方法就对应 对数据库 user 表的一个操作
- 这里实现的是根据 id 查询用户信息
import com.example.demo.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; //添加 @Mapper 注解 代表该接口会伴随着 项目的启动而注入到容器中 @Mapper public interface UserMapper { // 根据 id 查询用户信息 User getUserById(@Param("user_id") Integer id); }
注意:
- 此处的 @Param 注解用于给方法的参数重命名
添加 UserMapper.xml
- 该 xml 文件需与上述的 mapper 接口相对应
添加 *Mapper.xml 的固定格式
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> </mapper>
- 因为此处的 UserMapper.xml 需与上文的 UserMapper 接口相对应
- 即 namespace 需填 UserMapper 接口的文件路径
- 又因为此处我们需要写的是 根据 id 查询用户信息,即应该使用 select 语句
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati s.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"> <select id="getUserById" resultType="com.example.demo.entity.User"> select * from user where id = ${user_id} </select> </mapper>
- 该新添加的 select 标签具有三处对应关系
实现 Service 层
- 在 MyBatis 中,服务层(Service 层)的主要作用是封装业务逻辑
- 实现业务流程的复杂性,提高代码的可重用性和可维护性
- 简单来说 服务层中的方法一般用来编排 mapper 层的各个接口,从而实现所需的业务逻辑
- Controller 会调用 Service 层的方法,而不是直接调用 Mapper 层的方法
实例理解 :
- 有一个业务逻辑需要在 user 表中连续插入多条数据,则可在 service 层通过 for 循环的方式调用 mapper 层中对应的方法来实现该逻辑
- 此处我们的业务逻辑很简单
- 仅实现根据 id 查询用户信息即可
- UserService 类中具体代码实现
import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; //添加 @Service 注解 代表该类会伴随着 项目的启动而注入到容器中 @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(Integer id) { return userMapper.getUserById(id); } }
实现 Controller 层
- 控制器层用于直接与客户端进行交互
- 接收客户端 HTTP 请求,并实现相应的业务逻辑
- 此处客户端的 HTTP 请求正是想根据 id 查询用户信息
- UserController 类中具体代码实现
import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @ResponseBody @Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/get-user-by-id") public User getUserById(Integer id) { if(id == null){ return null; } return userService.getUserById(id); } }
最终测验
- 我们在浏览器的 URL 框中输入与 UserController 所对应的 URL 地址,从而实现调用到 getUserById 方法
- 如上图所示,我们成功查询到了数据库中 id = 1 的用户信息
- 看完上述文章后,重新理解下图
- 这便是上述文章所写的整个交互过程