前言
在上一篇博客中,我们已经知道了类型转换处理器的具体注册过程,那么在下面,我们将向大家展示如何改造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
小结
好了,终于实现了这功能了,以后在不不需要那么麻烦的写一行行的配置了,直接扫描就可以了。一路过来其实遇到蛮多困难的,不过在自己的坚持下还是解决了,很幸运,也很开心,又进步了一点点。