jfinal中对于mysql数据库取tableName时,使用的方式:
public String forTableBuilderDoBuild(String tableName) {
return "select * from `" + tableName + "` where 1 = 2";
}
或:
`").append(table.getName()).append("`
这个是存在问题的,如果使用的是其它库下的表,比如在库test下,使用`mysql.user`就报错了,因为返回的sql语句是:select xxx from `mysql.user`,这个语句是不能正确执行的。正确的应该是:select xxx from mysql.`user`,只能表名带`号,用户不能带。否则如下语句将报表不存在:arp.addMapping("mysql.user", "user",UserInfo.class);
forTableBuilderDoBuild方法可以改成如下:
public String forTableBuilderDoBuild(String tableName) {
String tmpTableName = tableName;
if(tableName.contains(".")){
int idx = tableName.indexOf('.')+1;
tmpTableName=tableName.substring(0, idx)+"`"+tableName.substring(idx)+ "`";
}
return "select * from " + tmpTableName + " where 1 = 2";
}
建议使用独立的取表名方式,统一处理。
那要改的地方就多了,Dialect中所有生成sql的地方,涉及tableName生成sql时,都要注意这个问题,目前有这类需求的可以通过扩展一下MySqlDialect,例如:
publicclassMyDialectextendsMySqlDialect{publicStringforTableBuilderDoBuilder(StringtableName){if(tableName.contains(".")){tableName=tableName.replaceLast(".","`")+"`";}return"select*from"+tableName+"where1=2";}}这个反馈也是头一次得到,先做下备忘,感谢反馈
if( tableName.contains(".") ){}
分隔字符串的方法可以实现,替换没法实现,而且String类里面应该没有replaceLast方法吧
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。