【JavaEE】MyBatis + 单元测试

news2024/11/24 19:48:06

目录

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);
        }
    }
}

测试一个方法:

另一个方法

测试整个类


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium是什么,带你了解自动化测试的神奇之处

一、使用测试工具 工欲善其事&#xff0c;必先利其器。在开始具体的自动化测试之前&#xff0c;我们需要做好更多的准备&#xff0c;包括以下几个方面&#xff1a; 认识自动化测试 准备自动化测试工具 使用有效的方式 针对具体的测试对象 接下来的第一部分内容&#xff0c;我…

基于Java web的电子商务系统

摘要 【摘要】 所谓电子商务就是在网上开展商务活动&#xff0c;当企业将它的主要业务通过企业内部网&#xff08;Intranet&#xff09;、外部网&#xff08;Extranet&#xff09;以及Internet与企业的职员、客户供销商以及合作伙伴直接相连时&#xff0c;其中发生的各种活动就…

基于SpringBoot的校园志愿者管理系统的设计与实现

背景 本次设计任务是要设计一个校园志愿者管理系统&#xff0c;通过这个系统能够满足管理员和志愿者的校园志愿者信息管理功能。系统的主要功能包括首页、个人中心、志愿者管理、活动类型管理、活动信息管理、活动报名管理、活动通知管理、活动心得管理、交流反馈、系统管理等…

【LTspice入门】一、LTspice安装

一、LTspice安装 1、仿真的重要性&#xff1a;2、LTspice介绍3、LTspice官网4、LTspice下载与安装 1、仿真的重要性&#xff1a; 掌握好电路仿真有助于加深对电子电路分析理论的理解。 由于电子电路仿真不需要实际的元件和仪器仪表设备,设计者就可以对所涉及的电子电路进行性能…

PCIE总线基本介绍(和PCI总线差异、速率计算、引脚定义)

1、PCI和PCIE的差异 (1)PCIE协议在软件编程上是兼容PCI协议&#xff0c;不同在于PCIE和PCI的控制器&#xff1b; (2)PCIE是差分串行信号线&#xff0c;PCI是电平并行信号线&#xff1b; (3)PCI协议使用INTA#、INTB#、INTC#、INTD#四根中断线来触发终端&#xff0c;PCIE协议没有…

sshd_conf 配置文件详解

/etc/ssh/sshd_config配置文件内容详解。 Port 22 设置SSHD监听端口号。 SSH 预设使用 22 这个port&#xff0c;也可以使用多个port&#xff0c;即重复使用 port 这个设定项&#xff01;例如想要开放SSHD端口为 22和222&#xff0c;则多加一行内容为&#xff1a; Port 222 即…

kotlin协程async与await

kotlin协程async与await import kotlinx.coroutines.* import kotlin.system.measureTimeMillisfun main() {val time measureTimeMillis {runBlocking {/*** async 是 CoroutineScope 扩展函数&#xff0c;async 和 launch 的区别在于async 可以返回协程结果&#xff0c;而 l…

【002hive基础】hive的库、表与hdfs的组织逻辑

文章目录 一. 数据的组织形式1. hive数据库2. hive表2.1. 内部表和外部表2.2. 分区表与分桶表 3. 视图 二. 底层储存 一. 数据的组织形式 1. hive数据库 hive将不同功能模块的数据&#xff0c;存储在不同的数据库中&#xff0c;在hdfs中以文件夹的形式显示。 2. hive表 2.1.…

Excel统计函数AVEDEV,稳住我们能赢

你的关注&#xff0c;是我最大的动力&#xff01;你的转发&#xff0c;我的10W&#xff01;茫茫人海有你的支持&#xff0c;给我无限动力。 1、AVEDEV函数。 &#xff08;1&#xff09;说明。 返回一组数据点到其算术平均值的绝对偏差的平均值。 AVEDEV函数是对一组数据中变化…

Linux---phy外设调试

文章目录 一、phy设备概述二、内核驱动配置与设备树添加三、其他补充 一、phy设备概述 我们知道在计算机网络上有一个OSI 7层模型&#xff1a; 应用层&#xff1a;网络服务与最终用户的一个接口。 协议有&#xff1a;HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP 表…

服务(第二十七篇)squid-传统、穿透、反向代理

squid代理服务器&#xff1a; 主要提供缓存加速、应用层过滤控制的功能。 代理的工作机制&#xff1a; 1、代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。 2、将获得的网页数据&#xff08;静态 Web 元素&#xff09;保存到缓存中并发送给客户机&#x…

【Anaconda+Pytorch+DGL】安装+配置详细过程

文章目录 Anaconda安装1、进入[Anaconda官网](https://www.anaconda.com/)下载&#xff0c;下载完成后安装指令默认直到完成安装。2、进入Anaconda Prompt&#xff0c;使用conda指令来为不同的版本创建单独的环境&#xff1a; Pytorch安装1、打开NVIDIA控制面板&#xff0c;帮助…

Python+Yolov5水稻病害侦测识别

程序示例精选 PythonYolov5水稻病害侦测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov5水稻病害侦测识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…

gcc/g++ 、Make/Makefile、CMake/CMakeLists.txt、qmake关系简述

1、gcc与g 首先来了解下编译器的主要工作流程&#xff1a; 源码&#xff08;Source Code&#xff09;>> 预处理器&#xff08;Preprocessor&#xff09;>> 编译器&#xff08;Compiler&#xff09; >> 汇编程序&#xff08;Assembler&#xff09;>> …

深度学习踩坑经验沉淀【持续更新】

背景 在深度学习炼丹过程中&#xff0c;总会遇到各种奇怪问题&#xff0c;这个时候总会在csdn和知乎平台找到答案&#xff0c;那每次遇到的问题是解决了&#xff0c;但没有记录起来&#xff0c;确实太可惜&#xff0c;因为未来某个时间或者某个人会遇到类似问题&#xff0c;所…

HBase应用场景和最佳实践

HBase 作为 Apache 基金会的 Hadoop 项目的一部分&#xff0c;将 HDFS 作为文件存储系统&#xff0c;使用 MapReduce 进行分布式的数据批量处理&#xff08;非实时数据批量处理&#xff09;、利用Zookeeper提供协同管理服务&#xff0c;为 Hadoop 提供海量数据管理服务&#xf…

ROS学习(5)——话题消息与服务

节点之间的消息通信分为几种形式&#xff1a; 话题(topic):单向消息发送/接收方式服务(service):双向消息请求/响应方式动作(action):双向消息目标(goal)/结果(result)/反馈(feedback)方式参数服务器(参数共享模式) 种类区别话题异步单向连续单向的发送/接收数据的情况服务同步…

【重生之我是蜘蛛侠】手把手教你用python爬虫,跟着做就好了

&#x1f4af; 博客内容&#xff1a;【LeetCode训练营】用栈来实现队列用队列来实现栈 详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &am…

高可用架构之异地多活

大家好&#xff0c;我是易安&#xff01; 当谈到架构的高可用时&#xff0c;无论是高可用计算架构&#xff0c;还是高可用存储架构&#xff0c;其本质的设计目的都是为了解决部分服务器故障的场景下&#xff0c;如何保证系统能够继续提供服务。但在一些极端场景下&#xff0c;有…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 &#xff08;一&#xff09;索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构&#xff0c;这些数据结构以某…