java代码小tips记录

最近写java代码学到的一些point,主要是我在公司实习的时候,本身碰到的一些问题,总结一下。会持续更新。html

1.知识点

1.解决dao层频繁访问数据库问题

问题:日常写java的都常常会有功能点:service.getElementByID(id),之前我在写的时候,好比从前端接收到对象的list-》根据list中某个对象的id查询数据库的某张表的其余属性name-》第一反应是直接for循环遍历获取对象id,而后根据id调用service中的getnameByID方法。前端

这个作法其实是能够的,可是若是数据量很大的状况下,屡次访问数据库IO消耗巨大。

复制代码

解决:先select * from 数据中的某张表A,获取所有须要的数据,而后把你须要查找的一列name与ID一一对应存入map。而后for循环list中的id时,直接从map中查找。java

这样操做的话就至关于只访问了一次数据库。同时由于map的get操做的时间复杂度在理想的状况下为O(1)。
复制代码

代码程序员

//定义map list为一次从数据库获取全部数据
    Map<String,Object> map = new HashMap<>();
    List<Object> lists = service.findAll();
    if(lists!=null && !lists.isEmpty()){
        //将list中全部数据存入map
        lists.forEach(bean->{
            map.put(bean.getID(),bean);
        });
    }
    //在操做的时候,若是map中存在对应的key,直接get
   if(map.containsKey(bean.getID()) ){
          System.out.println(bean.getName());          
    }


复制代码

2.异常捕捉

2.0 异常关键词

异常关键字
1:try catch
try catch是这之间所包含的代码若是出现异常时捕获他,并进行处理的,若是代码之间有错误,不会影响程序继续执行下去,程序会继续日后执行。
2:throw
是在程序中明确抛出引起的异常,好比throw new Exception();
3:throws
代表方法可能会引起异常,在方法内部并不处理这个异常,想要获得异常的话,调用者使用try catch语句便可获得
4:finally
无论有没有异常程序段中都会被执行的代码 
复制代码

2.1 for循环异常捕捉

问题:其实咱们在学校本身作项目的时候,几乎不会去主动catch异常,不少异常状况都不能很规范的考虑到。而在公司中业务则要求:某一个块碰到什么问题,必定要以日志的形式打印出来,碰到什么异常捕获并返回jsonMap说明异常状况。面试

解决:养成异常捕获的习惯。数据库

站在用户的角度去思考业务,而不是站在代码的角度。
复制代码

咱们在写一个业务的时候, 不要理所固然的以为按照咱们的逻辑是不会出现问题的,可是用户是小白,他们在操做的时候不彻底按照咱们的逻辑。json

代码后端

private Map<String,Object> getRes(String A) {
        Map<String, Object> jsonMap = new HashMap<>();
        try {
            List<Object> a = service.getByA(A);//这个方法可能抛异常
            Map<String, Object> map = new HashMap<>();
            for(Object p:a){
                if(StringUtils.isBlank(p.getBootStatus())){
                    continue;//过滤异常状况,避免抛异常
                }
                if(StringUtils.isNotBlank(p.getId())&&StringUtils.isNotBlank(p.getIp())){
                    map.put(p.getName(),p.getIp());
                }
            }
            jsonMap.put("success", true);
            jsonMap.put("data",map);
        } catch (Exception e) {
            jsonMap.put("success", false);
            jsonMap.put("errorMsg", "A = " + A + " 访问 api 发生异常!");
            log.error("exception:{} ",e);
        }
        return jsonMap;
    }
复制代码

备注:对于异常的处理,不少公司都会比较重视。api

  • 某次面试,被面试官问:用过或者遇到过哪些异常?

对于我来讲,常见的异常有NullPointerException,ArrayIndexOutOfBoundsException,SQLException,IOException。bash

2.2 新建一个异常类

偶然看到一段代码是本身自定义的异常,不明白为何须要本身定义异常而且抛异常?因此去查阅了一些资料。

为何要自定义异常
大的项目业务线比较多,不一样功能模块的异常类型不同,若是不自定义的区分的话,对于捕获异常来就没有区别性。全部通常业务中不一样场景抛不一样的异常,便于统一捕捉而且根据类型作进一步的处理。 可是自定义异常通常会增长工做量,须要本身权衡是否自定义异常类。

如何自定义异常类

//1.自定义异常类:继承RuntimeException(运行时异常) 或 Exception
public class MyException extends Exception { 
  private static final long serialVersionUID = 1L; 
  // 提供无参数的构造方法
  public MyException() { 
  } 
  // 提供一个有参数的构造方法,可自动生成
  public MyException(String message) { 
    super(message);// 把参数传递给Throwable的带String参数的构造方法 
  } 
} 
//2.抛异常类
public class CheckScore { 
  // 检查分数合法性的方法check() 若是定义的是运行时异常就不用抛异常了 
  public void check(int score) throws MyException {// 抛出本身的异常类 
    if (score > 120 || score < 0) { 
      // 分数不合法时抛出异常 
      throw new MyException("分数不合法,分数应该是0--120之间");// new一个本身的异常类 
    } else { 
      System.out.println("分数合法,你的分数是" + score); 
    } 
  } 
} 

//3.捕获异常
import java.util.Scanner; 
 
/* 
 * 自定义的异常测试类 
 */ 
public class Student { 
  public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int score = sc.nextInt(); 
    CheckScore check = new CheckScore(); 
    try { 
      check.check(score); 
    } catch (MyException e) {// 用本身的异常类来捕获异常 
      e.printStackTrace(); 
    } 
  } 
 
} 

复制代码

备注: 异常分类方便捕捉不一样的异常类型,并进行对应的操做。在稍微复杂的业务系统中,仅仅使用Java自身的异常类是不够的,好比常见的NPE/IAE等。

  1. 有时候须要对参数进行各类检查,NPE不足以清晰的说明异常的具体内容。好比有多个参数,对每一个参数进行自定义的校验规则,能够经过IAE(message: String)来让调试过程更加友好。
  2. 自定义参数,好比数据解析异常,可能中间多处可能抛出,这里能够定义一个MyParseException,针对此类异常一般使用相同的善后操做。
  3. 自定义异常能够定义层次结构,即某个业务系统中的全部异常统一顶一个根类,而后再定义一些子类异常,分类进行针对性的操做。好比定义一个MyRootException,而后对网络通讯解析的异常MyParseException,对数据访问的异常MyDataException等,这些异常都表明了不一样的类型,操做句柄也都是不同的。

参考连接:www.cnblogs.com/yanggb/p/10…

3.@Value注解使用

做用:读取配置文件的属性
注解方式

定义(map类型): 
    property.key = {"A":"a","B":"b"}   
 使用:
    @Value("#{${property.key}}")
    private Map<String, String> propertykey;
    
    propertykey.get(A);
复制代码

2.开发工具

1.mybatis-generator

这是一款逆向工程工具,针对数据库表自动生成mybatis执行所须要的代码,通常有三种用法:命令行,eclipse插件,maven插件。比较通用的就是maven插件。
具体使用方法比较常见:
(1)在pom.xml导入依赖的包
(2)generatorConfig.xml文件
(3)IDEA中直接点击插件执行

至此,其中的pojo dao mapper xml等文件都会自动生成。
想起之前搭建框架的时候,每次都是手动建立

2.postman测试工具

上手仍是很快的,对于接口测试很是有用

3.IDEA debug

debug的一方面是为了调试代码,找到问题。另外一方面也能够帮助咱们理解新代码。
做为一个实习生,刚到公司,每次写一个业务以前,必定是要熟悉别人的代码。而熟悉代码最快路径第一步是找一个接口测试这个功能点,第二步是在代码中打断点调试,看每一个函数调用的返回值的变化。

1.断点尽可能打在有返回值的语句、if断定条件语句
2.F9跳转断点,快捷。代码修改以后,可重复发送请求继续调试
3.80%的问题均可以用debug解决
复制代码

4.热部署Jrebel

这是一个很是实用的后端项目热部署插件。由于idea没有集成热部署工具,因此只能安装插件使用,可让你效率加倍。众所周知,Spring项目若是很大的话,每修改一点代码就要重启Tomcat,耗时长。

n.总结

  • 公司的大佬仍是不少的,某天看到小组老大写的代码,惊叹:这就是架构师和程序员的区别啊!! 好好学习。
相关文章
相关标签/搜索