Mybatisの汎用エニュメレート・プロセッサ

5141 ワード

mybatis自身はエムType HandlerとEnumOrdinalType Handlerを提供してエニュメレーションの種類処理をしていますが、フレキシブルではないです。エニュメレーションの名前とエニュメレーションの間をマッピングしました。EnumOrdinalType Handlerはエニュメニュメレーションのordinary、つまり順番と枚の間をマッピングしました。この二つを超えると、自分で手を打つ必要があります。
本論文の実現効果:
クエリー1:
List selectByUserType(UserType userType);
クエリー2:
User selectById(@Param("id") int id);


    
    
    
    
挿入:
Integer insertUser(User user);

    insert into user_enum(id, name, password, user_type)values(#{id}, #{name}, #{password}, #{userType,typeHandler=com.chrhc.mybatis.handler.EnumHandler})
使用する列挙:
public enum UserType implements Identifiable {
	
	TEACHER(1), STUDENT(2);
	
	private int type;
	
	private UserType(int type){
		this.type = type;
	}
	
	@Override
	public Integer getId(){
		return this.type;
	}
	
}
必要なのは、あなたのエニュメレーションがIdentifiableインターフェースを実現するだけでいいです。
githubアドレス:https://github.com/xjs1919/enumhandler
--------------------------
他の処理をしないならば、mapper.xmlの中で私達のカスタマイズしたエニュメレート・プロセッサーを使いたいです。エニュメレーションを使うところにtypeHandler=「comp.chrhc.mybatis.handler.EnumHandler」を追加しなければなりません。かなり不便です。もっと便利な方法は先にこれらの列挙を登録しておけば、xmlの中がきれいになります。
私達がカスタマイズしたSql Session FactoryBenを設定します。

	
	
		
		
		
		
		
		
			
				classpath*:com/weike/pc/dao/*Mapper.xml
			
		
		
            
                
                	
			          
			            dialect=mysql
			          
			        
                
            
        
	
//     SqlSessionFactoryBean       ,    ScanEnumSqlSessionFactoryBean,      :
public class ScanEnumSqlSessionFactoryBean extends SqlSessionFactoryBean implements FactoryBean, InitializingBean, ApplicationListener {
	  //        ,  Enum base package
	  private String enumBasePackage;
	  //        ,  Alias base package
	  private String aliasBasePackage;
	  
	  public void setEnumBasePackage(String enumBasePackage) {
		  this.enumBasePackage = enumBasePackage;
	  }

	  public void setAliasBasePackage(String aliaseBasePackage) {
			this.aliasBasePackage = aliaseBasePackage;
	  }
	  protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
 	    .....................
	    //alias
	    if (hasLength(this.aliasBasePackage)) {
	    	ResolverUtil> resolverUtil = new ResolverUtil>();
	        resolverUtil.find(new ResolverUtil.IsA(BaseEntity.class), this.aliasBasePackage);
	        Set>> mTypes = resolverUtil.getClasses();
	        for (Class> javaTypeClass : mTypes) {
	        	 logger.debug("Registered Alias : '" + javaTypeClass.getName() + "'");
	        	 configuration.getTypeAliasRegistry().registerAlias(javaTypeClass);
	        }
	    }
	    
	    //enum
	    if (hasLength(this.enumBasePackage)) {
	    	ResolverUtil> resolverUtil = new ResolverUtil>();
	        resolverUtil.find(new ResolverUtil.IsA(Identifiable.class), this.enumBasePackage);
	        Set>> mTypes = resolverUtil.getClasses();
	        for (Class> javaTypeClass : mTypes) {
	        	 logger.debug("Registered Enum type handler: '" + javaTypeClass.getName() + "'->"+CommonEnumHandler.class.getName());
	        	configuration.getTypeHandlerRegistry().register(javaTypeClass, CommonEnumHandler.class);
	        }
	    }
	    .....................
}
今はmapp.xmlがとても綺麗です。
参考:http://blog.csdn.net/fighterandknight/article/details/51599116 でも、ここではmybatisのソースコードを修正しません。