Spring(六):配置SqlSessionFactory,整合Mybatis

    要利用Mybatis首先是須要導入mybatis-3.3.0.jar,其次,要整合Spring和Mybatis須要導入mybatis-spring-1.2.3.jarjava

一、Spring整合Mybatis的xml配置

經常使用配置:
web

(若是在mybatis-config.xml利用<mappers>進行xml映射文件的配置,就能夠不用配置下面的mapperLocation屬性了)spring

<!-- mybatis文件配置,掃描全部mapper文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
      p:dataSource-ref="dataSource"
      p:configLocation="classpath:mybatis-config.xml"
      p:mapperLocations="classpath:com/eliteams/quick4j/web/dao/*.xml"/>

<!-- spring與mybatis整合配置,掃描全部dao,在單數據源的狀況下能夠不寫sqlSessionFactoryBeanName -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
      p:basePackage="com.eliteams.quick4j.web.dao"
      p:sqlSessionFactoryBeanName="sqlSessionFactory"/>


二、Spring和Mybatis整合的三種方式

  • SqlSessionFactoryBean來替代SqlSessionFactoryBuilder來建立SqlSessionsql

  • 利用mybatis映射文件**.xml來配置apache

    SqlSessionFactoryBean有一個必須屬性dataSource,另外其還有一個通用屬性configLocation(用來指定mybatis的xml配置文件路徑)。mybatis

Spring的xml配置:app

      <!-- 建立SqlSessionFactory,同時指定數據源-->
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource" /> 
          <!-- 指定sqlMapConfig總配置文件,訂製的environment在spring容器中不在生效-->
          <property  name="configLocation"  value="classpath:sqlMapConfig.xml"/>
      </bean>

mybatis總配置文件sqlMapConfig.xml:dom

<configuration>
  <typeAliases>
     <typeAlias type="com.xxt.ibatis.dbcp.domain.User" alias="User" />
  </typeAliases>
  <mappers>
     <mapper resource="com/xxt/ibatis/dbcp/domain/userMapper.xml" />
  </mappers>
</configuration>

userMapper.xml:ui

<mapper namespace="com.xxt.ibatis.dbcp.dao.UserDao">
     <resultMap type="User" id="userMap">
        <id property="id" column="id" />
        <result property="name" column="name" />
        <result property="password" column="password" />
        <result property="createTime" column="createtime" />
     </resultMap>
     <select id="getUserById" parameterType="int" resultMap="userMap">
       select * from user where id = #{id}
     </select>
<mapper/>

DAO層接口類UserDao.java:注意此處定義的接口方法須要和UserMapper.xml映射的<select>標籤的id對應this

public interface UserDao {
    public User getUserById(int id);
}

須要操做數據時調用的類UserService.java:

public class UserService {
     //此處省略sqlSession的獲取方法
     private SqlSession sqlSession;
     private UserDao userDao;
     public User getUserById(int id) {
         return userDao.getUserById(id);
     }
}



  • SqlSessionFactoryBean來替代SqlSessionFactoryBuilder來建立SqlSession

  • 採用數據映射器(MapperFactoryBean)的方式

  • 不用寫mybatis映射文件

  • 採用註解方式提供相應的sql語句和輸入參數。

Spring的xml配置:

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

      <!--建立jdbc數據源 -->
      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          <property name="driverClassName" value="${driver}"/>
          <property name="url" value="${url}"/>
          <property name="username" value="${username}"/>
          <property name="password" value="${password}"/>
          <property name="initialSize" value="${initialSize}"/>
          <property name="maxActive" value="${maxActive}"/>
          <property name="maxIdle" value="${maxIdle}"/>
          <property name="minIdle" value="${minIdle}"/>
      </bean>

      <!-- 建立SqlSessionFactory,同時指定數據源-->
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource" /> 
      </bean>

      <!--建立數據映射器,數據映射器必須爲接口-->
      <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
          <property name="mapperInterface" value="com.xxt.ibatis.dbcp.dao.UserMapper" />
          <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
      </bean>

      <bean id="userDaoImpl" class="com.xxt.ibatis.dbcp.dao.impl.UserDaoImpl">
          <property name="userMapper" ref="userMapper"/>
      </bean>

數據映射器UserMapper.java:

public interface UserMapper {
        @Select("SELECT * FROM user WHERE id = #{userId}") 
        User getUser(@Param("userId") long id); 
}

DAO接口類UserDao.java:

public interface UserDao {
       public User getUserById(User user);
}

DAO接口實現類UserDaoImpl.java:

public class UserDaoImpl implements UserDao {
       private UserMapper userMapper;

       public void setUserMapper(UserMapper userMapper) { 
           this.userMapper = userMapper; 
       } 

       public User getUserById(User user) {
          return userMapper.getUser(user.getId()); 
       }
}


  • SqlSessionFactoryBean來替代SqlSessionFactoryBuilder建立SqlSession

  • 不採用採用數據映射器(MapperFactoryBean)的方式,改成MapperScannerConfigurer 進行掃描

  • 不用寫mybatis映射文件

  • 採用註解方式提供相應的sql語句和輸入參數。

  • 採用註解方式省去定義mapper的Bean

    MapperFactoryBean 建立的代理類實現了 UserMapper 接口,而且注入到應用程序中。 由於代理建立在運行時環境中(Runtime,譯者注) ,那麼指定的映射器必須是一個接口,而 不是一個具體的實現類。

    上面的MapperFactoryBean配置有一個很大的缺點,就是系統有不少的配置文件時 所有須要手動編寫,因此上述的方式已經不用了。

    沒有必要在 Spring 的 XML 配置文件中註冊全部的映射器。相反,你可使用一個 MapperScannerConfigurer , 它將會查找類路徑下的映射器並自動將它們建立成MapperFactoryBean。

Spring的xml配置:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

    basePackage 屬性是讓你爲映射器接口文件設置基本的包路徑。 你可使用分號或逗號 做爲分隔符設置多於一個的包路徑。每一個映射器將會在指定的包路徑中遞歸地被搜索到。

    注 意 , 沒有必要去指定SqlSessionFactory 或 SqlSessionTemplate , 由於 MapperScannerConfigurer 將會建立MapperFactoryBean,以後自動裝配。可是,若是你使 用了一個 以上的 DataSource,那 麼自動裝配可能會失效 。這種狀況下 ,你可使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 屬性來設置正確的 bean 名稱來使用。

相關文章
相關標籤/搜索