spring整合mybatis

Posted 请叫我小老弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring整合mybatis相关的知识,希望对你有一定的参考价值。

spring整合mybatis的主要工作就是把mybatis框架使用中所涉及的核心组件配置到spring容器中,交给spring来创建和管理。spring可以接管mybatis配置信息的维护工作,我们选择把数据源配置和sql映射信息转移至spring配置文件中进行管理,以了解如何在spring中配置mybatis。

由于spring3的开发在mybatis3官方发布之前就结束了,spring开发团队不想发布一个基于非发布版本的mybatis的整合支持,因此spring3并没有提供对mybatis3的支持。为了使spring3支持mybatis3,mybatis团队按照spring集成orm框架的统一风格开发了相关整合组件,方便开发者在spring中集成使用mybatis。即使用mybatis-spring依赖。

spring-jdbc依赖是spring对数据源的支持,spring-tx依赖是spring对事物的支持。

mapper文件如下

<?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="edu.cn.dao.UserMapper">
<select id="getUserList" resultMap="userList" parameterType="User"> select u.*, r.roleName from smbms_user u, smbms_role r where u.userName like connect (‘%‘, #{userName}, ‘%‘) and u.userRole=#{userRole} and u.userRole=r.id </select> <resultMap id="userList" type="User"> <result property="userRoleName" column="roleName"/> </resultMap> </mapper>

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>
    <typeAliases>
        <package name="edu.cn.pojo"/>
    </typeAliases>
</configuration>

spring配置文件如下

配置DataSource

在spring配置数据源,首先要选择一种具体的数据源实现技术,目前流行的数据源实现有dbcp、c3p0、Proxool等,它们都实现了连接池功能。以dbcp数据源为例,dbcp数据源隶属于apache commons项目,使用dbcp数据源需要添加commons-dbcp和commons-pool依赖。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url">
        <value><![<![CDATA[
            jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8            
        ]]></value>
    </property>
    <property name="username" value="root"/>
    <property name="password" value="123"/>
</bean>

因为url属性的值包含特殊符号“&”,所以赋值时使用了<![CDATA[]]标记,也可将其替换为实体引用“&amp;”,如下所示

<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&amp;characterEncoding=utf-8"/>

配置SqlSessionFactoryBean

在mybatis中,SqlSessionFactory的实例需要使用SqlSessionFactoryBuilder创建,而在集成环境中,则可以使用mybatis-spring整合包中的SqlSessionFactoryBean来代替。SqlSessionFactoryBean封装了使用SqlSessionFactoryBuilder创建SqlSessionFactory的过程,我们可以在spring中以配置文件的形式,通过配置SqlSessionFactoryBean获得SqlSessionFactory实例。

<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="classpath:edu/cn/dao/**/*.xml"></property>
    <property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>

classpath:edu/cn/dao/**/*.xml表示扫描edu.cn.dao包及其任意层级子包中任意名称的xml类型的文件

除了数据源和sql映射信息,其他的mybatis配置信息也可以转移至spring配置文件中进行维护,只需要通过SqlSessionFactoryBean的对应属性进行赋值即可。

使用SqlSessionTemplate进行持久化操作

在集成环境中,为了更好的使用SqlSession,充分利用spring框架提供的服务,mybatis-spring依赖提供了SqlSessionTemplate类。SqlSessionTemplate类实现了mybatis的SqlSession接口,可以替换mybatis中原有的SqlSession实现类来提供数据库访问操作。使用SqlSessionTemplate可以更好的与spring服务融合并简化部分流程化的工作,还可以保证和当前spring事务相关联、自动管理会话的生命周期,包括必要的关闭、提交和回滚操作。

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSession;

    @Override
    public List<User> getUserList(User user){
        return sqlSession.selectList("edu.cn.dao.UserMapper.getUserList", user);
    }

    public SqlSessionTemplate getSqlSession(){
        return sqlSession;
    }

    public void setSqlSession(SqlSessionTemplate sqlSession){
        this.sqlSession = sqlSession;
    }
}
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
</bean>

<bean id="userMapper" class="edu.cn.dao.UserMapperImpl">
    <property name="sqlSession" ref="sqlSessionTemplate"/>
</bean>

创建SqlSessionTemplate实例时,需要通过其构造方法注入SqlSessionFactory实例。

与mybatis中默认的SqlSession实现不同,SqlSessionTemplate是线程安全的,可以以单例模式配置并被多个dao对象共用,而不必为每个dao单独配置一个SqlSessionTemplate实例

业务层

public class UserServiceImpl implements UserService{
    private UserMapper userMapper;

    @Override
    public List<User> findUsersWithConditions(User user){
        try{
            return userMapper.getUserList(user);
        }catch(RuntimeException e){
            e.printStackTrace();
            throw e;
        }
    }

    public UserMapper getUserMapper(){
        return userMapper;
    }

    public void setUserMapper(UserMapper userMapper){
        this.userMapper = userMapper;
    }
}
<bean id="userService" class="edu.cn.dao.UserServiceImpl">
    <property name="userMapper" ref="userMapper"/>
</bean>

测试

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-jdbc.xml");
UserService userService = (UserService) ctx.getBean("userService");
User userCondition = new User();
userCondition.setUserName("ygb");
userCondition.setUserRole(3);
List<User> userList = new ArrayList<Usre>();
userList = userService.findUsersWithConditions(userCondition);
for (User userResult : userList) {
    logger.debug("testGetUserList userCode:"
        + userResult.getUserCode() + "and userName:"
        + userResult.getUserName() + "and userRole:"
        + userResult.getUserRole() + "and userRoleName:"
        + userResult.getUserRoleName() + "and address:"
        + userResult.getAddress());
}

mybatis-spring依赖提供了SqlSessionDaoSupport类来简化SqlSessionTemplate的配置和获取,如下

public class UserMapperImpl extends SqlSessionDaoSupport
             implements UserMapper{
    @Override
    public List<User> getUserList(User user){
        return this.getSqlSession().selectList("edu.cn.dao.UserMapper.getUserList", user);
    }
}        

此时,spring配置文件中就无需配置SqlSessionTemplate了。

SqlSessionDaoSupport类提供了setSqlSessionFactory()方法用来注入SqlSessionFactory实例并创建SqlSessionTemplate实例,同时提供了getSqlSession()方法用来返回创建好的SqlSessionTemplate实例。

 

以上是关于spring整合mybatis的主要内容,如果未能解决你的问题,请参考以下文章

请教mybatis+spring+atomikos的整合问题

7.Spring:整合Mybatis

基于Spring+SpringMVC+MyBatis开发书评网Spring和MyBatis的整合

Spring-整合Mybatis

最新最全面的Spring详解——Spring-Mybatis整合

Spring Boot:Spring Boot整合Mybatis案例