目录
MyBaits项目的创建+使用
引入相关依赖
配置文件设置
数据库连接
配置XML路径
映射器文件模板
业务代码实例
创建实体类
添加Mapper接口+创建映射器
验证是否成功
MyBatis原理
什么是MyBatis
为什么学习MyBatis
MyBatis工作原理
单元测试
前置工作
生成测试类
测试
MyBaits项目的创建+使用
引入相关依赖
配置文件设置
以下的配置都是在项目刚开始就要写好,复制粘贴即可。
数据库连接
# 在application.yml 配置文件中
# 数据库连接(MySQL版本)
spring:
datasource:
url: jdbc:mysql://localhost:3306/数据库名字?characterEncoding=utf8&useSSL=false
username: 用户名
password: 数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver
如果使⽤ mysql-connector-java 是 5.x 之前的使⽤的是“ com.mysql.jdbc.Driver ” ,如果是⼤于 5.x 使⽤的是“ com.mysql.cj.jdbc.Driver ” 。
配置XML路径
# 配置MyBatis中的XML路径
# *Mapper.xml 文件命名形式
mybatis:
mapper-locations: classpath:/mybatis/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis
表示 MyBatis 的配置信息
mapper-locations
是 MyBatis 映射器文件的位置
classpath:
表示类路径。上述配置的含义是指,MyBatis 会在类路径下
/mybatis/
目录查找所有以Mapper.xml
结尾的文件作为映射器文件,并将其加载到 MyBatis 中。其中的*
通配符表示匹配任意字符,所以可以匹配到所有以Mapper.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">
<mapper namespace="这里写报名+类名(XXXMapper)">
<!-- 这是一个通用的映射器模板,每次使用复制修改即可 -->
<!-- 类名通常要求写成 XXXMapper -->
<!-- 这里写Mapper的具体内容 -->
</mapper>
业务代码实例
这一步之前是数据库中有了相应的表。
这里有数据库中有一张userinfo表,列名和UserEntity的字段相对应。
创建实体类
添加Mapper接口+创建映射器
UserMapper
package com.example.demo.mapper;
import com.example.demo.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 该接口是有关所有用户操作的接口
*/
@Mapper
public interface UserMapper {
// 通过 id 找到一个用户
public UserEntity getUserById();
// 找到所有用户
public List<UserEntity> getAll();
}
UserMapper.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">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="getUserById" resultType="com.example.demo.entity.UserEntity">
<!-- 这里暂时先写死 id = 1 -->
select * from userinfo where id = 1;
</select>
<select id="getAll" resultType="com.example.demo.entity.UserEntity">
select * from userinfo;
</select>
</mapper>
对应关系如下图。
验证是否成功
UserService
package com.example.demo.Service;
import com.example.demo.entity.UserEntity;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<UserEntity> getAll() {
return userMapper.getAll();
}
public UserEntity getUserById(Integer id) {
return userMapper.getUserById(id);
}
}
UserContoroller
package com.example.demo.controller;
import com.example.demo.Service.UserService;
import com.example.demo.entity.UserEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RequestMapping("/user")
@RestController
@ResponseBody
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getAll")
public List<UserEntity> getAll() {
return userService.getAll();
}
@RequestMapping("/getbyid")
public UserEntity getUserById(Integer id) {
return userService.getUserById(id);
}
}
数据库中的数据
可以看到两个方法是没有任何问题的。但是这样的测试方式过于复杂,正对于这种测试,通常我们会使用单元测试,这样就可以跳过controller、service层进行验证。单元测试将在本文的最后一部分讲。
MyBatis原理
上述过程是MyBatis在项目中的实际应用,接下来会介绍MyBatis的具体原理。
什么是MyBatis
这是MyBatis官网对MyBatis的介绍。
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
为什么学习MyBatis
相较于之前的JDBC编程,通过上面的查询,虽然刚开始准备工作做的比较多,但是后续的SQL语句的查询是比较方便的。优点如下:
简化 SQL 开发:在 JDBC 中,需要手动拼接 SQL 语句和占位符,并且需要手动设置参数类型和参数值等信息。而在 MyBatis 中,可以通过映射配置文件指定 SQL 语句和 Java 对象之间的映射规则,从而省去了手动拼装 SQL 语句的过程。
可维护性高:MyBatis 的映射配置文件包含了 SQL 语句和 Java 对象之间的映射规则,使得 SQL 语句和 Java 代码分离,便于维护和修改。
支持动态 SQL:MyBatis 提供了灵活的动态 SQL 语法,可以根据不同的条件组合出不同的 SQL 语句,从而实现更加灵活的数据查询和更新操作。
易于集成和扩展:MyBatis 可以与 Spring、Spring Boot、Spring MVC 等常用框架很好地集成,提供更加便捷的使用方式。同时,通过插件机制和自定义对象工厂和类型处理器,可以方便地扩展 MyBatis 的功能。
数据库移植性好:由于 MyBatis 采用基于 SQL 的方式实现数据访问,因此可以轻松地将应用程序迁移到不同的数据库,而不需要更改 Java 代码。
MyBatis工作原理
对应关系如下:
数据库 | 面向对象 |
表 | 类 |
行数据 | 对象 |
字段 | 属性 |
单元测试
上述为了测试程序是否正确,我们写完了xml和Mapper之后,又写了Service层调用Mapper,使用Controller调用Service层。可以看到层层调用验证是很复杂的。
前置工作
在maven仓库中Maven Repository: Search/Browse/Explore (mvnrepository.com)选择测试框架,然后添加到当前项目中。
由于SpringBoot项目内置了JUnit5这个测试框架。
生成测试类
选择一个类,右击
选择Test
选择默认的即可
测试
package com.example.demo.mapper;
import com.example.demo.entity.UserEntity;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest // 表示当前的类是在SpringBoot 项目中运行的
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void getUserById() {
UserEntity userEntity = userMapper.getUserById(1);
System.out.println(userEntity);
}
@Test
void getAll() {
List<UserEntity> userEntities = userMapper.getAll();
for (UserEntity x : userEntities) {
System.out.println(x);
}
}
}
测试一个方法:
另一个方法
测试整个类
有什么错误评论区指出。希望可以帮到你。