【SpringBoot整合系列】SpringBoot整合Mybatis

news2025/3/10 5:44:45

目录

  • 前期回顾
    • MyBatis简介
      • 特点
    • 持久化(Persistence)
      • 什么是持久化
    • ORM(Object Relational Mapping)
      • ORM解决方案包含下面四个部分
      • ORM解决方案
        • 经典面试题:MyBatis与Hibernate区别
  • Springboot整合MyBatis
    • 1.新建工程,导入依赖
    • 2.添加配置
    • 3.mapper层接口与mapper.xml
    • 5.mapper.xml
    • 6.serivce层
    • 7.controller层
    • 异常案例分析
    • 数据库连接池
      • 什么是数据源连接池:
      • 数据源连接池的优势
  • SpringBoot项目中的单元测试
    • 在Spring Boot项目中加入单元测试
      • 什么是单元测试
      • 为什么要进行单元测试
      • JUnit
        • Junit5中常用的注解
        • SpringBoot整合Junit

前期回顾

MyBatis简介

  • 官方网站:https://blog.mybatis.org/
  • MyBatis 原本是Apache的一个开源项目iBatis, 2010年项目由Apache迁移到了Google Code,并且改名为MyBatis 。2013年11月迁移到GitHub。
  • MyBatis通过实体类和SQL语句之间建立映射关系,是半自动化的ORM框架,是一款优秀的基于Java的数据持久层框架。

特点

  • 基于SQL语法,简单易学
  • 能了解底层封装过程,内部通过JDBC访问数据库的操作
  • SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
  • 方便程序代码调试

持久化(Persistence)

什么是持久化

  • 持久化是将程序数据在持久状态和瞬时状态间转换的机制
  • 通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
  • 持久化就是将内存中的数据模型转换为存储模型,将存储模型转换为内存中的数据模型的统称。
  • 数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。

ORM(Object Relational Mapping)

  • ORM即对象/关系映射,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。
  • 编写程序的时候,以面向对象的方式处理数据
  • 保存数据的时候,却以关系型数据库的方式存储

ORM解决方案包含下面四个部分

  • 在持久化对象上执行基本的增、删、改、查操作
  • 对持久化对象提供一种查询语言或者API
  • 对象关系映射工具
  • 提供与事务对象交互、执行检查、延迟加载以及其他优化功能

ORM解决方案

框架名称所属公司适用场合
Hibernate创始人:Gavin King
公司:JBOSS 所有
适用与需求变化不多的中小型项目中,比如后台管理系统
MybatisApache社区适用于表关联较多的项目,持续维护开发迭代较快的项目,需求变化较多的项目,如互联网项目
Mybatis-Plus苞米豆社区, 为猿类崛起而生MyBatis-Plus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
Spring Data JPASpring的母公司是VMware传统项目或者关系模型较为清晰稳定的项目,建议JPA
经典面试题:MyBatis与Hibernate区别
  1. Hibernate是全自动的ORM框架,Mybatis是半自动化的ORM框架
  2. Hibernate数据库移植性远大于Mybatis
  3. Hibernate拥有完整的日志系统,Mybatis则欠缺一些
  4. Mybatis相比Hibernate需要关心很多细节一些,更灵活一些
  5. SQL直接优化上,Mybatis要比Hibernate方便很多
  6. 缓存机制上,Hibernate要比Mybatis更好一些

Springboot整合MyBatis

1.新建工程,导入依赖

boot版本:2.3.12,jdk:1.8

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        <!-- 阿里数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</version>
        </dependency>

2.添加配置

server:
  port: 7777
logging:
  level:
    org.springframework.web: debug
    com.kgc.mapper: debug
mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml # 指定mapper映射文件位置
  type-aliases-package: com.kgc.pojo # 指定别名包
  # config-location: classpath:mybatis/mybatis-config.xml # 指定mybatis核心配置文件
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql语句
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/smbms?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456

3.mapper层接口与mapper.xml

public interface UserMapper {
    int selectCount();
}

添加注解@Mapper或者启动类上加@MapperScan,这里推荐方式2

  • 方式1:在Mapper接口上添加@Mapper,在编译之后会生成相应的实现类
  • 方式2:在启动类中添加@MapperScan,@MapperScan注解的作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
@SpringBootApplication
@MapperScan(basePackages = {"com.kgc.mapper"})
public class BootdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootdemoApplication.class, args);
    }
}

5.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="com.kgc.mapper.UserMapper">
    <select id="selectCount" resultType="int">
        SELECT COUNT(1) FROM SMBMS_USER
    </select>
</mapper>

6.serivce层

@Service
//@Transactional
public class UserService {
    @Resource
    private UserMapper userMapper;

	//@Transactional
    public Integer getUserCount(){
        return userMapper.selectCount();
    }
}

7.controller层

@RestController
public class UserController {
    @Resource
    private UserService userService;

    @RequestMapping("/count")
    public Object getCount(){
        return userService.getUserCount();
    }
}

异常案例分析

如果添加了mybatis依赖,就需要配置数据库连接信息,否则就会报错
在这里插入图片描述

  • 报错的根源在mybatis-spring-boot-starter这个组件上,mybatis-spring-boot-starter类的作用是整合Spring Boot和MyBatis,建立基于Spring Boot的MyBatis应用程序。该组件完成的工作:
    • 它会自动检测现有的数据源(因为你没有配置数据源,所以报错了)
      利用SqlSessionFactoryBean创建SqlSessionFactory,将该实例的数据源作为输入传递。
    • 创建并注册SqlSessionTemplate实例
    • 自动扫描您的映射器,将它们链接到SqlSessionTemplate并将它们注册到Spring上下文中,以便可以将它们注入到您的bean中。
  • 在SSM 整合中,开发者需要提供两个 Bean,一个 是SqlSessionFactoryBean ,还有一个是 MapperScannerConfigurer,在 Spring Boot 中,这两个东西不需要配置,但是并不意味着这两个Bean不需要了 , 在自动配置类MybatisAutoConfiguration 类中完成了
    在这里插入图片描述

数据库连接池

什么是数据源连接池:

  • 数据库连接的建立是一种耗时、性能低、代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能。
  • 数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序需要访问数据库时,不再建立一个新的连接,而是从连接池中取出一个已建立的空闲连接,使用完毕后,程序将连接归还到连接池中,供其他请求使用,从而实现的资源的共享,连接的建立、断开都由连接池自身来管理。

数据源连接池的优势

  1. 昂贵的数据库连接资源得到重用;
  2. 减少了数据库连接建立和释放的时间开销,提高了系统响应速度;
  3. 统一的数据库连接管理,避免了连接资源的泄露。
    在这里插入图片描述

SpringBoot项目中的单元测试

在Spring Boot项目中加入单元测试

什么是单元测试

  • 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

为什么要进行单元测试

  • 单元测试是由程序员自己来完成,最终受益的也是程序员自己。
  • 程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。
  • 执行单元测试,就是为了证明代码的行为和我们期望的一致。
  • 编写单元测试可以帮助开发人员编写高质量的代码,提升代码质量,减少Bug,便于重构。

JUnit

  • JUnit是一个Java语言的单元测试框架
  • 官网地址:https://junit.org/
  • Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库
Junit5中常用的注解
  • @Test :表示方法是测试方法。但是与JUnit4的@Test不同,它的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供。
  • @RepeatedTest :表示方法可重复执行
  • @BeforeEach :表示在每个单元测试之前执行
  • @AfterEach :表示在每个单元测试之后执行
  • @BeforeAll :表示在所有单元测试之前执行
  • @AfterAll :表示在所有单元测试之后执行
SpringBoot整合Junit
  • Spring Boot提供了一些实用程序和注解,用来帮助我们测试应用程序,在Spring Boot中开启单元测试只需引入spring-boot-starter-test即可。
  • 在Spring Boot项目中加入单元测试:
    • 在test/java目录中,单元测试类,并添加测试方法
  • 示例
@SpringBootTest
class BootdemoApplicationTests {
    @Resource
    private UserMapper userMapper;
    @Test
    void contextLoads() {
        System.out.println(userMapper.selectCount());
    }
}

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

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

相关文章

记录一下线上卡夫卡rebalanced的原因

记录一下线上卡夫卡rebalanced的原因&#xff0c;以及排查过程&#xff0c;我们线上使用的版本是0.10.1.1&#xff0c;rebalanced就是重平衡&#xff0c;触发重平衡的原因如下&#xff1a; 消费者组内成员发生变更&#xff0c;这个变更包括了增加和减少消费者。注意这里的减少有…

UI自动化测试框架:PO 模式+数据驱动(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff…

vue2实现字节流byte[]数组的图片预览

项目使用vantui框架&#xff0c;后端返回图片的字节流byte[]数组&#xff0c;在移动端实现预览&#xff0c;实现代码如下&#xff1a; <template><!-- 附件预览 --><div class"file-preview-wrap"><van-overlay :show"show"><…

调试 WebSocket API 技巧分享

WebSocket 是一种在单个 TCP 连接上实现全双工通信的先进 API 技术。与传统的 HTTP 请求相比&#xff0c;WebSocket 提供了更低的延迟和更高的通信效率&#xff0c;使其成为在线游戏、实时聊天等应用的理想选择。 开始使用 Apifox 的 WebSocket 功能 首先&#xff0c;在项目界…

阿里云操作日记

昨天买了一个超级便宜的阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽&#xff0c;40G ESSD Entry云盘&#xff0c;搭载一个简单的系统&#xff0c;就想到了docker轻量级&#xff0c;易于管理 其实docker很好用&#xff0c;第一步就是安装docker 一、docker安装与端口…

解决在服务器中减少删除大文件夹耗时太久的问题

在数据驱动的现代商业环境中&#xff0c;企业对服务器的高效运作有着极高的依赖性。然而&#xff0c;IT管理员们常常面临一个棘手的问题&#xff1a;删除服务器上的大型文件夹过程缓慢&#xff0c;这不仅降低了工作效率&#xff0c;还可能对用户体验造成负面影响。本文将介绍一…

【Linux】认识文件(三):缓冲区

【Linux】认识文件&#xff08;三&#xff09;&#xff1a;缓冲区 一.啥是缓冲区&#xff1f;二.缓冲区现象三.缓冲区的刷新方法四.缓冲区在哪&#xff1f;五.为什么要有缓冲区 一.啥是缓冲区&#xff1f; 缓冲区&#xff0c;官方说法就是&#xff1a;指的是一块用于临时存储数…

2739. 总行驶距离

思路 模拟一下即可&#xff0c;每次让 mainTank 减去 5 &#xff0c;然后如果 additionalTank 大于 0&#xff0c;就在让 mainTank 加 1&#xff0c;最后让 additionalTank 减 1。当不满足 mainTank - 5 > 0 && additionalTank > 0 时即退出。 class Solution { …

vue3.0项目中运用vant的以及移动端的适配

文章目录 概要移动端的适配vant的引入开发以及打包过程中遇到的问题 概要 在Vue-Vben-Admin项目中运用vant-ui实现部分页面支持手机端h5页面的预览 移动端的适配 适配的原理 自适应 根据不同的设备的屏幕大小来自动调整尺寸&#xff0c;大小响应式 会随着屏幕的变动而自动调整…

文末送资料|跟着开源学技术-ChatGPT开源项目-chatgpt-java

目录 功能特性 最简使用 进阶使用 函数调用&#xff08;Function Call&#xff09; 流式使用 流式配合Spring SseEmitter使用 多KEY自动轮询 大家好&#xff0c;我是充电君 今天带着大家来看个Java版本的ChatGPT。这个开源项目就是chatgpt-java。 Github&#xff1a; h…

gitcode 上传文件报错文件太大has exceeded the upper limited size

报错 remote: Start Git Hooks Checking Error: Deny by project hooks setting ‘default’ has exceeded the upper limited size (10 MB) in commit 当前有效的解决方案 项目设置->提交设置->勾选管理员不受规则限制->提交 重新push&#xff0c;提交成功

计算机提示dll文件缺失如何恢复?多种方法快速一键修复dll问题

动态链接库&#xff08;DLL&#xff09;是Windows操作系统中不可或缺的一部分&#xff0c;它们封装了大量的函数、类和资源&#xff0c;供多个应用程序共享使用&#xff0c;以实现功能复用、节省内存和简化软件部署。然而&#xff0c;在日常使用或软件开发过程中&#xff0c;我…

pycharm爬虫模块(scrapy)基础使用

今天学了个爬虫。在此记录 目录 一.通过scrapy在命令行创建爬虫项目 二.判断数据为静态还是动态 三.pycharm中的设置 三:爬虫主体 四.pipelines配置&#xff08;保存数据的&#xff09; 五.最终结果 一.通过scrapy在命令行创建爬虫项目 1.首先需要在cmd中进入到python文…

MySQL——运维

日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 查看日志位置&#xff1a; sho…

招商画册不会制作?这个教程收藏好

在制作招商画册过程中可能对于一些小型企业或刚刚起步的企业来说&#xff0c;招商画册的制作也不是一个难以克服的难题。本文将为您提供一些制作招商画册的技巧和建议。在制作招商画册前肯定是需要选择一款合适的在线制作工具&#xff0c;如FLBOOK 这个平台本就有海量的模板和设…

【Git教程】(十六)基于构建服务器的工作 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 基于构建服务器的工作 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备构建服务器3.2 构建服务器上的 Git3.3 比对本地开发版本与最后成功构建版本之间的差异3.4 基于构建历史的排错 4️⃣ 替代解决方案4.1 使用标签4.2 将构建历史放在中央版本库中 许多项目…

设计模式(六):原型模式

设计模式&#xff08;六&#xff09;&#xff1a;原型模式 1. 原型模式的介绍2. 原型模式的类图3. 原型模式的实现3.1 创建一个原型接口3.2 创建具体原型3.3 创建一个数据缓存类3.4 测试 1. 原型模式的介绍 原型模式&#xff08;Prototype Pattern&#xff09;属于创建型模式&…

ctfshow web29-web40

命令执行 看清都过滤了些什么&#xff01;&#xff01; 知识点&#xff1a; web34&#xff1a;当;和()被过滤了就用语言结构&#xff0c;一般有echo print isset unset include require web37&#xff1a;data协议是将后面的字符串当成php代码执行&#xff0c;例如 /?cdat…

LabVIEW学习记录2 - MySQL数据库连接与操作

LabVIEW学习记录2 - MySQL数据库连接与操作 一、前期准备1.1 windows下安装MySQL的ODBC驱动 二、LabVIEW创建MySQL 的UDL文件三、LabVIEW使用UDL文件进行MySQL数据库操作3.1 建立与数据库的连接&#xff1a;DB Tools Open Connection.vi3.2 断开与数据库的连接&#xff1a;DB T…

如何通过ABAP将数据写回BPC模型

今天给大家安利一个标准方法&#xff0c;主要用于回写BPC模型数据&#xff0c;一般情况下&#xff0c;BPC模型数据的回写&#xff0c;标准的方式有数据抽取&#xff0c;直接抽取供数模型的数&#xff0c;利用BW标准转换方式进行供数&#xff0c;又或者通过逻辑脚本BADI的方式直…