sql - 如何使用 if 语句构建查询
问题描述
我想使用用户输入从数据库中获取数据
int fnameNum = 0;
int lnameNum = 0;
int emailNum = 0;
if (firstName != null) {
sb.append(" E.FIRST_NAME = ? ");
fnameNum = 1;
if (email == null) {
sb.append(" AND ");
sb.append(" E.LAST_NAME LIKE ? ");
lnameNum = 2;
} else if (lastName == null) {
sb.append(" AND ");
sb.append(" E.EMAIL = ? ");
emailNum = 2;
} else {
sb.append(" AND ");
sb.append(" E.LAST_NAME LIKE ? ");
lnameNum = 2;
sb.append(" AND ");
sb.append(" E.EMAIL = ? ");
emailNum = 3;
}
}
String sqlString = sb.toString();
preStatement = connection.prepareStatement(sqlString);
if (fnameNum > 0) {
preStatement.setString(fnameNum, firstName);
}
if (lnameNum > 0) {
preStatement.setString(lnameNum, lastName + "%");
}
if (emailNum > 0) {
preStatement.setString(emailNum, email);
}
ResultSet rs = preStatement.executeQuery();
html中有3个文本框。我想根据用户的输入从数据库中获取数据,即使另一个文本框是空白的或者所有的文本框都填充了数据。
解决方案
这是使用字符串连接创建 SQL 语句的最糟糕的想法。使用这种方法,您会有很多处罚/担忧。他们之中有一些是:
- 开放 SQL 注入
- DBMS 无法优化查询(因为它是动态变化的)
- 不可读(开发人员友好)
最好的选择是使用命名参数(如果您的 DBMS 系统支持)。请参见下面的示例:
SELECT * from TBL
WHERE (:NAME is null or NAME = :NAME) AND
(:SURNAME is NULL or SURNAME = :SURNAME)
推荐阅读
- linux - grep -v with while read line 命令无法正常工作
- python - 如何在 Django 中使用自定义自动递增字段实例化对象?
- git - 如何恢复 .git/objects/pack/ 文件?
- angular - 不要自动选中所有复选框 - Angular Material 复选框
- typescript - vue-property-decorator @Prop 如何使用接口定义数组
- npm-install - In a project created using apostrophe create-project in Ubuntu 18.04, npm install fails
- firefox - 仅在 Firefox 上的跨源请求和混合内容
- graph-algorithm - 约翰逊算法 - 负循环检查
- django - Django:当用户进入列表视图页面时做一些事情
- react-native - react-native undefined is not an object ('this.props.navigation.navigate') error