使用javassist支持mybatis进行结果集自动匹配和指定匹配

2013/03/21 15:18:24 No Comments

在使用mybatis时,经常的写法即使用下面的*写法,这种方法最简单,不用复杂的resultMap.如下所示:

select * from table where condition

在这种写法下,要求一定很严格,即在相应的domain中的属性字段必须和数据库中的字段相一致,否则即不能进行匹配。如果在数据库中,有一个字段为a_id,那么在domain中的属性也必须这样写,写成a_id,这种代码编写方式肯定不符合代码规范。

针对这种情况,在mybatis中就提出一个匹配变量mapUnderscoreToCamelCase,即在碰到有下划线的时候,自动转化为驼峰式的方式。但是这个变量有一个问题,即它会强制进行转换。当我们的domain即有a_id,又有aId的编写方式时,这个变量就一点作用也没有,并且如果进行配置了,还会造成程序出错。

还有一种需求就是,如果我们的domain先于数据库产生,当最终的数据库产生时,需要一种类似在hibernate中的column mapping的需求产生,即数据库中指定字段匹配domain中的指定属性。

经过程序中进行查找,我们发现最终的结果匹配过程是由类FastResultSetHandler来完成的,而在这个实现中,针对在上面的处理过程,是由方法applyAutomaticMappings来完成的。它的方法签名是protected,那么我们是否可以通过继承这个类,然后重写这个方法呢。答案是否定的,因为这个类的初始化已经固化在类Configuration中了,即我们有了实现类,但是mybatis始终不会实现化我们所要求的类。并且,在过程中,mybatis的插件模式即plugin也没有办法,因为类fastResultSetHandler的接口ResultSetHandler只有2个方法,但是整个实现类中有N个方法,我们不可能将所有的方法都重新写一次。

接下来最终的方法就只有一个,即在之前我们所使用的,代码替换。我们需要一个类直接将其实现替换即可。

(更多…)