Spring与Mybatis的简单整合

殳经略
2023-12-01

Spring与Mybatis的简单整合

首先创建一个maven模块,在该模块下首先分别搭建出Mybatis的基础运行环境(Mybatis程序能够运行起来,配置项都准备好)和Spring的运行环境(Spring的xml配置文件,实体类等)

1、Mybatis基础环境搭建

  1. 数据库采用之前已经创建好Mybatis01中的users表,创建实体类user:
package com.kevin.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author : kevin ding
 * @date : 2022/1/22 22:55
 * @description : 数据库Users对应的实体类
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
    private String password;
    private String address;

}
  1. UserMapper接口及抽象方法getAllUsers();
package com.kevin.dao;

import com.kevin.pojo.User;

import java.util.List;

/**
 * @author : kevin ding
 * @date : 2022/1/22 22:59
 * @description : UserMapper的抽象类
 */
public interface UserMapper {
    // 抽象方法 获取所有的user对象
    List<User> getAllUsers();
}
  1. UserMapper.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.kevin.dao.UserMapper">

    <select id="getAllUsers" resultType="user">
        select * from users;
    </select>

</mapper>
  1. mybatis的配置文件:
<?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>
    <!--开启日志-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--给实体类起别名-->
    <typeAliases>
        <package name="com.kevin.pojo"/>
    </typeAliases>
    <!--在和spring绑定时 在spring-mybatis的配置文件中写过 两边不能同时配置,否则会出错-->
    <!--设置mybatis的环境,可以配多套环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置数据源连接参数:DataSource-->
            <dataSource type="POOLED">
                <!--Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'-->
                <!--驱动已经过时,需要使用新的驱动com.mysql.cj.jdbc.Driver-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--在mysql8之后,加上时区的设置-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis01?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
                <!--设置自己数据库连接的username和password-->
                <property name="username" value="root"/>
                <property name="password" value="6298"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/kevin/dao/UserMapper.xml"/>
    </mappers>

</configuration>
  1. 测试类:
package com.kevin.test;

import com.kevin.dao.UserMapper;
import com.kevin.dao.UserMapperImpl;
import com.kevin.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author : kevin ding
 * @date : 2022/1/22 23:07
 * @description :
 */
public class MybatisTest {

    @Test
    public void test1() throws IOException {
        String resources = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resources);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> allUsers = mapper.getAllUsers();
        for (User user : allUsers) {
            System.out.println(user);
        }

        sqlSession.close();
    }
}
  1. 运行测试类,控制台输出users表中的数据, mybatis环境搭建完毕!

2、与Spring进行整合

2.1 整合方式1:

Mybatis与Spring进行整合,首先需要在pom文件中导入依赖:mybatis-Spring:使用该依赖,可以将mybatis代码无缝整合到Spring中

<!--mybatis和spring整合的maven依赖-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
  1. 创建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
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>
  1. 要和 Spring 一起使用 MyBatis,需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类

在 MyBatis-Spring 中,可使用 SqlSessionFactoryBean来创建 SqlSessionFactory。 要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中:

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

**注意:**sqlSessionFactory中需要关联属性dataSource数据源,用于连接数据库,与Mybatis中对数据源的配置类似:spring中使用DriverManagerDataSource:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis01?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
    <property name="username" value="root"/>
    <property name="password" value="6298"/>
</bean>
  1. sqlSessionFactory的bean中还需要配置常用的属性:用于关联绑定Mybatis的配置文件,并可以通过mapperLocations属性来配置映射器
<!--3. 关联Mybatis内容, 可以通过property属性将mybatis配置文件中的所有设置关联到这里-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/kevin/dao/*.xml"/>

spring 配置文件中的sqlSessionFactory的bean中,可以添加mybatis配置文件中对应的配置,如起别名,映射器,开启日志等(代替mybatis配置中的所有内容“,但是重要的一点是:mybatis配置文件和spring配置文件中对mybatis属性的配置二者只能存在一个,否则会报错

  1. SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。

创建sqlSessionTemplate的bean时,需要传入sqlSessionFactory,用于构造器注入到template中

<!--4. 注册sqlSessionTemplate,通过构造器注入方式 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <!--需要注入sqlSessionFactory 且必须通过构造器注入,因为SqlSessionTemplate中没有set方法-->
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
  1. spring和mybatis整合,不再像mybatis那样直接在mapper.xml中直接编写sql语句,在测试类中创建sqlSession和mapper调用,在整合中,需要将这些步骤全部放进接口的实现类中完成:
package com.kevin.dao;

import com.kevin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

/**
 * @author : kevin ding
 * @date : 2022/1/22 23:33
 * @description : 需要创建一个UserMapper的实现类,重写接口中的抽象方法
 */
public class UserMapperImpl implements UserMapper {
    // 关联sqlSession
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> getAllUsers() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.getAllUsers();
    }
}
  1. 在spring的配置文件中,将该实现类的bean注册:并注入属性sqlSessionTemplate
<!--5.dao中创建一个UserMapper接口的实现类,重写其中的抽象方法,并将其注册到spring中-->
<bean id="userMapperImpl" class="com.kevin.dao.UserMapperImpl">
    <property name="sqlSession" ref="sqlSession"/>
</bean>
  1. 测试:

    @Test
    public void combinedSpringAndMybatis1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
        UserMapperImpl userMapperImpl = context.getBean("userMapperImpl", UserMapperImpl.class);
        List<User> userList = userMapperImpl.getAllUsers();
        for (User user : userList) {
            System.out.println(user);
        }
    }
    

    在测试类中,就只需解析spring的配置文件,获取上下文context,直接获取对应的mapper实现类即可,中间步骤sqlSessionFactory,创建sqlSession等方法通过注册到bean中,由spring帮我们完成(在解析配置文件时内部完成,并且已经包含在上下文context中了)

    并且可以发现,在将mybatis整合到spring中之后,mybatis的配置文件中的全部内容都可以整合到sqlSessionFactory的bean中,以后就可以完全不需要创建mybatis的配置文件了。

2.2 整合方式2

  1. sqlSessionDaoSuppor类,可以通过调用其getSqlSession方法,得到一个sqlSessionTemplate,之后可以用来执行sql语句;mapper接口的实现类可继承该类:
package com.kevin.dao;

import com.kevin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

/**
 * @author : kevin ding
 * @date : 2022/1/22 23:44
 * @description :
 */
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public List<User> getAllUsers() {
        return getSqlSession().getMapper(UserMapper.class).getAllUsers();

    }
}
  1. 在spring的配置文件中注册userMapperImpl2的bean:

SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactorySqlSessionTemplate bean中属性注入:sqlSessionFactory

<!--使用第二种整合方法,需要在bean中注入sqlSessionFactory属性-->
<bean id="userMapperImpl2" class="com.kevin.dao.UserMapperImpl2">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
  1. 测试:
@Test
public void combinedSpringAndMybatis2(){
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
    UserMapperImpl2 userMapperImpl = context.getBean("userMapperImpl2", UserMapperImpl2.class);
    List<User> userList = userMapperImpl.getAllUsers();
    for (User user : userList) {
        System.out.println(user);
    }
}
  1. 测试结果:执行成功!

3、总结

整个spring整合mybatis的过程步骤:

  1. 整个环境搭建第一步为先导入所需的所有Maven依赖

  2. 创建实体类,Mapper接口,Mapper.xml

  3. 创建spring的配置文件

    • 注册dataSources的bean,连接数据源配置

    • 注册sqlSessionFactory的bean,并将dataSource属性注入

    • 关联Mybatis内容, 可以通过property属性将mybatis配置文件中的所有设置关联到sqlSessionFactory的bean中

    • 注册sqlSessionTemplate的bean,注入属性sqlSessionFactory

  4. 编写mapper接口的实现类,关联私有化的sqlSessionTemplate,用于获取mapper并对数据库进行操作。

  5. 将编写的实现类,注册到spring的配置文件中

  6. 测试类完成测试。

 类似资料: