Spring整合MyBatis

在web.xml中注册加载Spring

<!--部署spring的applicationContext的xml文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext.xml</param-value>
    </context-param>

    <!-- 编码过滤器 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

注意:需要注册dispatcher-servlet(springmvc的配置文件spring才有效自动装配


Spring配置文件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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       ">

     <!-- 以下三个:注解驱动,注解配置,包扫描可以去掉
          spring配置文件applicationContext.xml和springmvc配置文件dispatcher-servlet.xml
          共用一个spring IoC容器,这些扫描驱动配置在任何一个文件配置即可
          分开两个文件是让,springmvc文件更加关注web方面,spring文件是通用的 -->
     <mvc:annotation-driven />
     <context:annotation-config />
     <context:component-scan base-package="xyz.cglzwz.*"/>

     <!-- 加载classpath下的db.properties文件(resources目录下) -->
     <context:property-placeholder location="classpath:jdbc.properties"/>

     <!-- 配置一个数据源连接 -->
     <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
          <property name="driverClass" value="${mysql.driver}"/>
          <property name="url" value="${mysql.url}"/>
          <property name="username" value="${mysql.username}"/>
          <property name="password" value="${mysql.password}"/>
     </bean>

     <!-- 配置SqlSessionFactory, org.mybatis.spring.SqlSessionFactoryBean是Mybatis社区开发用于整合Spring的bean -->
     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <!-- 加载mybatis全局配置文件sqlMapConfig.xml -->
          <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
          <!-- 加载数据源,引用上面配好的bean -->
          <property name="dataSource" ref="dataSource"/>
          <!-- 加载映射器xml文件 -->
          <property name="mapperLocations" value="classpath:xyz/cglzwz/mapper/*.xml"/>
     </bean>

     <!-- 自动生成DAO层实现,DAO接口不加@Repository也可以(毕竟那些接口不是实体类) -->
     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
          <property name="basePackage" value="xyz.cglzwz.dao"/>
          <!-- 注意以下是value,不是ref, 因为参数类型是java.lang.String -->
          <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
     </bean>

     <!-- JDBC事务管理器 -->
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource"/>
     </bean>

     <!-- 启用annotation注解方式事务管理
     <tx:annotation-driven transaction-manager="transactionManager"/>
     -->
</beans>

在定义sqlSessionFactory这个bean的时候配置了MyBatis全局配置文件这个属性和扫描mapper文件这个属性, 所以MyBaits全局文件没啥配置了

!-- 配置SqlSessionFactory, org.mybatis.spring.SqlSessionFactoryBean是Mybatis社区开发用于整合Spring的bean -->
     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <!-- 加载mybatis全局配置文件sqlMapConfig.xml -->
          <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
          <!-- 加载数据源,引用上面配好的bean -->
          <property name="dataSource" ref="dataSource"/>
          <!-- 加载映射器xml文件 -->
          <property name="mapperLocations" value="classpath:xyz/cglzwz/mapper/*.xml"/>
     </bean>

MyBaits全局配置sqlMapConfig.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>

    <!-- alias别名 -->
    <typeAliases>
        <typeAlias alias="user" type="xyz.cglzwz.domain.User"/>
        <typeAlias alias="book" type="xyz.cglzwz.domain.Book"/>
    </typeAliases>

    <!-- 已经在spring配置数据源 -->
    <!-- 事务管理没有配置 -->

    <!-- 映射文件已经在spring sql里面配置了
    <mappers>
        <package name="xyz.cglzwz.mapper"/>
    </mappers>
    -->
</configuration>

相应的目录结构

Spring整合MyBatis

调用

Spring整合MyBatis

直接定义一个 自动注入@Autowired 的DAO接口成员,直接调用接口方法即可。
无需如单纯的MyBatis那样 sqlSession.getMapper(接口.class) 这样获取接口对象。

DAO层的接口无需标注@Repositoy都可以注入,毕竟接口本来就不能加
接口的会被Spring实现,实体类自动注入容器。

<!-- 自动生成DAO层实现,DAO接口不加@Repository也可以(毕竟那些接口不是实体类) -->
     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
          <property name="basePackage" value="xyz.cglzwz.dao"/>
          <!-- 注意以下是value,不是ref, 因为参数类型是java.lang.String -->
          <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
     </bean>

附: 完整代码地址