1:动态SQL遇到的坑,先看下面OGNL表达式的说明。

Any object can be used where a boolean is required. OGNL interprets objects as booleans like this:

  1. If the object is a Boolean, its value is extracted and returned;

  2. If the object is a Number, its double-precision floating-point value is compared with zero; non-zero is treated as true, zero as false;

  3. If the object is a Character, its boolean value is true if and only if its char value is non-zero;

  4. Otherwise, its boolean value is true if and only if it is non-null.

如果对象是一个Number类型,值为0时将被解析为false,否则为true,浮点型0.00也是如此。OGNL对于boolean的定义和JavaScript有点像,即'' == 0 == false。这也就不难理解<if test="status != null and status !=''">and status = #{status}</if>当status=0时出现的问题了,显然0!=''是不成立的,导致表达式的值为false。

将表达式修改为<if test="status != null">and status = #{status}</if>该问题便迎刃而解。该问题的根源还是来自编码的不规范,只有String类型才需要判断是否!='',其他类型完全没有这个必要,可能是开发人员为了省事直接复制上一行拿过来改一改或是所使用的MyBatis生成工具不严谨导致该问题的发生。

这里有必要再提一个“坑”,如果你有类似于String str ="A"; <if test="str!= null and str == 'A'">这样的写法时,你要小心了。因为单引号内如果为单个字符时,OGNL将会识别为Java 中的 char类型,显然String 类型与char类型做==运算会返回false,从而导致表达式不成立。解决方法很简单,修改为<if test='str!= null and str == "A"'>即可。

2:集合中移除某些无用的数据的操作。

  //正确写法
List<Stu1> list = new ArrayList<>();
list.add(new Stu1("zhangsan", 21));
list.add(new Stu1("lisi", 22));
list.add(new Stu1("zhangsan", 26));
Iterator<Stu1> iterator = list.iterator();
while (iterator.hasNext()) {
Stu1 stu1 = iterator.next();
if (stu1.getName().equals("zhangsan1")) {
iterator.remove();
}
}
//错误写法,用foreach循环遍历集合,我就不写了.这样可能会报异常的。
// 开发中移除集合中的元素的时候,用Iterator来遍历集合。

3:字符串变量和字符串常量equals的时候将字符串常量写在前面

  String str = "123" ;
if(str.equals("123")){ }
// 建议修改为这样主要是可以避免空指针异常。
String str = "123" ;
if("123".equals(str)){ }

4:HashMap用对象作为key的时候重新equal和hashCode,如果不重写hashcode方法get的结果将为null。

如下图是怎样重写equal和hashCode的方法。

注意:平常用对象判断是否相同的时候,一般也会重写这个对象的equal和hashCode的方法,一般的开发工具也都有重写这两个方法的快捷键。

5:用最有效的方式来遍历map集合

如下,数据量大的时候用Iterator遍历map的效率较高:

 Map<String, String> hm = new HashMap<>();
hm.put("1", "aa");
hm.put("2", "bb");
Set<Map.Entry<String, String>> entries = hm.entrySet();
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> map = iterator.next();
System.out.println("key值" + map.getKey());
System.out.println("value值" + map.getValue());
}

6:Oracle查询优化:

选择最有效率的表名顺序:ORACLE的解析器按照从右到左顺序处理from字句中的表名,from字句中写在最后的表(基础表)将最先被处理,在from字句中包含多个表的情况下,必须选择记录数最少的表作为基础表,如果有3个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表就是那个被其他表引用的表。

Java开发中要避免的坑和一些代码优化技巧的更多相关文章

  1. Java 开发中如何正确踩坑

    为什么说一个好的员工能顶 100 个普通员工 我们的做法是,要用最好的人.我一直都认为研发本身是很有创造性的,如果人不放松,或不够聪明,都很难做得好.你要找到最好的人,一个好的工程师不是顶10个,是顶 ...

  2. Java开发中碰到的Map的坑

    这属于我在开发中碰过的坑 ,容器中存放者对象,当clear()的时候,出现的奇葩问题.好了,直接看代码: package com.DataType.yinyong; import java.util. ...

  3. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  4. 记一次SpringBoot 开发中所遇到的坑和解决方法

    记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...

  5. paip.java 开发中web server的选择jboss resin tomcat比较..

    paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...

  6. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  7. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...

  8. java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...

  9. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  10. 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]

    完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...

随机推荐

  1. 【SQL进阶】【REPLACE/TIMESTAMPDIFF/TRUNCATE】Day01:增删改操作

    一.插入记录 1.插入多条记录 自己的答案: INSERT INTO exam_record(uid, exam_id, start_time, submit_time, score) VALUES ...

  2. 干电池升压IC或者干电池升压芯片

    1, 干电池升压IC                            升压输出3V,3,3V,5V等3V-5V可调 2, 单节锂电池升压IC                     升压输出4. ...

  3. USB口3A限流保护芯片。带短路保护

    一般说明 PW1503是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路情况.它具有超温保护以及反向闭锁功能. PW1503采用薄型(1毫米)5针薄型SOT封装,提供可调版本. ...

  4. What's new in Dubbo 3.1.4 and 3.2.0-beta.3

    在 12 月 22 日,Dubbo 3.1.4 和 3.2.0-beta.3 正式通过投票发布.本文将介绍发布的变化一览. Dubbo 3.1.4 版本是目前 Dubbo 3 的最新稳定版本,我们建议 ...

  5. DNS欺骗

    原理: dns欺骗又可以叫作中间人人攻击,主要是通过拦截受害人在访问某个网站时设备向外发送的dns请求,然后给出伪造的dns应答,实现欺骗过程. 实验脚本如下: from scapy.layers.d ...

  6. vivo 实时计算平台建设实践

    作者:vivo 互联网实时计算团队- Chen Tao 本文根据"2022 vivo开发者大会"现场演讲内容整理而成. vivo 实时计算平台是 vivo 实时团队基于 Apach ...

  7. 一文读懂 Kubernetes 存储设计

    在 Docker 的设计中,容器内的文件是临时存放的,并且随着容器的删除,容器内部的数据也会一同被清空.不过,我们可以通过在 docker run 启动容器时,使用 --volume/-v 参数来指定 ...

  8. Java集合 - ConcurrentHashMap

    介绍 ConcurrentHashMap 技术是为了解决问题而生的,ConcurrentHashMap 解决了多个线程同时操作一个 HashMap 时,可能出现的内部问题.当多个线程同时操作一个 Ha ...

  9. .Net 7 托管Main入口的四种类型

    前言: 按照CLR的规则,C#托管Main入口其实有四种写法. 写法 第一种:最常见的,也是VS默认的,返回值void,带一个参数 static void Main(string[] args) { ...

  10. Object类中wait带参方法和notifyAll方法-线程间通信

    Object类中wait带参方法和notifyAll方法 void wait (在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待.void wait  (lo ...