开发者社区> 问答> 正文

mysql~的问题?报错

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

展开
收起
爱吃鱼的程序员 2020-06-09 10:28:51 416 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

    publicclassMyDialectextendsMySqlDialect{publicStringforTableBuilderDoBuilder(StringtableName){if(tableName.contains(".")){tableName=tableName.replaceLast(".","`")+"`";}return"select*from"+tableName+"where1=2";}}

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

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

    }

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

    2020-06-09 10:29:08
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像