Spring5学习笔记之整合MyBatis

news2025/1/16 5:03:10

Springgif.gif

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Spring专栏
✨特色专栏: MySQL学习
🥭本文内容:Spring5学习笔记之整合MyBatis
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问

学习参考 :

  • 讲师:孙帅老师
  • 课程:孙哥说Spring5

1.前言

在我们之前的系列文章中,我们已经深入探讨了Spring5的两大核心组件:IOC 和 AOP,它们是Spring框架的基石。下面我们接着讨论开始讨论Spring5对于持久层框架MyBatis的整合,让我们一起开启新的的篇章吧。

2.准备工作

在开始之前,确保您已经安装了以下软件:

  • JDK 1.8或更高版本
  • Maven3.8+
  • Eclipse或IntelliJ IDEA(或您最喜欢的Java IDE)
  • MySQL8.0
  • MyBatis3.5

3.为什么要整合持久层?

Spring整合持久层的主要目的是为了简化和提高应用程序的开发和维护效率,以及提供更好的可扩展性和可测试性。以下是一些Spring整合持久层的好处:

  1. 降低开发复杂性:持久层是应用程序中一个重要的组成部分,负责数据的存储和访问。通过Spring整合持久层,可以使用Spring提供的一致的编程模型和API,简化数据库操作和事务管理的代码,减少开发人员的工作量和复杂性。
  2. 提供事务管理: 持久层通常需要处理事务,确保数据的一致性和完整性。Spring提供了强大的事务管理功能,可以通过声明式事务管理或编程式事务管理来管理事务。整合持久层后,可以轻松地配置和管理事务,而无需手动编写繁琐的事务管理代码。
  3. 支持多种持久化技术: Spring整合持久层提供了对多种持久化技术的支持,如关系型数据库(如MySQL、Oracle)、NoSQL数据库(如MongoDB、Redis)、对象关系映射(ORM)框架(如Hibernate、MyBatis)等。这使得开发人员可以根据项目需求选择合适的持久化技术,并无缝地集成到应用程序中。
  4. 提供数据访问抽象层: Spring提供了一套数据访问抽象层,即Spring Data,它简化了对数据的访问和操作。通过Spring Data,可以使用简洁的API进行常见的数据访问操作,如查询、插入、更新和删除等。Spring Data还提供了对分页、排序、缓存等功能的支持,进一步提高了开发效率。
  5. 支持依赖注入和面向切面编程: Spring的核心特性之一是依赖注入(DI)和面向切面编程(AOP)。通过整合持久层,可以将持久层组件作为Spring的bean进行管理,并通过依赖注入将其注入到其他组件中。同时,可以使用AOP功能来实现横切关注点,如日志记录、性能监控等。
  6. 企业级应用的需求:在JavaEE的开发中,数据存储和管理是不可或缺的部分,尤其当涉及到大量的用户信息、交易记录、商品数据等。为了确保数据的一致性、安全性和高效性,我们需要一种可靠的方法来访问和操作数据库,这就是持久层的职责。

综上所述,Spring整合持久层可以简化开发工作,提供事务管理、多种持久化技术的支持,提供数据访问抽象层,并支持依赖注入和面向切面编程。这些优势使得应用程序更易于开发、维护和扩展,提高了开发效率和代码质量。

4.Spring能与哪些持久层技术整合?

Spring可以与多种持久层技术进行整合,包括但不限于以下几种:

  1. JDBC: Spring提供了JdbcTemplate等工具类来简化JDBC的使用。它提供了一种更简单、更安全、更可靠的方式来执行SQL语句并处理结果集。
  2. ORM框架: Spring与多个ORM框架(对象关系映射)提供商进行了整合,包括Hibernate、MyBatis、JPA等。通过Spring的整合,可以使用ORM框架来简化数据库操作,提供对象级别的持久化。
  3. JPA(Java Persistence API): Spring提供了对JPA的支持,可以通过配置和注解的方式来定义实体类与数据库表之间的映射关系,使用JPA进行对象的持久化操作。
  4. NoSQL数据库: Spring还可以与各种NoSQL数据库进行整合,如MongoDB、Redis、Cassandra等。通过Spring Data模块,可以使用统一的API和命名约定来进行数据访问和操作。
  5. Spring Data JPA: Spring Data JPA是Spring对JPA的扩展,提供了更高级的功能和更简化的API。它结合了Spring和JPA的特性,使得使用JPA更加便捷。
  6. Spring Data JDBC: Spring Data JDBC是Spring对JDBC的扩展,提供了一种更简单的方式来进行JDBC操作。它通过注解和命名约定来进行数据库表和实体类之间的映射,简化了JDBC的使用。
  7. Hibernate (JPA): Hibernate是一个流行的ORM(对象关系映射)框架,而JPA(Java持久化API)是Java平台上的一个规范,Hibernate是JPA的一种实现。Spring为Hibernate提供了HibernateTemplate工具,它可以简化许多常见的Hibernate操作,并且为我们处理事务、会话等常见问题。使用Spring与Hibernate的整合,开发者可以轻松地将数据库记录映射到Java对象,并执行持久化操作。
  8. MyBatis: MyBatis是另一个流行的持久层框架,它允许开发者直接编写SQL,同时提供了灵活的结果映射功能。Spring为MyBatis提供了一系列工具,如SqlSessionFactoryBean和MapperScannerConfigurer,这些工具旨在简化MyBatis配置和使用过程。通过整合,开发者可以在Spring应用中方便地使用MyBatis的特性,同时享受Spring提供的事务管理、依赖注入等功能。

总之,Spring可以与多种持久层技术进行整合,通过提供统一的API和工具类,简化了数据访问和持久化操作的开发工作。无论是关系型数据库还是NoSQL数据库,都可以方便地与Spring整合使用。

5.Spring与MyBatis整合步骤

5.1 MyBatis步骤回顾

MyBatis原生的开发一共有如下几个步骤

1.实体
2.实体别名
3.数据表
4.创建DAO接口
5.实现Mapper文件
6.注册Mapper文件
7.MyBatisAPI的调用

5.2 整合步骤

1.创建Maven项目

首先,我们需要创建一个Maven项目。打开IDEA,选择自己的工作目录,点击确定即可:

image-20231019211823353

创建一个名为Leo-spring-mybatis的新Maven项目。

2.添加依赖项

打开pom.xml文件,并添加以下依赖项:

<dependencies>
   <!-- Spring dependencies -->
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.9</version>
   </dependency>
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.9</version>
   </dependency>
   <!-- MyBatis dependencies -->
   <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
   </dependency>
   <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.7</version>
   </dependency>
   <!-- Database driver -->
   <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.26</version>
   </dependency>
</dependencies>

这些依赖项将添加所需的Spring和MyBatis库以及MySQL数据库驱动程序。

3.配置配置文件

src/main/resources目录下创建一个名为mybatis-config.xml的新文件,并添加以下内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="org.javatop.pojo.User" alias="User"/>
    </typeAliases>

    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/teach-spring5?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--<package name=""-->
        <mapper resource="UserMapper.xml"/>
    </mappers>


</configuration>

在这个文件中,我们配置了一个dataSource bean,它使用MySQL数据库的连接信息。然后,我们配置了一个sqlSessionFactory bean,它使用dataSource bean并指定了MyBatis映射文件的位置。最后,我们配置了一个sqlSession bean,它使用sqlSessionFactory bean。

4.创建数据库表以及实体类

SQL语句

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

src/main/java/com/integration目录下创建一个名为User.java的新Java类,并添加以下内容:

package org.javatop.integration;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-10-19 21:37
 * @description : User实体类
 */
public class User {
    private Integer id;
    private String name;
    private String email;

    public User() {
    }
    public User(Integer id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

这是一个简单的User类,它包含id、name和email字段,并提供了相应的getter和setter方法以及toString方法。

5.创建数据访问对象(mapper)

src/main/java/com/integration目录下创建一个名为UserDao.java的新Java接口,并添加以下内容:

package org.javatop.integration.mappper;
import org.javatop.integration.pojo.User;
import java.util.List;

/**
 * @author : Leo
 * @version 1.0
 * @date 2023-10-19 21:43
 * @description : UserMapper
 */
public interface UserMapper {
    /**
     * 通过用户ID查询用户
     * @param id 用户ID
     * @return 用户信息
     */
    User getUserById(int id);
    /**
     * 查询所有用户
     * @return 全部用户信息
     */
    List<User> getAllUsers();
    /**
     * 添加用户
     * @param user 用户
     */
    void insertUser(User user);
    /**
     * 更新用户
     * @param user 用户
     */
    void updateUser(User user);
    /**
     * 删除用户
     * @param id 用户id
     */
    void deleteUser(int id);
}

这个接口定义了一些用于操作User对象的方法。

6.创建MyBatis映射文件

src/main/resources/org/javatop/integration/mapper目录下创建一个名为UserMapper.xml的新文件,并添加以下内容:

<mapper namespace="com.integration.mappers.UserMapper">
   <select id="getUserById" resultType="com.integration.User">
      SELECT * FROM users WHERE id = #{id}
   </select>

   <select id="getAllUsers" resultType="com.integration.User">
      SELECT * FROM users
   </select>

   <insert id="insertUser" parameterType="com.integration.User">
      INSERT INTO users (name, email) VALUES (#{name}, #{email})
   </insert>

   <update id="updateUser" parameterType="com.integration.User">
      UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
   </update>

   <delete id="deleteUser" parameterType="int">
      DELETE FROM users WHERE id = #{id}
   </delete>
</mapper>

这个文件定义了一些SQL语句,用于查询、插入、更新和删除用户数据。

7.测试应用程序

test/org/javatop/目录下创建TestMyBatis测试类编写测试方法

/**
    * 用于测试: 查询所有用户
    */
    @Test
    public void test01() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList = userMapper.getAllUsers();

        for (User user : userList) {
            System.out.println("user = " + user);
        }
    }

控制台打印结果:

image-20231019221207683

5.3 结论

我们详细介绍了如何使用Spring 5整合MyBatis框架来构建一个完整的Java应用程序。我们学习了如何配置Spring和MyBatis,创建数据模型,实现数据访问对象和服务层,以及创建控制器来处理HTTP请求。最后,我们测试了应用程序的不同功能。希望这篇博客对您有所帮助!

5.4 原生MyBatis存在的问题配置繁琐:

  1. 实体别名注册: 在MyBatis中,为每个实体类定义别名可以使XML映射文件中的代码更加简洁。但当有大量实体类时,手动为每一个实体类设置别名会非常繁琐。
  2. Mapper文件注册: 在配置MyBatis时,我们需要为每个Mapper XML文件进行注册,这使得配置文件变得冗长,难以管理。
    包扫描:虽然现代版本的MyBatis提供了package属性来自动扫描别名,但在之前的版本中这是不支持的,增加了使用的复杂性。
    代码冗余:
  3. API调用: 在使用MyBatis API进行数据库操作时,我们往往需要执行多个步骤,包括获取SqlSession、执行操作、处理异常和关闭SqlSession等。这些操作在每次数据库访问时都需要重复,导致代码冗余。
  4. 资源管理: 虽然MyBatis为我们提供了资源的自动管理,但在某些情况下,开发者仍需要手动管理数据库连接、会话等资源,这增加了开发的复杂性。
  5. 异常处理: 在使用MyBatis进行数据库操作时,可能会抛出多种异常。处理这些异常需要额外的代码,使得主逻辑变得不那么清晰。

6.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

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

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

相关文章

这4个网站太厉害了, 每一个都能帮你打开新世界大门

又是一期满满的干货&#xff01;今天给大家推荐几个小众但超好用的网站&#xff0c;每一个都能帮你打开新世界的大门&#xff01; 一、音分轨——在线人声分离网站 在线从任何音、视频中提取人声、伴奏和各种乐器&#xff0c;针对某一视频可以单独从里面提取人声或背景音乐&am…

Dreambooth工作原理

什么是Dreambooth 中文名&#xff1a;梦想亭。 Dreambooth 由 Google 研究团队于 2022 年发布&#xff0c;是一种通过向模型注入自定义主题来微调扩散模型&#xff08;如稳定扩散&#xff09;的技术。 所谓自定义主体&#xff0c;就是一张照片&#xff0c;但是照片主体要鲜明…

高校教务系统登录页面JS分析——广东工业大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

分布式定时任务xxljob

xxl-job的xxl为作者名徐雪里拼音首字母。 xxl-job的作者是2015年开始开发这个项目&#xff0c;那时候springmvcbootstrapadminlte 大行其道&#xff0c;所以这个框架调度器一直沿用这个架构。 一、运行调度器 调度器可以集群或单点运行&#xff0c;以单点运行为例 下载代码…

Python学习笔记——文件操作、异常捕获、模块

食用说明&#xff1a;本笔记适用于有一定编程基础的伙伴们。希望有助于各位&#xff01; 文件读取 文件操作比较常见&#xff0c;通常我们需要对文件进行读取操作&#xff1a; f1 open(assets/Files/测试文件.txt, r, encodingUTF-8)# 辨别是否可读print(f1.readable())# 读取…

MYSQL常用函数详解

今天查缺陷发现同事写的一个MYSQL的SQL中用到函数JSON_CONTAINS&#xff0c;我当时第一反应是这个函数是Mysql8新加的么&#xff1f;原来小丑尽是我自己。 有必要巩固一下Mysql函数知识&#xff0c;并记录一下。&#xff08;如果对您也有用&#xff0c;麻烦您动动发财的手点个赞…

第六届“中国法研杯”司法人工智能挑战赛进行中!

第六届“中国法研杯”司法人工智能挑战赛 赛题上新&#xff01; 第六届“中国法研杯”司法人工智能挑战赛&#xff08;LAIC2023&#xff09;目前已发布司法大模型数据和服务集成调度 、证据推理、司法大数据征文比赛、案件要素识别四大任务。本届大赛中&#xff0c;“案件要素…

找不到msvcr120.dll怎么办?msvcr120.dll丢失如何修复?

MSVCR120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package的一部分。这个文件包含了许多用于运行C应用程序的函数和类。当我们的计算机上缺少这个文件时&#xff0c;就会导致一些程序无法正常运行&#xff0c;甚至会出现系统崩溃的情…

汽车屏类产品(四):仪表Cluster

###前言 仪表Cluster/仪表盘Dashboard,作为伴随汽车诞生就存在的一个主要零部件之一,从机械到电子到数字,可以说也是逐渐发展到现在的。 目前的主流框图如下,中间processor就是主控芯片,可能有buttons/switches,有display显示屏+backlight背光,有audio->speake…

黑客技术(网络安全)学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

2023年中国多功能折叠刀产量、销量及市场规模分析[图]

多功能折叠刀是一种集多种功能于一身的刀具&#xff0c;通常包括切割、开瓶、剥皮、锯木等功能&#xff0c;可以通过折叠和展开的方式来实现不同的功能&#xff0c;具有便携、多用途、安全等特点&#xff0c;广泛应用于户外探险、露营、自驾旅行等场景。 多功能折叠刀行业分类…

【AIGC核心技术剖析】扩大富有表现力的人体姿势和形状估计SMPLer-X模型

富有表现力的人体姿势和形状估计 (EHPS) 将身体、手和面部运动捕捉与众多应用结合起来。尽管取得了令人鼓舞的进展,但当前最先进的方法仍然在很大程度上依赖于有限的训练数据集。在这项工作中,我们研究了将 EHPS 扩展到第一个通用基础模型(称为 SMPLer-X),以 ViT-Huge 作为…

layui中页面切分

1.引入Split插件 2.切屏比例设置 pallet与material为标签的id 3.html内部标签上设置切分盒子 4参考网站 : 网站链接

VMware——Window11安装VMware17(图解版)

目录 一、VMware17百度云下载二、安装三、注册 一、VMware17百度云下载 下载链接&#xff1a;https://pan.baidu.com/s/1dv_Y7ig2LUFxeHvrG2rOTA 提取码&#xff1a;elih 二、安装 下载 VMware-workstation-full-17.0.2-21581411.exe 安装包后&#xff0c;右键以管理员身份运…

AutoSar 学习路线

1 获取Spec 如何获取Autosar SPEC文档&#xff1f; 从官网获取最新的规范文档&#xff0c;网址&#xff1a;https://www.autosar.org/standards。 如果浏览器拦截&#xff0c; 点开高级&#xff0c; 点击继续访问即可。 Autosar 分Classific 和 Adaptive Platform. AUTOSAR分…

荧光EEM平滑教程(去除散射)

说明&#xff1a;本文为drEEM工具箱官网教程《Smoothing EEMs》的笔记。 瑞利散射是一种弹性散射。来自激发源的光子遇到溶液中的分子之后&#xff0c;反弹到各个方向。 最重要的是&#xff0c;瑞利散射&#xff08;的发射波长&#xff09;总是与激发波长完全相等。 因此&…

ios safari 正则兼容问题

背景: 系统是自己开发的采购管理系统; 最近升级系统之后客户反馈部分苹果手机现在在进入单据界面的时候报错, 内容显示不全; 安卓手机正常; 苹果首页是之前有使用过系统的才不行, 如果是之前没有使用过系统, 现在也是可以; 也尝试清理过缓存,更换浏览器都也是不行; 也更…

CleanMyMac苹果电脑清理软件是智商税吗?最全评测价格、清理效果一次说清

这是一篇CleanMyMac最全评测&#xff01;价格、清理效果一次说清&#xff0c;告诉你它真不是智商税! 升级Ventura系统之前&#xff0c;我用的是CleanMyMac X绿色版&#xff08;绝不提倡这个行为&#xff09;。更新到Ventura之后&#xff0c;之前很多绿色软件失效&#xff0c;浪…

Python|Pyppeteer获取去哪儿酒店数据(20)

前言 本文是该专栏的第20篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 本文以去哪儿为例,笔者将详细介绍使用pyppeteer获取去哪儿的酒店数据。如果对pyppeteer的使用以及知识点不太熟悉的同学,可往前查看本专栏前面介绍的pyppeteer知识点。 接下来,我们言…

uniapp(uncloud) 使用生态开发接口详情1(创建项目)

开发接口对比时间: 用java开发接口周期太长, 大概5-6个月左右 用php 开发接口周期同样太长, 大概3-4个月左右 用node.js 开发接口周期相对短一点, 大概1-2个月左右 用uniapp 开发接口, 可以不到 1-2周的时间 这里我使用 uniapp 开发接口, 废话不多说了,直接开干 HBuilder官网(…