现在我有一个方法,是执行SQL语句的(即增、删、改、查操作),传进来的参数是一条字符串的SQL语句,如下:public boolean doSQL(String sql) {
    if (如果参数 sql 是增、删、改、查的SQL)
        执行 sql
    else
        return false;
}我想用正则来判断参数 sql 是不是增、删、改、查的SQL,这个正则要怎么写

解决方案 »

  1.   

    如果不是为了防范黑客攻击啥的,基本上只要判断第一个关键词就行了。SQL语法中,基本上都是用第一个关键词来表明该DML种类的:
    Select ... From ...
    Delete From ...
    Insert Into ...
    比较诡异的是:
    Select ... From ... Into table   --查询出一组数据然后写入表中
    但其实一般开发过程中不允许这么玩表的,都会专用存储过程来处理。
      

  2.   


    恩,我只要判断它第一个词是不是以“INSERT”、“DELETE”、“UPDATE”或“SELECT”开头
      

  3.   

    建议交给数据库自己去做,然后用try {} catch{},如果DB编译不通过的话会抛出相应的错误,可以通过error code来判断是不是sql编译问题;
    也可以在外面简单的判断一下,
    大多数的增、删、改都是以insert into, delete, update 开头的,
    查询的情况就有很多种了,普通的语句一般用select 开头, 也可以带with () select 开头, 如果是调用存储过程则以call 开头
    你可以用sql.startWith("")简单的判断一下
      

  4.   


    恩,我不想用startWith,我就想用正则,不知道正则要怎么写
      

  5.   

    同3楼,你用startWith性能应该比正则还高点,虽然写起来繁琐些。String tmp = sql.trim().toLowerCase();
    if (tmp.startWith("select") || tmp.startWith("delete") || ...)
      

  6.   


    如果我的sql非常长呢,比如我把一张好几MB的图片转成二进制流insert到数据库,也要toLowerCase()吗
      

  7.   

    那就亏了,改为:
    String tmp = sql.trim().substring(0,6).toLowerCase();
      

  8.   

    startWith方法是测字符串的前缀,所以执行效率与String的长度无关.相信我,它比substring(0,6)速度更快更通用,因为还要考虑insert into 和 delete