【Spring】(10)spring整合mybatis:两种方式

【Spring】(10)spring整合mybatis:两种方式

一、方式一:使用SqlSessionTemplate

参考:http://mybatis.org/spring/zh/getting-started.html

1.项目结构

项目结构:

在这里插入图片描述

数据库demo中有一个user表,字段只有id和name。

2.pom.xml依赖

spring整合mybatis需要导入一些依赖

pom.xml依赖如下:

    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <!-- spring要操作数据库需要导入这个spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
        <!-- aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
        <!-- mybatis核心包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>
        <!-- mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.4</version>
        </dependency>
        <!-- mysql驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
        <!-- junit -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

3.配置文件

applicationContext.xml,导入了spring-dao.xml配置文件。

注意:这里已经创建了实现类。并注入了spring-dao.xml中创建的sqlSession对象。

<?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">

    <!-- 一、导入 -->
    <import resource="spring-dao.xml"/>


    <!-- 创建实现类bean,并注入sqlSession
    (为什么会多一个实现类?因为spring要接管这个对象,它自动创建。而mybatis的东西spring无法自动创建,所以只能手动写一个实现类,并且将sqlSession注入(其实是SqlSessionTemplate)) -->
    <bean id="userMapperImpl" class="com.shengjava.demo.mapper.impl.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>

</beans>

spring-dao.xml

创建sqlSessionFactory、创建sqlSession(其实是sqlSessionTemplate)

注意:数据源请填写你自己的数据源!

参考官方文档:快速上手SqlSessionFactoryBean

<?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">

    <!-- 第一步:创建 SqlSessionFactory(mybatis-spring中的sqlSessionFactory,这个类中的字段和mybatis-config.xml环境中的字段差不多,功能可以和mybatis-spring.xml一样) -->
    <!-- 参考快速上手:http://mybatis.org/spring/zh/getting-started.html -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 绑定MyBatis本地配置文件(就是引入mybatis-config.xml配置文件) -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 其他设置:例如文件路径(其他很多也可以设置) -->
        <!--<property name="mapperLocations" value="classpath:mapper/*.xml"/>-->
    </bean>
    <!-- 数据源DataSource:使用Spring的数据源替换MyBatis配置(用spring管理数据源),这里使用Spring提供的JDBC(所以需要导入spring-jdbc依赖) -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/demo"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <!-- 第二步:创建sqlSession(mybatis-spring中的sqlSession。mybatis-spring官网快速上手是用注解写的) -->
    <!-- 参考"使用SqlSession"中的SqlSessionTemplate:http://mybatis.org/spring/zh/sqlsession.html#SqlSessionTemplate -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <!-- 使用构造器注入 -->
        <constructor-arg ref="sqlSessionFactory"/>
    </bean>

</beans>

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>
    <!-- 映射器 -->
    <mappers>
        <!--加载映射文件-->
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

4.实体类

实体类User

public class User {
    private int id;
    private String name;

    public User() {
    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

5.接口和映射文件

接口

public interface UserMapper {
    User selectUser(int id);
}

映射文件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.shengjava.demo.mapper.UserMapper">
<select id="selectUser" resultType="com.shengjava.demo.pojo.User">
      select * from User where id = #{id}
    </select>
</mapper>

6.实现类

UserMapperImpl实现类。在配置文件中已经给sqlSession注入了SqlSessionTemplate对象。

参考官方文档:SqlSessionTemplate

public class UserMapperImpl implements UserMapper{
    /**
     * 我们原来这只用sqlSession。现在整合spring需要使用sqlSessionTemplate。取名sqlSession仅仅为了更好理解(作用同之前一致)
     * 官网使用的是sqlSessionTemplate的接口SqlSession来进行接受sqlSessionTemplate。
     */
    private SqlSessionTemplate sqlSession;

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

    @Override
    public User selectUser(int id) {
        // 获取映射
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 返回方法
        return mapper.selectUser(id);
    }
}

7.测试

测试。

public class UserMapperTest {
    @Test
    public void selectUserTest() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean("userMapperImpl", UserMapper.class);
        User user = userMapper.selectUser(1);
        System.out.println(user);
    }
}

输出:我数据库中的第一条字段。

User{id=1, name='张三'}

至此,完成spring整合myabtis的第一种方式:使用SqlSessionTemplate

二、继承SqlSessionDaoSupport

参考:SqlSessionDaoSupport

1.项目结构

增加了一个实现类UserMapperImpl02、配置文件applicationContext.xml中增加创建了一个bean。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33zVpFMc-1586443692534)(0CC05C1EC23840D59813A2EB0EB91569)]

2.实现类

新建一个实现类

/** 第二种方式:继承SqlSessionDaoSupport */
public class UserMapperImpl02 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public User selectUser(int id) {
        return getSqlSession().getMapper(UserMapper.class).selectUser(id);
    }
}

3.配置文件

创建了一个bean:userMapperImpl02。

更新后的applicationContext.xml文件。

<?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">

    <!-- 一、导入 -->
    <import resource="spring-dao.xml"/>


    <!-- 创建实现类bean,并注入sqlSession
    (为什么会多一个实现类?因为spring要接管这个对象,它自动创建。而mybatis的东西spring无法自动创建,所以只能手动写一个实现类,并且将sqlSession注入(其实是SqlSessionTemplate)) -->
    <bean id="userMapperImpl" class="com.shengjava.demo.mapper.impl.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>

    <!-- 创建继承了SqlSessionDaoSupport的实现类userMapperImpl02 -->
    <bean id="userMapperImpl02" class="com.shengjava.demo.mapper.impl.UserMapperImpl02">
        <!-- 需要注入sqlSessionFactory -->
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
</beans>

测试:

运行selectUserTest02()方法。

public class UserMapperTest {
    @Test
    public void selectUserTest() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserMapper userMapper = context.getBean("userMapperImpl", UserMapper.class);
        User user = userMapper.selectUser(1);
        System.out.println(user);
    }

    @Test
    public void selectUserTest02() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 获取继承了SqlSessionDaoSupport的实现类02
        UserMapper userMapper = context.getBean("userMapperImpl02", UserMapper.class);
        User user = userMapper.selectUser(1);
        System.out.println(user);
    }
}

输出:

可以看到和上面那种方式一样。不过简单了很多。

User{id=1, name='张三'}

以上为第二种方式:继承SqlSessionDaoSupport。

全文结束,以上便是spring整合mybatis。测试的时候使用的是spring来调用,而不是原来单独学mybatis时的的mybatis调用了。