Mybatis - 与Spring集成的几种方式详解

MyBatis使用中有两种方式,一种是与其他框架集成,如与Spring集成(项目中大多采用这种方式)。另外一种则是手动获取sqlsession去进行数据操作(测试时会用)。

【1】不与spring集成

即,使用sqlSessionFactory获取sqlSession进行操作。
点击查看:xml形式的增删改查


【2】与spring集成不使用MapperScannerConfigurer

不使用MapperScannerConfigurer,说明需要手动注册dao-Bean或者mapperBean于容器中。Controller或者Service使用方法仍然为调用该bean对应的dao接口方法去进行数据的一系列操作。

步骤如下:

① 配置userMapper.xml (普通的增删改查等具体SQL);

② 配置spring.xml(核心配置文件);

③ 配置spring-userMapper.xml(将dao注册到容器中)。


spring.xml如下:



    
        
            
                classpath:jdbc.properties
            
        
    
    
    
     
        
        
        
        
    


    
    
        
         
        
        
     
       
        
    

    
    
        
    
    
    



配置spring-userMapper.xml (需手动导入到spring.xml)

该文件配置了dao接口对应的bean,spring加载该bean,即可调用对应dao接口的方法进行数据操作。当然也可以直接配置在spring.xml文件中,这里为了显示说明。

如果使用这种方式,那么在模块化开发中,每个dao接口会对应一个如下的配置文件。这样的配置方式将会导致项目中有大量xml文件,所以你可以将dao接口配置的bean集合在一个xml中。

总得来说,建议使用与spring集成2的方式—使用MapperScannerConfigurer。

具体配置如下:



                           
	
    
        
        
        
    


项目中通过dao操作数据的几种情况:

第一种情况:com.web.mapper.UserMapper 使用了注解,接口上面并未使用@Repository注解,没有使用@Repository注解不能自动扫描,但是因为使用了xml将dao-bean注册到容器,所以可以使用。sql语句注解在抽象方法上面,即注解dao,那么肯定不需要sql xml了啊


第二种情况:IUserMapper.java与IUserMapper.xml(具体的增删改查sql)在同一个文件目录下,框架会自动加载对应的xml

即,dao的方法上没有注解SQL,需要配置对应的xml。

不使用MapperScannerConfigurer时,如果xml与dao接口在同一个目录下,那么框架会自动加载;如果xml与dao不在同一个目录下,则需要将xml手动引入到spring.xml。


第三种情况:为sqlSessionFactory增加属性如下

即,加载类路径下的mybatis.xml(将所有需要加载的“*Mapper.xml”引入到了mybatis.xml,那么spring.xml中只需要引入mybatis.xml即可)。


mybatis.xml示例如下:





	
	
	

	
		
	
	
	
	
		
		
	

	
		
			
			
				
				
				
				
			
		
	
	
	
		
		
		
	


第四种情况:为sqlSessionFactory增加属性如下

即,所有的"IUserMapper.xml"都放在了指定路径下(如,com.web.mapperxml),那么如下配置,将会加载该路径下所有的"IUserMapper.xml"文件。

这里每个"IUserMapper.xml"对应一个dao接口中方法对应具体SQL配置。

需要说明的是,如果将数据源等配置在spring.xml中,那么将不会再需要第三种情况中所说的mybatis.xml文件。


                  
           
           classpath*:com/web/mapperxml/**/*.xml
           
         


构建bean之后,需加载对应的sqlStatements—xml或者sql注解

使用方式如下:

@Resource(name="userMapper")
private UserMapper userMapper;

userMapper.addUser(user);

可能会觉得比较乱,这里说明如下。

  • spring-userMapper.xml配置的是dao接口对应的bean;
  • IUserMapper.xml配置的是dao接口抽象方法对应的具体SQL。
  • IUserMapper.xml常与dao接口放在一起,这样框架会自动加载(第二种情况);
  • 如果IUserMapper.xml未与dao接口放在一起,那么建议集体放在指定路径下(第四种情况);
  • spring-userMapper.xml需要手动引入到spring.xml中(如果dao-bean未配置在spring.xml中)。

【3】与spring集成使用MapperScannerConfigurer

不必再使用spring-userMapper.xml, IUserMapper.xml(SQL文件)可是永远少不了的,除非你在Mapper方法上面使用注解SQL。

① spring.xml



    
        
            
                classpath:jdbc.properties
            
        
    
    
    
 
    
    
     
        
        
        
        
    


    
    
        
        
        
        
        
		
              classpath*:com/web/mapper/**/*.xml
            
        
    


    
      
       
      
      
       
       
       
       
       
       
    
    


    
    
        
    
    
    



这里说明一下MapperScannerConfigurer的属性 :

Mybatis - 与Spring集成的几种方式详解_第1张图片

basePackage : 扫描的基础包;

sqlSessionFactoryBeanName:上面配置的sqlsessionFactorybean名字;

annotationClass:过滤注解类(与basePackage 是"与"的关系);

markerInterface:过滤接口(与basePackage 是"与"的关系);

需要说明的是annotationClass和markerInterface只能选择其一,且都是具体类,即markerInterface的值不能为com.web.mapper.*

如果使用markerInterface,则失去了MapperScannerConfigurer的意义,故常使用配置如下 :



注意:通过上述配置,只是不需要spring-userMapper.xml(dao-bean配置文件),IUserMapper.xml文件永远需要(除非你使用注解dao)。


此时项目操作数据情况如下

第一种情况:com.web.mapper.UserMapper 使用了注解,接口上面使用@Repository注解。sql语句在抽象方法上面,这时则不需要IUserMapper.xml映射文件


第二种情况:IUserMapper.java与IUserMapper.xml在同一个文件目录下,框架会自动加载对应的xml


第三种情况:为sqlSessionFactory增加属性如下:


mybatis.xml示例如下:





	
	
	

	
		
	
	
	
	
		
		
	

	
		
			
			
				
				
				
				
			
		
	
	// 将所有的SQL配置文件引入
	
		
	


第四种情况:为sqlSessionFactory增加属性如下:


      classpath*:com/web/mapper/**/*.xml


上面四种情况不再赘述,建议使用第四种情况,将所有的"IUserMapper.xml"文件放在指定路径在,然后为sqlSessionFactory配置属性mapperLocations。


【Tips】
如下配置,则只扫描basePackage下有Repository注解的接口:

 
        
        
        
        
    

总结不论使用哪种方式,基本点不变:sql语句–注解或者xml;映射器接口注入。通常项目中MyBatis与Spring或者SpringBoot整合时,会使用MapperScannerConfigurer,并将所有的*mapper.xml放在src/main/resources/mapper下面,使用mapperLocations统一扫描。

你可能感兴趣的:(#,MyBatis)