首页 > 其他分享 >Spring(十五):Spring整合MyBatis的两种方式

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

时间:2022-09-29 17:25:34浏览次数:72  
标签:SqlSessionTemplate 配置文件 Spring mybatis 十五 MyBatis public

在学习之前,我们先了解一个网站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>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.9.1</version>
        </dependency>

        <!-- mysql驱动-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <!-- mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.23</version>
        </dependency>
        
    </dependencies>

 三、方式一:SqlSessionTemplate

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

SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。 SqlSessionTemplate 是线程安全的,可以被多个 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<User> 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">

    <!--
    数据源DataSource
    使用Spring的数据源代替Mybatis的配置,Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource
    -->
    <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&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!--SqlSessionFactor-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--绑定MyBatis配置文件-->
        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/jms/mapper/*.xml"/>
    </bean>

    <!--SqlSessionTemplate:实现了SqlSession接口,具有SqlSession的功能-->
    <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> 或 <typeAliases> 元素。

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

如果 MyBatis 在映射器类对应的路径下找不到与之相对应的映射器 XML 文件,那么也需要配置文件。这时有两种解决办法:第一种是手动在 MyBatis 的 XML 配置文件中的 <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<User> 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<User> userList = userMapper.selectUsers();
        for (User user : userList) System.out.println(user);
    }

测试结果如下:

 没有问题。

四、方式二:SqlSessionDaoSupport

官方文档说明如下:

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

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

SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactory 或 SqlSessionTemplate。如果两个属性都被设置了,那么 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">

    <!--
    数据源DataSource
    使用Spring的数据源代替Mybatis的配置,Spring提供的JDBC:org.springframework.jdbc.datasource.DriverManagerDataSource
    -->
    <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&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!--SqlSessionFactor-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--绑定MyBatis配置文件-->
        <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<User> 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<User> userList = userMapper.selectUsers();
        for (User user : userList) System.out.println(user);
    }

测试结果:

 

 没有问题

 

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

标签:SqlSessionTemplate,配置文件,Spring,mybatis,十五,MyBatis,public
From: https://www.cnblogs.com/jmsstudy/p/16741165.html

相关文章

  • SpringSecurity流程图
    ......
  • spring cloud整合nacos
    最近看到公司的项目服务的注册、发现以及配置都是用nacos来管理,实在是好奇其中的缘由,花了两天的时间翻阅了一些文档,在本地搭建了一个springcloud的demo并将其注册到nacos......
  • 十二、springMVC整合spring
    一、概述:需要进行spring整合springmvc吗?或者说还是否需要加入Spring的IOC容器?是否需要在web.xml文件中配置启动启动Spring IOC容器的ContextLoaderListener?需要整合......
  • 九、springMVC之文件上传
    一、配置方式web.xml:只配置了DispatcherServlet:1<?xmlversion="1.0"encoding="UTF-8"?>2<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"3xml......
  • 二、springMVC之RequestMapping和绑定参数注解
    一、概述:配置方式:同HelloWord的配置方式;目录结构: @RequestMapping:@RequestMapping除了可以使用请求URL映射请求外,还可以使用请求方法、请求参数及请求头映射请求;@RequestMa......
  • 基于 DolphinDB 搭建微服务的 SpringBoot 项目
    SpringBoot是一个基于Spring的快速开发框架,也是SpringCloud构建微服务分布式系统的基础设施。本文主要介绍如何通过SpringBoot快速搭建DolphinDB微服务,并且基于My......
  • Springboot自定义工具类中调用mapper或者service接口方式
    1、该类使用@Component注解2、添加一个本类类型的静态字段3、创建一个初始化方法,贴上@PostConstruct标签,用于注入bean4、创建方法调用mapper或service接口5、最后直接......
  • Spring Boot构建RESTful API与单元测试
    首先,回顾并详细说明一下@Controller、@RestController、@RequestMapping注解。@Controller:修饰class,用来创建处理http请求的对象@RestController:Spring4之后加入的注......
  • spring-security-oauth2-authorization-server
    旧依赖的移除长久以来,使用SpringSecurity整合oauth2,都是使用SpringSecurityOauth2这个系列的包:<dependency><groupId>org.springframework.security.oauth</grou......
  • Nacos Java Spring boot微服务配置错误 Error creating bean with name ‘configurati
    最近在学习微服务技术,在尝试Nacos的时候Java程序出错,提示Bean错误,在重新配置springboot和nacos的版本后,错误解决,下面是我用的版本,供大家参考。 Errorcreatingbean......