mysql~的问题

ohaozy 发布于 2016/09/19 11:25
阅读 302
收藏 0

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";
}
建议使用独立的取表名方式,统一处理。

加载中
0
JFinal
JFinal

   那要改的地方就多了,Dialect 中所有生成 sql 的地方,涉及 tableName 生成 sql 时,都要注意这个问题,目前有这类需求的可以通过扩展一下 MySqlDialect,例如:

public class MyDialect extends MySqlDialect {
  public String forTableBuilderDoBuilder(String tableName) {
    if (tableName.contains(".")) {
      tableName = tableName.replaceLast(".", "`") + "`";
    }
    return "select * from " + tableName + " where 1=2";
  }
}

     这个反馈也是头一次得到,先做下备忘,感谢反馈 

0
w
wl1411956542
if(tableName.contains(".")){
    int idx = tableName.indexOf('.')+1;
    tmpTableName=tableName.substring(0, idx)+"`"+tableName.substring(idx)+ "`";

}

分隔字符串的方法可以实现,替换没法实现,而且String类里面应该没有replaceLast方法吧

返回顶部
顶部