iBatis的dynamic动态查询问题

  昨天,在对一个用iBatis框架做持久层的模块进行修改时,发生了一件奇怪的事情。我对一个实体类增加了一个属性,在对应数据表增加了一个字段,接下来就是配置映射文件。在我确保映射文件配置无误之后进行测试,一直无法保存进数据库,错误日志提示说dynamic标签下只能包含哪些哪些类型,看似动态查询的配置这里有问题。

  改之前的动态查询配置如下:


	#gtid:NUMERIC# ]]>
		         			
		         
		         	
		         	
		         	
	#gtvalidityFlag:NUMERIC# ]]>
		         			
		       
  改之后的动态查询配置如下,只在最后增加了一个businessRangeCode属性:

	#gtid:NUMERIC# ]]>
		         			
		         
		         	
		         	
		         	
	#gtvalidityFlag:NUMERIC# ]]>
		         			
		 
	        
  其中PlusPercentTagCallback是一个实现了TypeHandlerCallback接口的自定义handler,作用是在属性的前后加上%构成模糊查询。在修改配置文件之前,PlusPercentTagCallback已经被使用过,是正确的。而且在检查了几次其它配置信息后,我可以确保除了动态查询外的所有配置都是对的,我不敢确保动态查询配置无误的原因是日志报的就是动态查询的错,但我看来看去又确实没发现什么问题。

  于是,我尝试将dynamic中新加的businessRangeCode那一行去掉,结果能正确保存到数据库了!

  接着,我又做了个测试,在dynamic的最后加回businessRangeCode那一行,不过将handler去掉,换成了VARCHAR,如下:


	#gtid:NUMERIC# ]]>
		         			
		         
		         	
		         	
		         	
	#gtvalidityFlag:NUMERIC# ]]>
		         			
		 
	        
  
  结果也能成功保存到数据库!

  问题似乎就在PlusPercentTagCallback这个handler上,但我不解的是为什么原来没问题的handler,被我一用就报错?RP真有这么差?我就在那里变来变去的做各种测试,每次改完映射文件都要重启啊,每次都在重启完成的那一瞬间迫不及待地做测试。

  测着测着一个神奇的结果出现了:businessRangeCode那一行用上PlusPercentTagCallback这个handler也能成功保存到数据库了,只是改变的该行所在的位置,从最后一行移到中间去,如下:


	#gtid:NUMERIC# ]]>
		         			
		         
		         	
		         	
		         	
	        
	#gtvalidityFlag:NUMERIC# ]]>
		         			
		 
  
  莫非dynamic下的配置信息有顺序的规定?还是用handler的属性得放在一起?还是其他我不知道的规定?但在网上搜索不到相应的结果。此时问题已经解决,我也没有更多的时间去刨根问底了。

  今天,我好奇又去测试了下昨天的那个动态查询的配置,结果让我完全无语了!我把配置还原为修改后的第一个版本,即


	#gtid:NUMERIC# ]]>
		         			
		         
		         	
		         	
		         	
	#gtvalidityFlag:NUMERIC# ]]>
		         			
		 
	        
  
  结果能成功保存了!完全一样的配置,昨天不能保存,今天能保存,这究竟是谁在逗我玩呢!似乎昨天做的都是自作聪明的无用功。到现在还想不清楚到底是哪个环节出了问题,莫非RP不是传说。。。

你可能感兴趣的:(iBatis)