七、MyBatis与spring整合

  实现mybatis与spring进行整合,通过spring管理SqlSessionFactory、mapper接口

一、mybatis与spring整合jar

  mybatis官方提供与mybatis与spring整合jar包:

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

二、Spring配置文件

  在classpath下创建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"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       https://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


    <!-- 引入数据库的配置文件 -->
    <context:property-placeholder location="classpath:properties/jdbc.properties"/>

    <!--数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
        <property name="jdbcUrl" value="${db.jdbcUrl}"/>
        <property name="driverClass" value="${db.driverClass}"/>
    </bean>

    <!-- spring事务管理 -->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 开启基于注解的事务 -->
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>


    <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
    <!--创建出SqlSessionFactory对象  -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- configLocation指定全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config/mybatis-config_01.xml" />
        <!--mapperLocations: 指定mapper文件的位置-->
        <property name="mapperLocations" value="classpath:sqlmap/*.xml"></property>
    </bean>


</beans>

三、测试

public class Test_04 {

    public static final String RESOURCE = "applicationContext.xml";
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void createFactory() {
        sqlSessionFactory = (SqlSessionFactory)  new ClassPathXmlApplicationContext(RESOURCE).getBean("sqlSessionFactory");
    }


    @Test
    public void test_Method01() {
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        //获限mapper接口实例
        UserMapperDao dao1 = sqlSession1.getMapper(UserMapperDao.class);
        //使用session1执行第一次查询
        User user1 = dao1.findUserById("2");
        System.out.println("user = " + user1);
        sqlSession1.commit();
        //关闭session
        sqlSession1.close();

        //使用session2执行第二次查询,由于开启了二级缓存这里从缓存中获取数据不再向数据库发出sql
        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        //获限mapper接口实例
        UserMapperDao dao2 = sqlSession2.getMapper(UserMapperDao.class);
        //第二次查询,由于是同一个session则不再向数据发出语句直接从缓存取出
        User user2 = dao2.findUserById("2");
        System.out.println("user = " + user2);
        //关闭session
        sqlSession1.close();
    }
} 
原文地址:https://www.cnblogs.com/jdy1022/p/14177371.html