日期:2014-05-16  浏览次数:20413 次

解决Mybatis结合db2时sql语句换行出现的问题

最近项目用到mybatis3.1和db28.1版本的数据库,出现一个问题,我研究半天把mybatis源码给改了,竟然成功解决。

直接入正题:在mybatis映射文件中写sql语句时如果有折行情况就报错,db2说有非法字符。原因是db2数据库默认回车符就是去执行sql语句,db2控制台提供了 'db2 -td;' 这个命令,意思是sql语句以分号结束,这样在控制台执行sql语句时就可以换行了,要命的是即使在控制台该命令也只是在本次回话中有效。但是现在和mybatis结合使用,无法解决这个问题。我想到了改mybatis源码,千辛万苦找到了对应的代码如下:

?org.apache.ibatis.builder.annotation.MapperAnnotationBuilder中buildSqlSourceFromStrings方法负责将xml中sql语句解析出来,但是在将字符串的sql转换成TextSqlNode对象是代码如下:

? 1.?contents.add(new TextSqlNode(sql.toString()));

2. public TextSqlNode(String text) {

? ? ?this.text = text;?

? ??? }

就在第二步mybatis没有对sql字符串中的换行符做处理导致上面的问题,其实代码改动非常小,就是把换行符和回车符替换成空格:

public TextSqlNode(String text) {

this.text = text.replaceAll("\n|\r", " ");

}

至此重新打jar包放到项目中,HLL的成功了!

?

PS:有个小问题,mybatis没有开放ognl相关的类,100多个啊,我一个一个down下来的。求解释。。。

?

附jar包一份~