Spring(十五):Spring整合MyBatis的两种方式

在学习之前,我们先了解一个网站mybatis-spring,这是mybatis-spring整合的官方文档,里面有详细的教程,网址如下:

https://mybatis.org/spring/zh/index.html

一、什么是mybatis-spring

以下是mybatis-spring官方给出的介绍:

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

二、需要导入的包

    <dependencies>

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.13.2version>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.3.23version>
        dependency>

        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.9.9.1version>
        dependency>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.30version>
        dependency>

        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.10version>
        dependency>

        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatis-springartifactId>
            <version>2.0.7version>
        dependency>

        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.3.23version>
        dependency>

    dependencies>

三、方式一:SqlSessionTemplate

SqlSessionTemplate,官方文档中有这样一段说明:

SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSessionSqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。

当调用 SQL 方法时(包括由 getMapper() 方法返回的映射器中的方法), SqlSessionTemplate 将会保证使用的 SqlSession 与当前 Spring 的事务相关。 此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions

由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。

1.建立实体类User

package com.jms.pojo;

public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

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

2.建立Mapper接口UserMapper

package com.jms.mapper;

import com.jms.pojo.User;

import java.util.List;

public interface UserMapper {
    List selectUsers();
}

3.建立Mapper.xml配置文件UserMapper.xml

xml version="1.0" encoding="UTF-8" ?>
DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jms.mapper.UserMapper">
    <select id="selectUsers" resultType="user">
        select * from mybaties.user
    select>
mapper>

4.建立MyBatis配置文件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>
        <package name="com.jms.pojo"/>
    typeAliases>

configuration>

现在的MyBatis配置文件中我们只需要配置别名(typeAlias)和设置(set)的内容,至于愿意,在下面进行解释。

5.建立一个spring配置文件,用于配置MyBatis的内容

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />

        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/>
    bean>

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    bean>

beans>

这里有三个Bean,一个是数据源,一个是工厂,一个是SqlSessionTemplate;SqlSessionTemplate实现了SqlSession接口,也是我们一会要用到的东西。

SqlSessionFactory,官方文档中有这样一段说明:

SqlSessionFactory 有一个唯一的必要属性:用于 JDBC 的 DataSource 。这可以是任意的 DataSource 对象,它的配置方法和其它 Spring 数据库连接是一样的。

一个常用的属性是 configLocation ,它用来指定 MyBatis 的 XML 配置文件路径。它在需要修改 MyBatis 的基础配置非常有用。通常,基础配置指的是 <settings></settings><typealiases></typealiases> 元素。

需要注意的是,这个配置文件并不需要是一个完整的 MyBatis 配置。确切地说,任何环境配置( <environments></environments> ),数据源( <datasource></datasource> )和 MyBatis 的事务管理器( <transactionmanager></transactionmanager> )都会被忽略。 SqlSessionFactoryBean 会创建它自有的 MyBatis 环境配置( Environment ),并按要求设置自定义环境的值。

如果 MyBatis 在映射器类对应的路径下找不到与之相对应的映射器 XML 文件,那么也需要配置文件。这时有两种解决办法:第一种是手动在 MyBatis 的 XML 配置文件中的 <mappers></mappers> 部分中指定 XML 文件的类路径;第二种是设置工厂 bean 的 mapperLocations 属性。

也就是说我们仅需要在MyBatis的配置文件中配置别名或设置,其他都在SqlSessionFactory的Bean中进行配置即可。

6.建立一个实现类UserMapperImpl

实现UserMapper接口

package com.jms.mapper;

import com.jms.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperImpl implements UserMapper{

    private SqlSessionTemplate sqlSessionTemplate;

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
    @Override
    public List selectUsers() {
        UserMapper userMapper = sqlSessionTemplate.getMapper(UserMapper.class);
        return userMapper.selectUsers();
    }
}

可以看到,我们把原来SqlSession的操作封装到了一个实现类里,也就是说,此时我们只需要调用实现类的方法就可以调用需要的方法。

7.将实现类注入Bean

这里我们建立一个新的Spring配置文件applicationContext.xml,并且引用刚刚配置了Mybatis内容的配置文件

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">
    <import resource="spring-mybatis.xml"/>

    <bean id="userMapperImpl" class="com.jms.mapper.UserMapperImpl">
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    bean>
beans>

8.测试

@Test
    public void test01() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapperImpl userMapper = applicationContext.getBean("userMapperImpl", UserMapperImpl.class);
        List userList = userMapper.selectUsers();
        for (User user : userList) System.out.println(user);
    }

测试结果如下:

Spring(十五):Spring整合MyBatis的两种方式

没有问题。

四、方式二:SqlSessionDaoSupport

官方文档说明如下:

SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession 。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate

在这个类里面,通常更倾向于使用 MapperFactoryBean ,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。

SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactorySqlSessionTemplate 。如果两个属性都被设置了,那么 SqlSessionFactory 将被忽略。

前四步与方式一相同,我们直接从第五步开始:

5.配置MyBatis内容的Spring配置文件

xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/MyBaties?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />

        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/>
    bean>

beans>

此时我们不用再去注入SqlSessionTemplate,因为我们能通过getsession()方法直接获取。

6.建立一个实现类UserMapperImpl2

package com.jms.mapper;

import com.jms.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public List selectUsers() {
        return getSqlSession().getMapper(UserMapper.class).selectUsers();
    }
}

这个实现类需要继承SqlSessionDaoSupport抽象类

7.将实现类注入Bean

    <bean id="userMapperImpl2" class="com.jms.mapper.UserMapperImpl2">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    bean>

这里属性sqlSessionFactory和sqlSessionTemplate二选一即可,由于我们没有注入SqlSessionTemplate,所以这里选择工厂属性。

8.测试

@Test
    public void test01() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapperImpl2 userMapper = applicationContext.getBean("userMapperImpl2", UserMapperImpl2.class);
        List userList = userMapper.selectUsers();
        for (User user : userList) System.out.println(user);
    }

测试结果:

Spring(十五):Spring整合MyBatis的两种方式

没有问题

(本文仅作个人学习记录用,如有纰漏敬请指正)

Original: https://www.cnblogs.com/jmsstudy/p/16741165.html
Author: 谁知道水烫不烫
Title: Spring(十五):Spring整合MyBatis的两种方式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616426/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • idea 全局maven默认 配置

    1.关闭项目 2.idea欢迎界面 自定义—》所有设置 配置maven地址 配置maven配置文件 配置存储仓库 这种方式还可以配置idea 其他全局默认属性,而不用一…

    Java 2023年6月6日
    083
  • 2022-8-17 mysql 第三天

    子查询 按照结果集的行列数不同,子查询可以分为以下几类: 标量子查询:结果集只有一行一列(单行子查询) 列子查询:结果集有一列多行 行子查询:结果集有一行多列 表子查询:结果集多行…

    Java 2023年6月13日
    060
  • Golang中的插件开发

    插件化开发提供了很多便利,可动态扩展程序的相关功能,如Windows中的DLL、Linux中的So文件、还有IDEA中的插件,应用范围不可谓不广;在Golang中提供了自己的插件机…

    Java 2023年6月16日
    063
  • springboot引入jquery | idea显示引入jquery并且可以访问这个地址,但是浏览器显示$未定义

    idea项目引入jquery资源,和前端项目引入jquery资源一样,如果出问题的话那就是路径的问题。 Original: https://www.cnblogs.com/Litt…

    Java 2023年6月5日
    049
  • Day16

    package com.oop.demo10;public class Outer { private int id=10; public void out(){ System.o…

    Java 2023年6月5日
    090
  • k8s-Pod调度

    Deployment全自动调度 NodeSelector定向调度 NodeAffinity亲和性 PodAffinity-Pod亲和性与互斥性 污点和容忍度 DaemonSet J…

    Java 2023年6月8日
    059
  • QT获取ip和mac,区分虚拟机、wifi、宽带

    00:50:56:C0:00:01、00:50:56:C0:00:08 是虚拟机的MAC地址,可以排除 正常情况下,wifi和宽带只有一个工作,所以可以QNetworkAddres…

    Java 2023年5月30日
    060
  • 凭借SpringBoot整合Neo4j,我理清了《雷神》中错综复杂的人物关系

    原创:微信公众号 &#x7801;&#x519C;&#x53C2;&#x4E0A;,欢迎分享,转载请保留出处。 哈喽大家好啊,我是Hydra。 虽然…

    Java 2023年6月5日
    089
  • 常用的线程池介绍

    线程池: 简介:线程池是用来统一管理线程的,在 Java 中创建和销毁线程都是一件消耗资源的事情,线程池可以重复使用线程,不再频繁的创建、销毁线程。 线程池的作用是提高系统的性能和…

    Java 2023年6月5日
    063
  • C语言输出九九乘法表

    C语言学了有一阵子了,趁着假期没事练练手,没想到挺简单 基本思路是这样的 先写一个主函数,然后定义两个变量i1和i2;使用for语句循环嵌套,外层循环负责写循环9次,内循环里面写从…

    Java 2023年6月9日
    0104
  • 面向对象学习笔记

    面向对象的三大特征: 封装、继承、多态 封装:调用方法而不需要了解方法内部是如何实现的,为什么要这样呢,因为有些方法可能有些标准规范,如果你自己去调用使用的话可能就没有遵守他的规定…

    Java 2023年6月6日
    073
  • 如何正确的中断线程?你的姿势是否正确

    Java停止线程的逻辑(协同、通知) 在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止。但是当我们调用interrupt方法之后,它可能并不会立刻就会停…

    Java 2023年6月5日
    063
  • SSM-依赖注入

    Day2 Bean的依赖注入 依赖注入 Dependency injection :他是Spring核心框架IOC的具体实现。依赖注入方式 set方法 public void se…

    Java 2023年6月5日
    092
  • springboot devtools热启动

    热加载在pom.xml中添加devtools的maven引用,同时在plugin中添加devtools生效标志 <dependency> <groupId>…

    Java 2023年5月30日
    067
  • 五、Java控制流程

    Java流程控制* 用户交互Scanner、Scanner进阶使用 用户交互Scanner ​ 之前我们学习的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一…

    Java 2023年6月7日
    060
  • 数组(Java)

    数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成 其中,每个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们 数…

    Java 2023年6月9日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球