Mybatisの汎用エニュメレート・プロセッサ
5141 ワード
mybatis自身はエムType HandlerとEnumOrdinalType Handlerを提供してエニュメレーションの種類処理をしていますが、フレキシブルではないです。エニュメレーションの名前とエニュメレーションの間をマッピングしました。EnumOrdinalType Handlerはエニュメニュメレーションのordinary、つまり順番と枚の間をマッピングしました。この二つを超えると、自分で手を打つ必要があります。
本論文の実現効果:
クエリー1:
githubアドレス:https://github.com/xjs1919/enumhandler
--------------------------
他の処理をしないならば、mapper.xmlの中で私達のカスタマイズしたエニュメレート・プロセッサーを使いたいです。エニュメレーションを使うところにtypeHandler=「comp.chrhc.mybatis.handler.EnumHandler」を追加しなければなりません。かなり不便です。もっと便利な方法は先にこれらの列挙を登録しておけば、xmlの中がきれいになります。
私達がカスタマイズしたSql Session FactoryBenを設定します。
参考:http://blog.csdn.net/fighterandknight/article/details/51599116 でも、ここではmybatisのソースコードを修正しません。
本論文の実現効果:
クエリー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のソースコードを修正しません。