zoukankan      html  css  js  c++  java
  • prignMVC+myBatis整合—— 基于MapperFactoryBean

    学习本节内容请先看"MyBatis的基本应用"。地址:http://lydia-fly.iteye.com/admin/blogs/2152948

    Spring与MyBatis整合需要引入mybatis-spring.jar文件包。

    其提供了与整合相关的API:

    SqlSessionFactoryBean

    --为整合应用提供SqlSession对象资源

    MapperFactoryBean

    --根据指定的Mapper接口生成Bean实例

    MapperScannerConfigurer

    --根据指定包批量扫描Mapper接口并生成实例

    SqlSessionFactoryBean:

    在单独使用MyBatis时,所有操作都是围绕SqlSession展开的,SqlSession是通过SqlSessionFactory获取的,SqlSessionFactory又是通过SqlSessionFactoryBuilder创建生成的。

     在SpringMvc+MyBatis整合时,同样需要SqlSession。SqlSessionFactoryBean这个组件通过原来的SqlSessionFactoryBuilder生成SqlSessionFactory对象,为整合应用提供SqlSession对象。

    Java代码  收藏代码
    1. <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">  
    2.     <property name="driverClassName" value="oracle.jdbc.OracleDriver" />  
    3.     <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />  
    4.     <property name="username" value="jsd1403" />  
    5.     <property name="password" value="root" />  
    6. </bean>  
    7.   
    8. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
    9.     <property name="dataSource" ref="myDataSource" />  
    10.     <property name="mapperLocations" value="classpath:com/lydia/entity/*.xml" />  
    11. </bean>  

    MapperFactoryBean:

    其作用是根据Mapper接口获取我们想要的Mapper对象,它封装了原有的session.getMapper()功能的实现。

    在定义MapperFactoryBean时,需要注入一下两个属性:

    --SqlSessionFactoryBean对象,用于提供SqlSession

    --要返回Mapper对象的Mapper接口

    MapperFactoryBean配置如下:

    Java代码  收藏代码
    1. <!-- 方法一:定义mapper -->  
    2.     <bean id="deptMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
    3.         <property name="mapperInterface" value="com.lydia.entity.DeptMapper"></property>  
    4.         <!-- 指定SqlSessionFactoryBean对象 -->  
    5.         <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>  
    6.     </bean>  

    MapperScannerConfigurer配置使用:

    注意:使用MapperFactoryBean时,当有一个Mapper(可以理解为表对应的映射文件)就MapperFactoryBean,当mapper少数可以通过applicationContext配置文件,通过id获取。

    如果大量的mapper,需要使用mybatis-spring.jar通过的MapperScannerConfigurer组件,通过这个组件可以自动扫描指定包下的各个Mapper接口,并注册对应的MapperFactoryBean对象。

    把之前的MapperFactoryBean的配置注释掉,换成如下配置依然执行通过:

    Java代码  收藏代码
    1. <!--方法2:  
    2.         可以把扫描到的Mapper接口变成Mapper对象-->  
    3. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
    4.     <!--指定要扫描包: 多个包用逗号隔开 -->  
    5.     <property name="basePackage" value="com.lydia,com.tarena" />  
    6.     <!--指定sqlSessionFactory -->  
    7.     <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>  
    8. </bean>  

       注意:上面sqlSessionFactory属性也可以不用指定,默认会以Autowired方式注入。

       如果指定的某个包下并不完全是我们定义的Mapper接口,我们也可以通过自定义注解的方式指定生成MapperFactoryBean对象。

    配置如下:

    Java代码  收藏代码
    1. <!--方法3:  
    2.     只要Mapper类前面加上@MyBatisRepository 这个自己指定的注解就OK-->  
    3.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
    4.         <property name="basePackage" value="com.lydia" />  
    5.         <property name="annotationClass" value="com.lydia.annotation.MyBatisRepository" />  
    6.     </bean>  

     

    自定义注解:MyBatisRepository.java 

    Java代码  收藏代码
    1. public @interface MyBatisRepository {  
    2. }  

    在DeptMapper接口中使用: 

    Java代码  收藏代码
    1. //@Repository("deptMapper")  
    2. @MyBatisRepository  
    3. public interface DeptMapper {  
    4.     void addDept(Dept dept);  
    5.     void deleteDept(Dept dept);  
    6.     void updateDept(Dept dept);  
    7.     ......  
    8. }  

     

     测试:

    Java代码  收藏代码
    1. public class TestCase {  
    2.     @Test  
    3.     public void testFindAll() throws Exception {  
    4.         String conf = "applicationContext.xml";  
    5.         ApplicationContext ac = new ClassPathXmlApplicationContext(conf);  
    6.         //获取对应的mapper对象,并调用mapper接口中对应的方法  
    7.         DeptMapper mapper = ac.getBean("deptMapper", DeptMapper.class);  
    8.         List<Dept> lists = mapper.findAllDept();  
    9.         for (Dept dept : lists) {  
    10.             System.out.println(dept);  
    11.         }  
    12.     }  
  • 相关阅读:
    工单系统(帮助中心)
    理解RESTful架构
    trace显示不出东西
    thinkphp
    在一个元素中查找子元素
    阻止表单元素失去焦点
    RelativeLayout不能调用measure去直接测量子元素
    兼容加载Xml字符串
    IE下载时提示无法下载,重试后成功
    借用layer让弹层不限制在iframe内部
  • 原文地址:https://www.cnblogs.com/ajing2018/p/10085818.html
Copyright © 2011-2022 走看看