论坛首页 综合技术论坛

低效的where 1=1

浏览 41498 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-07-14   最后修改:2010-07-14
oracle中是没有测试过的,不过oracle过滤很强大,再说oracle也是相当优秀的关系数据库了。。。
0 请登录后投票
   发表时间: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解析



一群大哥们,现在不是一件2010年了吗,怎么大家还是在StringBuffer呀,好歹用个 StringBuilder呀。
“比如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))

 这是什么东西呀! 明明是静态工具方法,不放到单独的工具类中,还要放到父类里面,放到父类里面就算了,还要用用成员方法来使用,太难看了!

0 请登录后投票
   发表时间:2010-07-14   最后修改:2010-07-14
徐风子 写道


一群大哥们,现在不是一件2010年了吗,怎么大家还是在StringBuffer呀,好歹用个 StringBuilder呀。
“比如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))

 这是什么东西呀! 明明是静态工具方法,不放到单独的工具类中,还要放到父类里面,放到父类里面就算了,还要用用成员方法来使用,太难看了!


    放到基类去了,用this这样引用可能打代码快一点..

    如果方法名字很长的话,真不知道怎样去索引出来..

0 请登录后投票
   发表时间:2010-07-14  
pi1ot 写道
我怎么从来没遇到过需要这么用的时候,举个例子


这个where 1 = 1 经常用在动态的条件查询上面

PS:这个经常用Ibatis的人,会很有感触
0 请登录后投票
   发表时间:2010-07-14  
liudun 写道
willko 写道
Mysql有查询优化器,像这种直接过滤了。。


我印象中也是这样的。哪个数据库这么弱智,1=1、2=2这种明显的占位条件都不知道去掉吗?


我赞成,我之前的几个电信项目经常用,华为那帮性能测试也没问题,

PS:数据量级是:1000千万
0 请登录后投票
   发表时间:2010-07-14  
superyang 写道
徐风子 写道


一群大哥们,现在不是一件2010年了吗,怎么大家还是在StringBuffer呀,好歹用个 StringBuilder呀。
“比如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))

 这是什么东西呀! 明明是静态工具方法,不放到单独的工具类中,还要放到父类里面,放到父类里面就算了,还要用用成员方法来使用,太难看了!


    放到基类去了,用this这样引用可能打代码快一点..

    如果方法名字很长的话,真不知道怎样去索引出来..

 

这东西明明该在工具类怎么跑基类去了

再说了,代码,容易看比容易写更重要!

0 请登录后投票
   发表时间:2010-07-14  
inshua 写道
litchi 写道
0 != 1, 1 = 1 这种代码在某些安全性比较高的军工,能源等企业,是不允许被使用的。


怎么又跟安全扯上关系了


0 != 1 1 = 1这种sql可不是注入攻击中最常用的,所以有些公司直接做了一个过滤器,所有包含这些模式的语句直接不让执行。

我们就做过这么一个企业。
0 请登录后投票
   发表时间:2010-07-14  
litchi 写道
inshua 写道
litchi 写道
0 != 1, 1 = 1 这种代码在某些安全性比较高的军工,能源等企业,是不允许被使用的。


怎么又跟安全扯上关系了


0 != 1 1 = 1这种sql可不是注入攻击中最常用的,所以有些公司直接做了一个过滤器,所有包含这些模式的语句直接不让执行。

我们就做过这么一个企业。

这个工具做在哪 一层上呢?
那岂不是很多工具用不了了
0 请登录后投票
   发表时间:2010-07-14  
我靠,帖子讨论的是where 1=1,你们在这里讨论“科普级”的String和StringBuffer。
都是菜鸟/新手?
0 请登录后投票
   发表时间:2010-07-15  
表的列数多的时候,可能看的效果比较明显吧
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics