【Spring】— MyBatis与Spring的整合

news2024/11/24 19:51:27

目录

    • 1.整合环境
      • 1.1准备所需的JAR包
        • 1.所需Spring框架的JAR包
        • 2.所需MyBatis框架的JAR包
        • 3.MyBatis与Spring整合所需的中间JAR包
        • 4.数据库驱动JAR包
        • 5.数据源所需JAR包
      • 1.2 编写配置文件
    • 2.整合
      • 2.1 传统DAO方式的开发整合
        • 1.实现持久层
        • 2.实现DAO层
        • 3.整合测试
      • 2.2 Mapper接口方式的开发整合
        • 1.基于MapperFactoryBean的整合
        • 2.基于MapperScannerConfigurer的整合

1.整合环境

搭建Spring和MyBatis的整合主要涉及准备所需的JAR包和编写配置文件。

1.1准备所需的JAR包

要实现MyBatis与Spring的整合,需要这两个框架相关的JAR包,除此之外,还需要其他的JAR包来配合使用。

1.所需Spring框架的JAR包

Spring框架所需要准备的JAR包共10个,其中包括4个核心模块JAR、AOP开发使用的JAR、JDBC和事务的JAR(其中核心容器依赖的commons-logging的JAR在MyBatis框架的lib包中已经包含),具体如下所示。

在这里插入图片描述

2.所需MyBatis框架的JAR包

MyBatis框架需要准备的JAR包共13个,其中包括核心包mybatis-3.4.2.jar及其解压文件夹中lib目录中的所有JAR,具体如下所示。

在这里插入图片描述

3.MyBatis与Spring整合所需的中间JAR包

为了满足MyBatis用户对Spring框架的需求,MyBatis社区开发了一个用于整合MyBatis和Spring两个框架的中间件——MyBatis-Spring。

4.数据库驱动JAR包

数据库驱动包为mysql-connector-java-x.x.x-bin.jar。

5.数据源所需JAR包

整合时所使用的是DBCP数据源,所以需要准备DBCP和连接池的JAR包。

1.2 编写配置文件

创建一个名称为chapter10的Web项目,将全部JAR包添加到项目的lib目录中,并发布到类路径下。

【示例】在项目的src目录下分别创建db.properties文件、Spring的配置文件applicationContext.xml以及MyBatis的配置文件mybatis-config.xml。

db.properties

在这里插入图片描述
除了配置连接数据库的基本4项外,还配置数据库连接池的最大连接数(maxTotal)、最大空闲连接数(maxIdle)以及初始化连接数(initialSize)。

applicationContext.xml

在这里插入图片描述
在这里插入图片描述
首先定义了读取properties文件的配置,然后配置了数据源,接下来配置了事务管理器并开启了事务注解,最后配置了MyBatis工厂来与Spring整合。其中,MyBatis工厂的作用是构建SqlSessionFactory,它是通过MyBatis-Spring包中提供的org.mybatis.Spring.SqlSessionFactoryBean类来配置的。通常在配置时需要提供两个参数:一个是数据源;另一个是MyBatis的配置文件路径。这样Spring的IoC容器就会在初始化id为sqlSessionFactory的Bean时解析MyBatis的配置文件,并与数据源一同保存到Spring的Bean中。

mybatis-config.xml

在这里插入图片描述
由于在Spring中已经配置了数据源信息,因此在MyBatis的配置文件中不再需要配置数源信息。这里只需要使用<typeAliases><mappers>元素来配置文件别名以及指定mapper文件位置即可。

2.整合

通过传统DAO方式和Mapper接口方式的开发整合。

2.1 传统DAO方式的开发整合

采用传统DAO开发方式进行MyBatis与Spring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过SqlSessionFactory创建SqlSession。为此,我们可以使用Mybatis-Spring包中所提供的SqlSessionTemplate类或SqlSessionDaoSupport类来实现此功能。这两个类的描述如下。

  • SqlSessionTemplate:Mybatis-Spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的。它还管理SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
  • SqlSessionDaoSupport:一个抽象支持类,它继承了DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqlSession。

【示例】了解了传统DAO开发方式整合可以使用的两个类后,下面以SqlSessionDaoSupport类的使用为例讲解传统的DAO开发方式整合的实现,其具体步骤如下。

1.实现持久层

步骤01 在src目录下创建一个com.ssm.po包,并在包中创建持久化类用户类User,在User类中定义相关属性和方法。

package com.ssm.po;

/**
 * 功能描述
 *
 * @author: 衍生星球
 * @date: 2023年06月14日 10:17
 */

public class User {
    private Integer id;
    private String username;
    private String jobs;
    private String phone;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getJobs() {
        return jobs;
    }

    public void setJobs(String jobs) {
        this.jobs = jobs;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", jobs='" + jobs + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

步骤02 在com.ssm.po包中创建映射文件UserMapper.xml,在该文件中编写根据id查询用户信息的映射语句,如文件10.5所示。

<?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.ssm.po.UserMapper">
    <!--根据用户编号获取用户信息-->
    <select id="findUserById" parameterType="Integer" resultType="User">
        select * from t_user where id =#{id}
    </select>
</mapper>

步骤03 在MyBatis的配置文件mybatis-config.xml中配置映射文件UserMapper.xml的位置,具体如下。

<mapper resource="com/ssm/po/UserMapper.xml" />

2.实现DAO层

步骤01 在src目录下创建一个com.ssm.dao包,并在包中创建接口UseDao,在接口中编写一个通过id查询用户的方法findUserById()。

package com.ssm.dao;

import com.ssm.po.User;
//用户接口类
public interface UseDao {
    //根据用户id查询用户的方法
    public User findUserById(Integer id);
}

步骤02 在src目录下创建一个com.ssm.dao.impl包,并在包中创建UserDao接口的实现类UserDaoImp。

package com.ssm.dao.impl;
import com.ssm.dao.UseDao;
import com.ssm.po.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;

//用户接口实现类
public class UserDaoImpl extends SqlSessionDaoSupport implements UseDao {
    //根据用户id查询用户的实现方法
    public User findUserById(Integer id){
        return this.getSqlSession().selectOne("com.ssm.po.UserMapper.findUserById",id);
    }
}

UserDaoImpl类继承了SqlSessionDaoSupport并实现了UserDao接口。其中,SqlSessionDaoSupport类在使用时需要一个SqlSessionFactory或一个SqlSessionTemplate对象,所以需要通过Spring给SqlSessionDaoSupport类的子类对象注入一个SqlSessionFactory或SqlSessionTemplate。这样,子类中就能通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取SqlSession对象,并使用SqlSession对象中的方法了。

步骤03 在Spring的配置文件applicationContext.xml中编写实例化UserDaoImpl的配置,代码如下所示。

   <!-- 实例化Dao-->
    <bean id="userDao" class="com.ssm.dao.impl.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

上述代码创建了一个id为userDao的Bean,并将SqlSessionFactory对象注入该Bean的实例化对象中。

3.整合测试

在src目录下创建一个com.ssm.test包,在包中创建测试类UserDaoTest,并在类中编写测试方法findUserByIdDaoTest()。

package com.ssm.test;

import com.ssm.dao.UseDao;
import com.ssm.po.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class UserDaoTest {

    @Test
    public void findUserByIdDaotest() {
        //1.初始化Spring容器,加载配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.提供容器获取userDao实例
        UseDao userDao = (UseDao) applicationContext.getBean("userDao");
//        UserDao userDao = (UseDao)applicationContext.getBean("userDao");
        //3.调用userDao接口查询用户方法(id为1)
        User user = userDao.findUserById(1);
        System.out.println(user);
    }
}

在上述方法中,我们采用的是根据容器中Bean的id来获取指定Bean的方式。执行上述方法后,控制台的输出结果如图所示。从中可以看出,通过UserDao实例的findUserById()方法已经查询出了id为1的用户信息,这就说明MyBatis与Spring整合成功。

在这里插入图片描述

2.2 Mapper接口方式的开发整合

在MyBatis+Spring的项目中,虽然使用传统的DAO开发方式可以实现所需功能,但是采用这种方式在实现类中会出现大量的重复代码,在方法中也需要指定映射文件中执行语句的id,并且不能保证编写时id的正确性(运行时才能知道)。为此,我们可以使用MyBatis提供的另一种编程方式,即使用Mapper接口编程。接下来将讲解如何使用 Mapper接口方式来实现MyBatis与Spring的整合。

1.基于MapperFactoryBean的整合

MapperFactoryBean是MyBatis-Spring团队提供的一个用于根据Mapper接口生成Mapper对象的类,该类在Spring配置文件中使用时可以配置以下参数。

  • mapperInterface:用于指定接口。
  • SqlSessionFactory:用于指定SqlSessionFactory。
  • SqlSessionTemplate:用于指定SqlSessionTemplate。
  • 若与SqlSessionFactory同时设定,则只会启用SqlsessionTemplate。

示例】了解了MapperFactoryBean类后,接下来通过一个具体的案例来演示如何通过MapperFactoryBean实现MyBatis与Spring的整合,具体步骤如下。

步骤01 在src目录下创建一个com.ssm.mapper包,然后在该包中创建UserMapper接口以及对应的映射文件。

UserMapper.java
在这里插入图片描述
UserMapper.xml
在这里插入图片描述

本案例将接口文件改名并与映射文件一起放在了com.ssm.mapper包中。

步骤02 在MyBatis的配置文件中引入新的映射文件,代码如下所示。

在这里插入图片描述
步骤03 在Spring的配置文件中创建一个id为userMapper的Bean,代码如下所示。

在这里插入图片描述
上述配置代码为MapperFactoryBean指定了接口以及SqlSessionFactory。

步骤04 在测试类UserDaoTest中编写测试方法findUserByIdMapperTest(),其代码如下所示。

在这里插入图片描述
上述方法中,通过Spring容器获取了UserMapper实例,并调用了实例中的findUserById()方法来查询id为1的用户信息。

注意

Mapper接口编程方式是,只需要程序员编写Mapper接口(相当于DAO接口),然后由MyBatis框架根据接口的定义创建接口的动态代理对象,这个代理对象的方法体等同于DAO接口的实现类方法。

虽然使用Mapper接口编程的方式很简单,但是在具体使用时还是需要遵循以下规范。

(1)Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致。

(2)Mapper.xml文件中的namespace与Mapper接口的类路径相同(即接口文件和映射文件需要放在同一个包中)。

(3)Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同。

(4)Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个SQL的parameterType的类型相同。

(5)Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个SQL的resultType的类型相同。

只要遵循了这些开发规范,MyBatis就可以自动生成Mapper接口实现类的代理对象,从而简化开发。

2.基于MapperScannerConfigurer的整合

在实际的项目中,DAO层会包含很多接口,如果每一个接口都像在Spring配置文件中配置,那么不但会增加工作量,还会使得Spring配置文件非常臃肿。为此,MyBatis-Spring团队提供了一种自动扫描的形式来配置MyBatis中的映射器——采用MapperScannerConfigurer类。

MapperScannerConfigurer类在Spring配置文件中使用时可以配置以下属性。

  • basePackage:指定映射接口文件所在的包路径,当需要扫描多个包时可以使用分号或逗号作为分隔符。指定包路径后,会扫描该包及其子包中的所有文件。
  • annotationClass:指定要扫描的注解名称,只有被注解标识的类才会被配置为映射器。
  • sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称。
  • sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean名称。若定义此属性,则sqlSessionFactoryBeanName将不起作用。
  • markerInterface:指定创建映射器的接口。

MapperScannerConfigurer的使用非常简单,只需要在Spring的配置文件中编写如下代码:

在这里插入图片描述
在通常情况下,MapperScannerConfigurer在使用时只需通过basePackage属性指定需要扫描的包即可。Spring会自动地通过包中的接口生成映射器。这使得开发人员可以在编写很少代码的情况下完成对映射器的配置,从而提高开发效率。要验证上面的配置很容易,只需将上述配置代码写入Spring的配置文件,并将基于MapperFactoryBean的整合案例中的步骤02和步骤03的代码注释掉,再次执行findUserByIdMapperTest()方法进行测试即可。方法执行后结果一致。

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

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

相关文章

龙蜥社区第 17 次运营委员会会议顺利召开

5 月 26 日&#xff0c;龙蜥社区走进 Arm 北京办公室召开了第 17 次运营委员会会议。本次会议由龙蜥社区运营委员会副主席金美琴主持。来自 Arm、阿里云、电信、红旗软件、飞腾、海光、Intel、浪潮信息、联通软研院、龙芯、凝思软件、麒麟软件、普华基础软件、申泰、统信软件、…

Vue-Element-Admin项目学习笔记(7)用Node.js写一个简单后端接口

前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.js 文件分析 vue-element-admin项目学习笔记&#xff08;3&#xff09;路由分析一:静态路由 vue-element-adm…

Opencv-C++笔记 (3) : opencv的库介绍以及和C++对接转换

文章目录 一、Opencv库的介绍calib3dcontribcoreimgprocfeatures2dflannhighguilegacymlnonfreeobjdetectoclphotostitchingsuperrestsvideoVideostab 二、C和MAT 转换方式2.1、一维Vector2.2、二维vector2.3 数组2.4、类型转换 ——一维转 数组2.5、类型转换 -------- 一维MAT…

抖音同城榜相关介绍来啦,这篇文不若与众带你去详细了解它

一、抖音同城榜是什么&#xff1f; 抖音同城榜是抖音平台上的一个功能&#xff0c;它可以根据用户所在的地理位置&#xff0c;推荐附近热门的视频和达人。用户可以通过同城榜来了解当地的热门话题、美食、景点等信息&#xff0c;也可以通过同城榜认识志同道合的朋友和达人&…

DTD怎样进行元素类型定义?【语法格式】

Bootstrap常用组件包括按钮、导航、菜单和表单等。使用Bootstrap不需要编写复杂的样式代码&#xff0c;只需要使用Bootstrap组件就可以实现复杂的页面架构。下面将对Boolstrap按钮组件进行详细讲解。 Bootstrap提供了多种样式的按钮&#xff0c;每个样式的按钮都有自己的语义用…

动态规划:最长公共子序列

动态规划&#xff1a;最长公共子序列 前言一、动态规划 前言 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在…

练习1:线性回归

练习1&#xff1a;线性回归 介绍 在本练习中&#xff0c;您将 实现线性回归并了解其在数据上的工作原理。 在开始练习前&#xff0c;需要下载如下的文件进行数据上传&#xff1a; ex1data1.txt -单变量的线性回归数据集ex1data2.txt -多变量的线性回归数据集 在整个练习中&…

【IMX6ULL驱动开发学习】09.Linux驱动之GPIO中断(附SR501人体红外感应驱动代码)

Linux驱动的GPIO中断编程主要有以下几个步骤&#xff1a; 1、 通过GPIO号获取软件中断号 (中断编程不需要设置GPIO输入输出&#xff0c;当然申请GPIO&#xff0c;设置输入也没问题) int gpio_to_irq(unsigned int gpio)参数含义gpioGPIO引脚编号 2、 注册中断处理函数&#…

k8s中docker0默认ip修改

原因&#xff1a; 由于ip冲突&#xff0c;必须要修改docker0的默认ip 过程&#xff1a; &#xff08;1&#xff09;修改文件 /etc/docker/daemon.json 添加内容 “bip”: “ip/netmask” [ 切勿与宿主机同网段 ] &#xff08;2&#xff09; &#xff08;3&#xff09;重启docke…

视觉SLAM十四讲——ch9实践(后端1)

视觉SLAM十四讲——ch9的实践操作及避坑 0.实践前小知识介绍0.1 数据集的使用 1. 实践操作前的准备工作2. 实践过程2.1 Ceres BA2.2 g2o求解BA 3. 遇到的问题及解决办法3.1 查看.ply文件时报警告 0.实践前小知识介绍 0.1 数据集的使用 Ceres BA使用的是BAL数据集。在本例中&a…

为什么说2023年最难招聘的岗位是高性能计算工程师?

随着毕业季的临近&#xff0c;高校毕业生将进入就业关键阶段。据统计&#xff0c;2023届全国高校毕业生预计达到1158万人&#xff0c;同比增加82万人&#xff0c;再创新高。尽管有千万的大学毕业生&#xff0c;但是企业反馈依然很难招聘到合适的高性能计算工程师。 这主要归因于…

看到就赚到的5款小众软件

今天推荐5款十分小众的软件&#xff0c;知道的人不多&#xff0c;但是每个都是非常非常好用的&#xff0c;有兴趣的小伙伴可以自行搜索下载。 图文识别——PandaOCR PandaOCR是一款用于识别和转换图片中的文字的工具。它可以让你对任何格式的图片进行文字识别&#xff0c;并输…

STM32速成笔记—按键检测

如果需要本文程序工程&#xff0c;请评论区留邮箱或者私信。 文章目录 一、按键检测原理二、硬件连接三、程序设计3.1 初始化GPIO3.2 按键扫描函数 四、按键控制LED4.1 初始化LED和KEY的GPIO4.2 编写按键扫描函数4.2 编写LED控制函数4.3 编写按键服务函数 五、拓展5.1 一个按键…

如何使用二维码实现配电箱巡检

施工工地的外部环境条件恶劣,加之工地上机动车辆的运行和机械设备的应用&#xff0c;均易导致电气故障的发生。现场配电箱缺乏专业技术人员的管理,易造成触电伤害、火灾等事故。现场纸质巡检存在以下问题&#xff1a; 1、信息查询不便:配电箱信息、负责人&#xff0c;历史巡检维…

Flowable服务组件-扩展组件

Flowable服务组件-扩展组件 扩展组件 文章目录 Flowable服务组件-扩展组件前言Flowable给我们提供了非常丰富的组件&#xff0c;但是在实际场景中&#xff0c;我们有需要企业个性化的组件&#xff0c;如何扩展自己的组件至关重要 一、扩展微服务回调组件二、程序步骤1.定义我们…

618父亲节,感恩的祝福送给父亲!

父亲节&#xff08;Fathers Day&#xff09;&#xff0c;是感恩父亲的节日。Fathers day, is a day of thanksgiving for fathers. 第一个提出父亲节理念的人是1906年的多德夫人。她想用一个特殊的日子来纪念她的父亲&#xff0c;她的妈妈多年前就去世了。起初&#xff0c;多德…

1.4 场效应管

1.什么是场效应管&#xff1f; 场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是一种基于电场效应调控电流的三端器件。它是一种用于电子电路中的重要元件&#xff0c;常用于放大信号、开关电路和模拟电路等应用。 场效应管主要由一个导电的沟…

git 的详细介绍使用

点击下载&#xff1a;Git下载地址 下载完成后在本地文件夹空白位置右键能看到即为安装成功 git简介&#xff1a;git是一个版本控制系统&#xff0c;见下方图详解 快速查看git的全局配置项 git config --list --global 查看指定的全局配置项 git config user.name git conf…

【Git删除大文件失败,提示WARNING: Ref ‘refs/heads/master‘ is unchanged的解决思路】

1. 问题描述 最近使用Gitee一直在独立开发某个项目&#xff0c;某次因为某个测试文件比较大&#xff0c;超过了100MB&#xff0c;gitee无法接受&#xff0c;上传失败。但是当时我没有发现上传失败&#xff0c;就没有处理&#xff0c;等到今天发现的时候&#xff0c;已经提交过…

Low-Light Image Enhancement with Wavelet-based Diffusion Models

Abstract 扩散模型在图像恢复任务中取得了很好的效果&#xff0c;但存在时间长、计算资源消耗大、恢复不稳定等问题。为了解决这些问题&#xff0c;我们提出了一种鲁棒和高效的基于扩散的微光图像增强方法&#xff0c;称为DiffLL。具体来说&#xff0c;我们提出了一个基于小波…