【JavaEE】MyBatis + 单元测试

目录

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语句的查询是比较方便的。优点如下:

  1. 简化 SQL 开发:在 JDBC 中,需要手动拼接 SQL 语句和占位符,并且需要手动设置参数类型和参数值等信息。而在 MyBatis 中,可以通过映射配置文件指定 SQL 语句和 Java 对象之间的映射规则,从而省去了手动拼装 SQL 语句的过程。

  2. 可维护性高:MyBatis 的映射配置文件包含了 SQL 语句和 Java 对象之间的映射规则,使得 SQL 语句和 Java 代码分离,便于维护和修改。

  3. 支持动态 SQL:MyBatis 提供了灵活的动态 SQL 语法,可以根据不同的条件组合出不同的 SQL 语句,从而实现更加灵活的数据查询和更新操作。

  4. 易于集成和扩展:MyBatis 可以与 Spring、Spring Boot、Spring MVC 等常用框架很好地集成,提供更加便捷的使用方式。同时,通过插件机制和自定义对象工厂和类型处理器,可以方便地扩展 MyBatis 的功能。

  5. 数据库移植性好:由于 MyBatis 采用基于 SQL 的方式实现数据访问,因此可以轻松地将应用程序迁移到不同的数据库,而不需要更改 Java 代码。

MyBatis工作原理

MyBatis 也是⼀个 ORM 框架, ORM(Object Relational Mapping),即对象关系映射。在⾯向
对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象
的互相转换。

对应关系如下:

数据库面向对象
行数据对象
字段属性

单元测试

上述为了测试程序是否正确,我们写完了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);
        }
    }
}

测试一个方法:

另一个方法

测试整个类


有什么错误评论区指出。希望可以帮到你。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值