String sql  = "select * from student_info where flag!=0 and LOCATE(\"12\",day1,1)!=0";上面是准备好的sql 语句,但是我想把它放在函数中,通过函数的参数将两个参数传给sql语句,来替换sql语句中LOCATE函数中的第一个和第二个参数。如:findByArgv(string argv1,string argv2)
{
   String sql  = "select * from student_info where flag!=0 and LOCATE(?,?,1)!=0";
   PreparedStatement ps = DBConnection.getConnection().prepareStatement(sql);
   ps.setString(1,argv1);
   ps.setString(2,argv2);
}
但是我试过了,这样不行!
是什么原因啊?!
求大神指点。。

解决方案 »

  1.   

    有些数据库中字符串使用单引号括起来的如'ABC',加上看看行不行,另外不行的话应该报错把报错信息贴上来吧
      

  2.   

    因为各个数据库的函数库并不一样,所以在JDBC规范当中没有能够直接利用Statement执行"select * from student_info where flag!=0 and LOCATE(\"12\",day1,1)!=0"
    不过在JDBC规范当中如果想要调用某个SQL函数库,也是可以的,贴一段代码
    Connection con=new ConnectionProvider().getConnection();

    CallableStatement cStmt=con.prepareCall("{? = call MYLOCATE(?,?)}");

    cStmt.setString(2, "abs");//设置第二个参数值
    cStmt.setString(3, "eabs");//设置第三个参数值

    cStmt.registerOutParameter(1, Types.INTEGER);//注册第一个参数输出值和数据类型

    cStmt.execute();

    int outputValue=cStmt.getInt(1);//获得第一个参数值,也就是返回值

    System.out.println("outputValue="+outputValue);

    con.close();
    对应的本地函数创建代码
    CREATE DEFINER=`gaoyong`@`%` FUNCTION `mylocate`( s1 varchar(255),s2 varchar(255)) RETURNS int(11)
    BEGIN
        
        
        RETURN locate(s1,s2) ;                                -- 返回值
    END我还没找到直接调用本地MySQL函数库的方法,这里是自己写了mylocate函数再调用函数库的locate,但是最后还是说一句,这种方法通过JDBC调用MySQL本地函数库的效率肯定很低,像locate这个函数最终无非也获取一个函数值,倒不如说用Java实现像locate这样的逻辑。
      

  3.   


    谢谢你!你说的这个方法是不是叫存储过程啊?
    我也想过用JAVA实现这样的逻辑,但是LOCATE函数中第二个参数是数据表中列的名称,我想通过创建一个函数来接受参数告诉SQL查询数据表中某一列的字串。好像就不能用JAVA实现这个逻辑了吧?!
      

  4.   

    不明白你的意思,我给的例子不是存储过程,是SQL的函数,虽然调用过程很类似。
    另外,你想要实现的效果也没说清楚,函数的本质就是给初始参数然后最后变化得到值,上面已经给了一个demo。调用参数也无非是想要调用的返回值,或者仅仅让函数跑一下(无返回值)。这两种都可以如上面例子一样,用JDBC调用获得对应的返回值,再根据返回值拼接SQL字符串执行JDBC操作。你想要的意思如果说不清楚,直接把数据库表贴出来和想要实现的功能说一下,具体点
      

  5.   


    恩,这么说吧。数据表中有如下这几个列名:
    day1 day2 day3 day4 day5 
    每一列会有如这样的字符串:
    如:
    day1 day2 day3 day4 day5
    12   1234 56   123  456
    ...  ...  ...  ...  ...我呢,想实现这样功能的函数:通过想数据库查询后返回一个结果集。这个函数叫find.
    find(String argv1,String argv2)
    这个函数的第一个参数用来放我想查询的字串,而第二个参数放我数据表中的列名。实例:
    比如,我想查找在day1列中含有“12”字串的结果集,我就调用这个find("12","day1")就行啦!
    谢谢你哈! 
      

  6.   


    而且这个功能通过这个语句是可以实现的:String sql = "select * from student_info where flag!=0 and LOCATE(\"12\",day1,1)!=0";但是这样就写死了啊,我想给它弄成参数传进去,但不知道咋弄呢。
      

  7.   

    你想要实现的功能如果到最后还是java应用程序调用的话,
    用java写个方法就能非常轻松地搞定,然后在程序调用就可以了,干嘛大费周折调用MySQL的函数?
    jdbc调用SQL函数花在连接上的开销很大,也浪费资源。利用select * from table1获得所有的ResultSet,然后再根据你的逻辑对Result再进行筛选(从ResultSet读出对应字段进行字符串的比照操作,符合的放到集合,不符合舍去)的效率可能要高于用sql本地函数来做,推荐这种方法。