Spring-mybatis-MapperFactoryBeanのマッピングインタフェース

7753 ワード

SqlSessionDaoSupportまたはSqlSessionTemplateを手動で使用してデータ・アクセス・オブジェクト(DAO)を記述するコードの代わりに、MyBatis-Springは、動的エージェントの実装であるMapperFactoryBeanを提供します.このクラスは、サービス層beanにデータマッパインタフェースを直接注入することができます.マッパーを使用する場合は、DAOを呼び出すように呼び出すだけでいいですが、MyBatis-Springがエージェントを作成するので、DAO実装のコードを書く必要はありません.同様に、MapperFactoryBeanによって作成されたエージェントは、セッションのオープンとクローズを制御します.
MapperFactoryBeanを使用する場合は、マッピングインタフェースでsql文を提供するか、マッピングファイルでsql文を提供することができます.
1、spring.xml
  
  
   
  
      
      
      
      
      
      
      
          
          
          
          
          
          
          
          
    
    
    
      
          
    
       
     	   
     	  
      
    
 

2、データマッピングインターフェース:
package cn.edu.nuc.dao;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import cn.edu.nuc.bean.User;

public interface UserMapper {
	@Select("SELECT * FROM user WHERE id = #{id}")   
    User getUser(@Param("id") long id);
}
、サービス層:(
dao層を使わずに直接データマッパーインタフェースをservice層に注入することができます)

packagecn.edu.nuc.service.impl;

 

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Service;

importcn.edu.nuc.bean.User;

importcn.edu.nuc.dao.UserMapper;

importcn.edu.nuc.service.UserService;

 

@Service

public classUserServiceImpl implements UserService {

@Autowired

privateUserMapper userMapper;

 

publicUser getUserById(Long id) {

returnuserMapper.getUser(id);

}

}


MapperFactoryBeanが作成したプロキシクラスは、UserMapperインタフェースを実装し、アプリケーションに注入します.エージェントがランタイム環境(Runtime,訳者注)で作成されるため、指定したマッパーは特定のインプリメンテーションクラスではなくインタフェースでなければなりません.4、テスト:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.edu.nuc.bean.User;
import cn.edu.nuc.service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring.xml"})
public class UserServiceTest {
	@Autowired  
    	private UserService userService;  
	
	@Test
	public void getUserTest() {
		Long id = 1L;
		User user = userService.getUserById(id);
		
		System.out.println(user.getName());
	}
	
}

分析:
1)MapperFactoryBeanが作成したエージェントクラスはUserMapperインタフェースを実現し,アプリケーションに注入する.エージェントがランタイム環境(Runtime,訳者注)で作成されるため、指定したマッパーは特定のインプリメンテーションクラスではなくインタフェースでなければなりません.
2)データマッパインタフェースUserMapperは、spring管理に注釈を書いて渡し、サービス層に注入する必要はありません.UserMapperインタフェースは、MapperFactoryBeanが作成したプロキシクラスで実装され、springのiocコンテナに自動的に配置されるため、Service実装にはMapperFactoryBeanが作成したプロキシクラスが注入されます.
補足:
SpringのXMLプロファイルにすべてのマッパーを登録する必要はありません.逆に、クラスパスの下にあるマッパーを検索し、自動的にマッパーファクトリBeanとして作成するMapperScannerConfigurerを使用できます.MapperScannerConfigurerを作成するには、Springの構成に次のコードを追加します.
 
basePackageプロパティは、マッパーインタフェースファイルに基本的なパッケージパスを設定することです.区切り記号としてセミコロンまたはカンマを使用して、複数のパケットパスを設定できます.各マッパは、指定したパケットパスで再帰的に検索されます.
したがって、上記のspringプロファイルは次のように変更できます.
...
        
     
         
   
   
 
        
注意:
1)S qlSessionFactoryまたはS qlSessionTemplateを指定する必要はありません.なぜなら、MapperScannerConfigurerはMapperFactoryBeanを作成し、自動的にアセンブリするからです.ただし、1つ以上のデータソースを使用すると、自動アセンブリが無効になる可能性があります.この場合、sqlSessionFactoryBeanNameまたはsqlSessionTemplateBeanNameプロパティを使用して、正しいbean名を設定して使用できます.これがどのように構成されているのか、beanの参照ではなくbeanの名前が必要であることに注意してください.そのため、value属性はここで通常のrefに代わります.
MapperScannerConfigurerは、指定した作成インタフェースまたは注釈によるマッパーのフィルタリングをサポートします.annotationClassプロパティは、検索する注釈の名前を指定します.markerInterfaceプロパティは、検索する親インタフェースを指定します.両方が指定されている場合、インタフェースに追加されたマッパーは2つの基準に一致します.デフォルトでは、両方のプロパティはnullなので、ベースパッケージで指定されたすべてのインタフェースをマッパとしてロードできます.
2)MapperScannerConfigurerは、実際にはMapperFactoryBeanと同様に、プロキシを作成してspringに注入します.違いは前者がデータマッパインタフェースを自動的にスキャンし、エージェントクラスを生成し、Springのコンテナに注入することである.
参照先:http://www.mybatis.org/spring/zh/mappers.html