Java SQL查询准备语句动态参数
我正在使用java进行sql查询,其中的参数可能存在于查询中,也可能不存在于查询中 例如,有一个http请求参数:Java SQL查询准备语句动态参数,java,sql,sql-server,Java,Sql,Sql Server,我正在使用java进行sql查询,其中的参数可能存在于查询中,也可能不存在于查询中 例如,有一个http请求参数: 名字 开始 极限 在jsp中,我做了类似的事情 if (request.getParameter("query") != null) { query = request.getParameter("query"); } if (request.getParameter("start") != null) { start = Integer.parseIn
if (request.getParameter("query") != null) {
query = request.getParameter("query");
}
if (request.getParameter("start") != null) {
start = Integer.parseInt(request.getParameter("start"));
}
if (request.getParameter("limit") != null) {
limit = Integer.parseInt(request.getParameter("limit"));
}
....
if (query != null) {
sql += " AND dbo.TABLENAME.namelike '%?%'";
}
if (start != null) {
sql += " AND RowNum >= ?";
}
if (limit != null) {
sql += " AND RowNum <= ?";
if (start == null)
start =0;
}
if(request.getParameter(“查询”)!=null){
query=request.getParameter(“查询”);
}
if(request.getParameter(“start”)!=null){
start=Integer.parseInt(request.getParameter(“start”);
}
if(request.getParameter(“limit”)!=null){
limit=Integer.parseInt(request.getParameter(“limit”);
}
....
if(查询!=null){
sql+=”和dbo.TABLENAME.namelike“%?%”;
}
如果(开始!=null){
sql+=“和RowNum>=?”;
}
如果(限制!=null){
sql+=”和RowNum在您的特定场景中,您应该可以执行以下操作
sql += "AND dbo.TABLENAME.namelike '%?%' AND RowNum >= ? AND RowNum <= ?";
sql+=”和dbo.TABLENAME.namelike“?%”和RowNum>=?和RowNum尝试使用sql标记。JSTL提供此sql标记,因为您只能使用JSP。
它是JavaEE标准的一部分
它比在jsp中编写java代码更简洁、更容易
这里是链接。
希望有帮助!如果不借助框架,您可以将单独的查询外部化,在您的示例中,使用分页参数和不使用分页参数,并将它们放在属性文件中,例如querys.properties:
query.paging=SELECT * FROM dbo.TABLENAME WHERE namelike ? AND RowNum >= ? AND RowNum <= ?
query.nopaging=SELECT * FROM dbo.TABLENAME WHERE namelike ?
使用PravaReScript避免SQL注入攻击的安全风险。
你会考虑使用iBATIS或Hibernate吗?就是这样,这个项目不应该使用ORM,只是JSP。这不是我的电话,我知道这是疯狂的。Codemwnci的回答是不够的,你需要考虑很多。特别是照顾特殊的字符。是的,我明白,我真的很想使用ORM,但我们的客户端不接受。你不能像“%”?%%“
那样使用。你必须像“
那样使用”,并将%
字符放在绑定字符串参数的周围。如果有另一个参数,那么该查询看起来像sql+=“和dbo.TABLENAME.name类似“%”?%%和gender='F'和RowNum>=?以及RowNum上述语句工作的唯一原因是,您使用的元素可以模拟不存在的元素(通过使用最大值和最小值或空值)。如果您想在不存在性别的情况下默认性别,那么这很好,因为您可以默认,但是如果您想忽略性别,如果不传入性别,则必须使用LIKE语句,这将使其效率越来越低
ResourceBundle queries = ResourceBundle.getBundle("queries");
String nameLike = request.getParameter("nameLike");
String startRow= request.getParameter("startRow");
String endRow= request.getParameter("endRow");
if (nameLike == null) {
nameLike = ""; // or you could report an error here
}
Connection connection = ...get a JDBC Conection...
PreparedStatement st;
if (startRow != null && endRow != null) {
st = connection.prepareStatement(queries.get("query.paging"));
st.setString(1, nameLike);
st.setString(2, startRow);
st.setString(3, endRow);
}
else {
st = connection.prepareStatement(queries.get("query.nopaging"));
st.setString(1, nameLike);
}