锁定老帖子 主题:低效的where 1=1
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-14
最后修改:2010-07-14
oracle中是没有测试过的,不过oracle过滤很强大,再说oracle也是相当优秀的关系数据库了。。。
|
|
返回顶楼 | |
发表时间:2010-07-14
抛出异常的爱 写道
qchong 写道
ywlqi 写道
Das_flamen 写道
superyang 写道
抛出异常的爱 写道
StringBuffer buffer = new StringBuffer("select * from T where 1=1 "); for(Map.Enty e : map){ buffer .appand ("and "+ e.getKey()+" = '"+e.getValue()+"'"); } String hql = "select e.id,e.name,e.provice,e.city,e.total,date_format(e.addtime,'%Y-%m-%d'),a.name,date_format(e.sendtime,'%Y-%m-%d') from email e,admin a where e.add_admin_id=a.id"; if (!this.isNull(email_type)) { hql += " and e.name like '%" + email_type + "%'"; } if (!this.isNull(provice)) { hql += " and e.provice like '%" + provice + "%'"; } if (!this.isNull(city)) { hql += " and e.city like '%" + city + "%'"; } if (!this.isNull(name)) { hql += " and e.name like '%" + name + "%'"; } if (!this.isNull(add_admin_id)) { hql += " and e.adminByAddAdminId.id='" + add_admin_id + "'"; } if (!this.isNull(order_type)) { String arr[] = order_type.split("_"); hql += " order by e." + arr[0] + " " + arr[1]; hql += ",e.addtime desc"; } else { hql += " e.addtime desc"; } 这样写可不可以?? 为什么很多人用StringBuffer的..??? 你可以去试下,StringBuffer的效率不是String能比的,拼接的时候String多了严重影响性能。当然,如果就几条那也没什么,不过强烈推荐不要用String,不是个好习惯。 我记得有帖子说过jdk1.5以后对字符串相加做了优化,效率和StringBuffer一样了啊,我没做过实验,谁做过实验的来说两句 在编译的时候,确实会适时的将字符串拼接转成StringBuilder 别信任何jvm作出的承诺 比如线程优先级 比如某string池的优化 比如string可以自己用buffer解析
if (!this.isNull(email_type)) { hql += " and e.name like '%" + email_type + "%'"; } 会优化为: if (!this.isNull(email_type)) { hql += new StringBuider(" and e.name like '%").append(email_type).append("%'";) } //大概这样,记不太清了。 但是变量不会优化的,所以在用StringBuilder一般是在变量循环的时候用。
还有我最气愤的是: if (!this.isNull(email_type)) 这是什么东西呀! 明明是静态工具方法,不放到单独的工具类中,还要放到父类里面,放到父类里面就算了,还要用用成员方法来使用,太难看了! |
|
返回顶楼 | |
发表时间:2010-07-14
最后修改:2010-07-14
徐风子 写道
if (!this.isNull(email_type)) { hql += " and e.name like '%" + email_type + "%'"; } 会优化为: if (!this.isNull(email_type)) { hql += new StringBuider(" and e.name like '%").append(email_type).append("%'";) } //大概这样,记不太清了。 但是变量不会优化的,所以在用StringBuilder一般是在变量循环的时候用。
还有我最气愤的是: if (!this.isNull(email_type)) 这是什么东西呀! 明明是静态工具方法,不放到单独的工具类中,还要放到父类里面,放到父类里面就算了,还要用用成员方法来使用,太难看了!
如果方法名字很长的话,真不知道怎样去索引出来.. |
|
返回顶楼 | |
发表时间:2010-07-14
pi1ot 写道 我怎么从来没遇到过需要这么用的时候,举个例子
这个where 1 = 1 经常用在动态的条件查询上面 PS:这个经常用Ibatis的人,会很有感触 |
|
返回顶楼 | |
发表时间:2010-07-14
liudun 写道 willko 写道 Mysql有查询优化器,像这种直接过滤了。。
我印象中也是这样的。哪个数据库这么弱智,1=1、2=2这种明显的占位条件都不知道去掉吗? 我赞成,我之前的几个电信项目经常用,华为那帮性能测试也没问题, PS:数据量级是:1000千万 |
|
返回顶楼 | |
发表时间:2010-07-14
superyang 写道
徐风子 写道
if (!this.isNull(email_type)) { hql += " and e.name like '%" + email_type + "%'"; } 会优化为: if (!this.isNull(email_type)) { hql += new StringBuider(" and e.name like '%").append(email_type).append("%'";) } //大概这样,记不太清了。 但是变量不会优化的,所以在用StringBuilder一般是在变量循环的时候用。
还有我最气愤的是: if (!this.isNull(email_type)) 这是什么东西呀! 明明是静态工具方法,不放到单独的工具类中,还要放到父类里面,放到父类里面就算了,还要用用成员方法来使用,太难看了!
如果方法名字很长的话,真不知道怎样去索引出来..
这东西明明该在工具类怎么跑基类去了 再说了,代码,容易看比容易写更重要! |
|
返回顶楼 | |
发表时间:2010-07-14
inshua 写道 litchi 写道 0 != 1, 1 = 1 这种代码在某些安全性比较高的军工,能源等企业,是不允许被使用的。
怎么又跟安全扯上关系了 0 != 1 1 = 1这种sql可不是注入攻击中最常用的,所以有些公司直接做了一个过滤器,所有包含这些模式的语句直接不让执行。 我们就做过这么一个企业。 |
|
返回顶楼 | |
发表时间:2010-07-14
litchi 写道 inshua 写道 litchi 写道 0 != 1, 1 = 1 这种代码在某些安全性比较高的军工,能源等企业,是不允许被使用的。
怎么又跟安全扯上关系了 0 != 1 1 = 1这种sql可不是注入攻击中最常用的,所以有些公司直接做了一个过滤器,所有包含这些模式的语句直接不让执行。 我们就做过这么一个企业。 这个工具做在哪 一层上呢? 那岂不是很多工具用不了了 |
|
返回顶楼 | |
发表时间:2010-07-14
我靠,帖子讨论的是where 1=1,你们在这里讨论“科普级”的String和StringBuffer。
都是菜鸟/新手? 晕 |
|
返回顶楼 | |
发表时间:2010-07-15
表的列数多的时候,可能看的效果比较明显吧
|
|
返回顶楼 | |