最近写java代码学到的一些point,主要是我在公司实习的时候,本身碰到的一些问题,总结一下。会持续更新。html
问题:日常写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());
}
复制代码
异常关键字
1:try catch
try catch是这之间所包含的代码若是出现异常时捕获他,并进行处理的,若是代码之间有错误,不会影响程序继续执行下去,程序会继续日后执行。
2:throw
是在程序中明确抛出引起的异常,好比throw new Exception();
3:throws
代表方法可能会引起异常,在方法内部并不处理这个异常,想要获得异常的话,调用者使用try catch语句便可获得
4:finally
无论有没有异常程序段中都会被执行的代码
复制代码
问题:其实咱们在学校本身作项目的时候,几乎不会去主动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
偶然看到一段代码是本身自定义的异常,不明白为何须要本身定义异常而且抛异常?因此去查阅了一些资料。
为何要自定义异常:
大的项目业务线比较多,不一样功能模块的异常类型不同,若是不自定义的区分的话,对于捕获异常来就没有区别性。全部通常业务中不一样场景抛不一样的异常,便于统一捕捉而且根据类型作进一步的处理。 可是自定义异常通常会增长工做量,须要本身权衡是否自定义异常类。
如何自定义异常类:
//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等。
参考连接:www.cnblogs.com/yanggb/p/10…
做用:读取配置文件的属性
注解方式:
定义(map类型):
property.key = {"A":"a","B":"b"}
使用:
@Value("#{${property.key}}")
private Map<String, String> propertykey;
propertykey.get(A);
复制代码
这是一款逆向工程工具,针对数据库表自动生成mybatis执行所须要的代码,通常有三种用法:命令行,eclipse插件,maven插件。比较通用的就是maven插件。
具体使用方法比较常见:
(1)在pom.xml导入依赖的包
(2)generatorConfig.xml文件
(3)IDEA中直接点击插件执行
至此,其中的pojo dao mapper xml等文件都会自动生成。
想起之前搭建框架的时候,每次都是手动建立
上手仍是很快的,对于接口测试很是有用
debug的一方面是为了调试代码,找到问题。另外一方面也能够帮助咱们理解新代码。
做为一个实习生,刚到公司,每次写一个业务以前,必定是要熟悉别人的代码。而熟悉代码最快路径第一步是找一个接口测试这个功能点,第二步是在代码中打断点调试,看每一个函数调用的返回值的变化。
1.断点尽可能打在有返回值的语句、if断定条件语句
2.F9跳转断点,快捷。代码修改以后,可重复发送请求继续调试
3.80%的问题均可以用debug解决
复制代码
这是一个很是实用的后端项目热部署插件。由于idea没有集成热部署工具,因此只能安装插件使用,可让你效率加倍。众所周知,Spring项目若是很大的话,每修改一点代码就要重启Tomcat,耗时长。