淘先锋技术网

首页 1 2 3 4 5 6 7

一、MyBatis不要为了多个查询条件而写1=1

当遇到多个查询条件,使用where1=1可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了“where1=1”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描)以比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL注入的风险。

反例:

<selectparameterType="com.tjt.platform.entity.BookInfo"resultType="java.lang.Integer">

selectcount(*)fromt_rule_BookInfotwhere1=1

<iftest="title!=nullandtitle!=''">

ANDtitle=#{title}

</if>

<iftest="author!=nullandauthor!=''">

ANDauthor=#{author}

</if>

</select>复制代码

正例:

<selectparameterType="com.tjt.platform.entity.BookInfo"resultType="java.lang.Integer">

selectcount(*)fromt_rule_BookInfot

<where>

<iftest="title!=nullandtitle!=''">

title=#{title}

</if>

<iftest="author!=nullandauthor!=''">

ANDauthor=#{author}

</if>

</where>

</select>复制代码UPDATE操作也一样,可以用<set>标记代替1=1。

二、迭代entrySet()获取Map的key和value

当循环中只需要获取Map的主键key时,迭代keySet()是正确的;但是,当需要主键key和取值value时,迭代entrySet()才是更高效的做法,其比先迭代keySet()后再去通过get取值性能更佳。

反例:

//Map获取value反例:

HashMap<String,String>map=newHashMap<>();

for(Stringkey:map.keySet()){

Stringvalue=map.get(key);

}复制代码

正例:

//Map获取key&value正例:

HashMap<String,String>map=newHashMap<>();

for(Map.Entry<String,String>entry:map.entrySet()){

Stringkey=entry.getKey();

Stringvalue=entry.getValue();

}复制代码正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!暗号【1024】千万不要发,否则.....

三、使用Collection.isEmpty()检测空

使用Collection.size()来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty()使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty()实现的时间复杂度都是O(1),不需要多次循环遍历,但是某些通过Collection.size()方法实现的时间复杂度可能是O(n)。O(1)纬度减少循环次数例子

反例:

LinkedList<Object>collection=newLinkedList<>();

if(collection.size()==0){

System.out.println("collectionisempty.");

}复制代码

正例:

LinkedList<Object>collection=newLinkedList<>();

if(collection.isEmpty()){

System.out.println("collectionisempty.");

}

//检测是否为null可以使用CollectionUtils.isEmpty()

if(CollectionUtils.isEmpty(collection)){

System.out.printl