有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于筛选的java MyBatis查询参数

我在使用MyBatis 3设置查询参数时遇到问题。我正在使用一个选择的提供者。 以下是我的Mapper界面中的方法:

@SelectProvider(type=my.package.VolunteerSQL.class, method="getQuery")
public List<VolunteerRecord> getOrderedVolunteerList(
        @Param("from") int from, 
        @Param("count") int count, 
        @Param("orderBy") String[] orderBy,
        @Param("filterBy") String[] filterBy,
        @Param("filterValue") String filterValue);

以下是选择提供程序方法:

public String getQuery(Map<?,?> parameters) {
    final String[] orderBy = (String[]) parameters.get("orderBy");
    final String[] filterBy = (String[]) parameters.get("filterBy");
    String sql = new SQL() {{
        SELECT("v.id as id, surname, forename, more columns...");
        //SELECT("more columns...");
        FROM("volunteer v");
        if (filterBy!=null) {
            for (int i=0; i<filterBy.length; i++) {
                String filter = filterBy[i];
                if (i>0) OR();
                WHERE(filter+" LIKE '%#{filterValue}%'");
            }
        }
        GROUP_BY("vs.volunteer_id");
        for (String order : orderBy) {
            ORDER_BY(order);
        }
    }}.toString();
    String result =  sql+" LIMIT #{from},#{count}";
    System.out.println("SQL="+result);
    return result;
}

这里有几个问题。 首先,如果我有任何过滤器,我会得到这个例外:

Error querying database.  Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).

生成的SQL似乎没有足够的参数占位符,但当我检查SQL时,它看起来还可以。不知道那里发生了什么

其次,筛选器列容易受到SQL注入攻击,因为我不能为它们使用参数,我必须将它们直接连接到SQL字符串中。有没有一个好的、干净的、安全的替代方案


共 (0) 个答案