spring和mybatis整合

整合思路

需要spring通过单例方式管理SqlSessionFactory。

spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)

持久层的mapper都需要由spring进行管理。

整合环境

jar包:

mybatis3.2.7的jar包

spring3.2.0的jar包

mybatis和spring的整合包:早期ibatis和spring整合是由spring官方提供,mybatis和spring整合由mybatis提供。

工程目录结构:

SqlSessionFactory

mybatis和spring整合后,应该由spring来管理sqlSessionFactory

在spring的配置文件(applicationContext.xml)中进行如下配置

<!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 数据库连接池,使用dbcp连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="10"/>
        <property name="maxIdle" value="5"/>
    </bean>

    <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的org.mybatis.spring.SqlSessionFactoryBean-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 加载mybatis的全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
    </bean>

mybatis和spring整合后,原始Dao开发方式

(1)User.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="test">
    <!-- 根据用户id查询用户信息 -->
    <select id="findUserById" parameterType="int" resultType="com.company.ssm.po.User">
        SELECT * FROM USER WHERE  id = #{id}
    </select>

</mapper>

注意:要把映射文件添加到mybatis的核心配置文件(sqlMapConfig.xml)中

(2)UserDao.java

(3)UserDaoImpl.java

注意:(1)接口实现类要去继承SqlSessionDaoSupport类  (2)获取sqlSession的方式为this.getSqlSession();  (3)在方法内不能使用sqlSession进行关闭操作,如sqlSession.close();

(4)配置dao

(5)测试类

 

mybatis和spring整合后,原始mapper代理开发方式

(1)编写UserMapper.xml和UserMapper.java

注意:要遵循的规范就是这两个配置要在同一个目录下

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.company.ssm.mapper.UserMapper">

    <!-- 根据用户id查询用户信息 -->
    <select id="findUserById" parameterType="int" resultType="com.company.ssm.po.User">
        SELECT * FROM USER WHERE  id = #{id}
    </select>

</mapper>

UserMapper.java

package com.company.ssm.mapper;

import com.company.ssm.po.User;

/**
 * UserDao接口
 */
public interface UserMapper {

    /**
     * 通过用户id用户信息
     * @param id
     * @return
     * @throws Exception
     */
    User findUserById(int id) throws Exception;
}

(2)在spring的配置文件(applicationContext)中配置:通过MapperFactoryBean创建代理对象

此方法问题:

需要针对每个mapper进行配置,麻烦。

(3)测试类

public class UserMapperTest {

    private ApplicationContext applicationContext;

    @Before
    public void setUp() throws Exception {
        applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    @Test
    public void findUserById() throws Exception {
        UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
        User user = userMapper.findUserById(33);
        System.out.println(user);
    }
}

通过MapperScannerConfigurer进行mapper扫描(建议使用)

<!-- mapper配置(mapper开发方式)【方式二:批量mapper配置】【推荐】 -->
    <!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
	遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
	自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
	-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定扫描的包名
		如果扫描多个包,每个包中间使用半角逗号分隔
		-->
        <property name="basePackage" value="com.company.ssm.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

配置完成之后, 需要把之前单个的配置代码注释起来,然后运行测试类即可。

测试类能出现预期结果即说明配置正确。

原文地址:https://www.cnblogs.com/chunguang-yao/p/10666417.html