修改MyBatis源码实现扫描注册枚举-具体实现

前言

           在上一篇博客中,我们已经知道了类型转换处理器的具体注册过程,那么在下面,我们将向大家展示如何改造mybatis的源码,实现我们自动扫描枚举,自动向万能类型转换处理器中注册我们想要的枚举。



下载mybatis源代码

        大家可以到github去下载mybatis的源码 https://github.com/mybatis/mybatis-3/releases,我是下载其中的3.2.8来做修改的。


mybatis导入myeclipse

         下载好的mybatis是不能导入myeclipse或者eclipse的,需要使用maven编译,才能导入到项目中,导入之后pom文件好像报了错,不过我没有理会它,因为可以正常的修改源码,并且还能编译打包,导入好之后,如下图所示:



修改mybatis源码


修改MappedTypes注解
/**
 * @author Eduardo Macarron
 * @author Fighter
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MappedTypes {
	public Class<?>[] value() default{};
	
	public String[] basePackage() default {};
}

添加BaseEnum接口类
package org.apache.ibatis.type;

/**
 * @author: Fighter168
 */
public interface BaseEnum<E extends Enum<?>, T> {
	public T getValue();
	public String getDisplayName();
}


修改TypeHandlerRegistry的register方法
  public void register(Class<?> typeHandlerClass) {
    boolean mappedTypeFound = false;
    MappedTypes mappedTypes = typeHandlerClass.getAnnotation(MappedTypes.class);
    if (mappedTypes != null) {
      // first scan the enum under basePackage
      for(String basePackage:mappedTypes.basePackage()){
    	    ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
    	    resolverUtil.find(new ResolverUtil.IsA(BaseEnum.class), basePackage);
    	    Set<Class<? extends Class<?>>> mTypes = resolverUtil.getClasses();
    	    for (Class<?> javaTypeClass : mTypes) {
    	        register(javaTypeClass, typeHandlerClass);
    	      }
      }
      // then regist the mappedTypes
      for (Class<?> javaTypeClass : mappedTypes.value()) {
          register(javaTypeClass, typeHandlerClass);
          mappedTypeFound = true;
        }
    }
    if (!mappedTypeFound) {
      register(getInstance(null, typeHandlerClass));
    }
  }

打包mybatis源码

          我们修改好源码后,不能使用eclipse或者myeclipse的直接右键到处jar,要使用maven的打包命令,将源码package,如果打包的方式不对的话,那么打包出来的jar是不能正常使用的,会缺少很多包。


测试修改后的源码

我们讲在之前博客的测试用例  http://blog.csdn.net/fighterandknight/article/details/51520402 的基础上做修改,所以demo 的话就不描述的那么细节了


声明枚举
  首先我们来创建两个测试所用的枚举





扫描指定的枚举包,向万能枚举转化器注册转换



编写mybatis的配置文件
      直接扫描net.itaem.handler下的万能枚举处理器
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration  
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
    <typeHandlers>
    <!-- 
    	这里就不需要为再为每一个枚举都注册一个类型转换器了
		<typeHandler handler="net.itaem.handler.UniversalEnumHandler" 
		javaType="net.itaem.less.PersonType" jdbcType="CHAR"/>
		<typeHandler handler="net.itaem.handler.UniversalEnumHandler" 
		javaType="net.itaem.less.CarType" jdbcType="CHAR"/>
	-->
		<package name="net.itaem.handler"/>
    </typeHandlers>
    <!-- mapping 文件路径配置 -->  
    <mappers>  
        <mapper resource="resource/PersonMapper.xml" />  
        <mapper resource="resource/CarMapper.xml" />  
    </mappers>  
</configuration>



编写测试用例
/**
 * @author: Fighter168
 */
public class SpringTest {

	public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("resource/ApplicationContext.xml");
		PersonDao personDao=(PersonDao) context.getBean("personDao");
		CarDao carDao=(CarDao) context.getBean("carDao");
		List<Person> list=personDao.query();
		for(Person p:list){
			System.out.println(p.toString());
		}
		List<Car> list2=carDao.query();
		for(Car p:list2){
			System.out.println(p.toString());
		}
	}
}

展示结果



关于打包好的mybatis 的jar我已经上传了,需要的朋友可以自己去下载 http://download.csdn.net/detail/fighterandknight/9543058

小结

            好了,终于实现了这功能了,以后在不不需要那么麻烦的写一行行的配置了,直接扫描就可以了。一路过来其实遇到蛮多困难的,不过在自己的坚持下还是解决了,很幸运,也很开心,又进步了一点点。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值