码迷,mamicode.com
首页 > 数据库 > 详细

mysql 数据库查询-动态组装mysql

时间:2015-05-13 13:05:50      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

要实现这种动态的SQL语句拼装,我们可以在宿主语言中建立一个字符串,然后逐个判断各个复选框是否选中来向这个字符串中添加SQL语句片段。 这里有一个问题就是当有复选框被选中的时候SQL语句是含有WHERE子句的, 而当所有的复选框都没有被选中的时候就没有WHERE子句了,因此在添加每一个过滤条件判断的时候都要判断是否已经存在WHERE语句了,如果没有WHERE语句则添加WHERE语句。 在判断每一个复选框的时候都要去判断, 这使得用起来非常麻烦,因此开发人员想到了一个捷径:为SQL语句指定一个永远为真的条件语句(比如“1=1”),这样就不用考虑WHERE语句是否存在的问题了。伪代码如下:

String sql = " SELECT * FROM T_Employee WHERE 1=1";
if(工号复选框选中)
{
sql.appendLine("AND FNumber BETWEEN ‘ "+工号文本框1内容+" ‘ AND ‘ "+工号
文本框2内容+" ‘ ");
}
if(姓名复选框选中)
{
sql.appendLine("AND FName LIKE ‘%"+姓名文本框内容+"%‘");
}
if(年龄复选框选中)
{
sql.appendLine("AND FAge BETWEEN ‘ "+年龄文本框1内容+" ‘AND‘ "+年龄文本框2
内容+" ‘ ");
}
executeSQL(sql);

但是使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。

 另外一种方法:

private void doQuery()
{
Bool hasWhere = false;
StringBuilder sql = new StringBuilder(" SELECT * FROM T_Employee");
if(工号复选框选中)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);

sql.appendLine("FNumber BETWEEN ‘"+工号文本框1内容+"‘ AND ‘"+工号
文本框2内容+"‘");
}
if(姓名复选框选中)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FName LIKE ‘%"+姓名文本框内容+"%‘");
}
if(年龄复选框选中)
{
hasWhere = appendWhereIfNeed(sql, hasWhere);
sql.appendLine("FAge BETWEEN "+年龄文本框1内容+" AND "+年龄文本框2
内容);
}
executeSQL(sql);
}
private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere)
{
if(hasWhere==false)
{
sql. appendLine("WHERE");
}
else
{
sql. appendLine("AND");
}
}

 

 

 

 

 

 

 

 

 

mysql 数据库查询-动态组装mysql

标签:

原文地址:http://blog.csdn.net/hello_myhome/article/details/45689375

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!