一、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