IDEA永久破解:https://mp.weixin.qq.com/s/hhwWDG37IyOqoC3jbeXXUA

项目初始配置

1. 依赖简介

演示项目是一个Spring Boot项目,连接数据库使用的是MyBatis,使用热部署工具Devtools帮助我们热启动,我们简单介绍一下porm.xml当中的依赖:

首先要使用spring boot这个框架就要有下面这个parent

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.6.RELEASE</version>
  5. </parent>

负责启动整个spring boot项目的依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

负责热启动,修改代码后自动启动的依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-devtools</artifactId>
  4. </dependency>

负责连接数据库的mybatis包和数据的mysql包如下:

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>1.3.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>5.1.37</version>
  10. </dependency>

2. 分层结构

  • Config:所有的配置(用于存放Spring Boot相关的配置类,包括启动类)
  • Controller:请求入口(所有请求的入口,前后端交互的入口)
  • Service:逻辑层(负责所有的业务逻辑)
  • Mapper:持久层(或者叫做Dao层,负责Java和数据库交互,包括interface和xml两类文件)
  • Domain/Po:表映射实体(用一个Java类来映射数据库表,类名就相当于表名,类的属性就相当于表的字段)
  • Dto:数据传输对象(用于前后端数据交互)

下面我们区分一下Domain和Dto的区别:

  • 其中Domain类的属性完全和表的字段一致,Dto类的属性一般和表一致,但会根据不同的业务场景适当增加或者减少属性。
  • Domain类用于Java数据和数据库表记录的映射,用在Service层和Mapper层
  • Dto类用于前后端数据传输,用在Controller层和Service层
  • Service层介于Controller和Mapper之间,也是Domain和Dto的转换层

image.png

下面我们就一个个介绍内容

  1. package com.imooc.demo.config;
  2. @SpringBootApplication
  3. @ComponentScan("com")
  4. @MapperScan("com.imooc.demo.mapper")
  5. public class Application {
  6. private static final Logger LOG = LoggerFactory.getLogger(Application.class);
  7. public static void main(String[] args) {
  8. SpringApplication app = new SpringApplication(Application.class);
  9. Environment env = app.run(args).getEnvironment();
  10. System.out.println("启动成功!!");
  11. System.out.println("根地址: \t\thttp://127.0.0.1:" + env.getProperty("server.port"));
  12. System.out.println("登录接口: \thttp://127.0.0.1:" + env.getProperty("server.port") + "/user/login?loginName=test&password=test");
  13. }
  14. }
  • @SpringBootApplication:加上这样的注解我们就可以通过该文件启动spring boot
  • @ComponentScan(“com”):扫描com下面所有的类,全部交给spring来管理
  • @MapperScan(“com.imooc.demo.mapper”):Mybatis要扫描的包

下面我们说说Controller入口文件:

  1. package com.imooc.demo.controller;
  2. @RestController
  3. @RequestMapping("/user")
  4. public class UserController {
  5. private static final Logger LOG = LoggerFactory.getLogger(Application.class);
  6. @Resource
  7. private UserService userService;
  8. @RequestMapping("/login")
  9. public String login(UserDto userDto) {
  10. LOG.info("登录开始, {}", userDto.toString());
  11. Map<String, String> map = new HashMap<>();
  12. map.put("", "");
  13. map.put("", "");
  14. map.put("", "");
  15. map.put("", "");
  16. // todo 调用service方法
  17. userDto = userService.doLogin(userDto);
  18. if (userDto == null) {
  19. LOG.warn("用户或密码错");
  20. return "用户或密码错";
  21. } else {
  22. LOG.info("登录成功");
  23. return "登录成功";
  24. }
  25. }
  26. @RequestMapping("/list")
  27. public String list() {
  28. LOG.info("查询开始");
  29. userService.list();
  30. return "success";
  31. }
  32. }
  • @RestController就是controller入口的注解
  • @RequestMapping(“/user”)就是访问入口的注解,访问地址必须是http://127.0.0.1/user/login
  • 其中使用到了Dto层的UserDto的类,然后使用到了service当中的userService.doLogin(userDto)这个方法

接着就是逻辑层的service:

  1. package com.imooc.demo.service;
  2. @Service
  3. public class UserService {
  4. private static final Logger LOG = LoggerFactory.getLogger(UserService.class);
  5. @Resource
  6. private UserMapper userMapper;
  7. /**
  8. * 登录功能
  9. * @param dto
  10. * @return
  11. */
  12. public UserDto doLogin(UserDto dto) {
  13. List<User> userList = userMapper.findByLoginName(dto.getLoginName());
  14. if (CollectionUtils.isEmpty(userList)) {
  15. LOG.info("根据用户名查找不到记录");
  16. return null;
  17. } else {
  18. User user = userList.get(0);
  19. LOG.info("根据用户名查找结果:{}", user);
  20. return validatePassword(dto, user);
  21. }
  22. }
  23. private UserDto validatePassword(UserDto userDto, User user) {
  24. if (userDto.getPassword().equals(user.getPassword())) {
  25. BeanUtils.copyProperties(user, userDto);
  26. return userDto;
  27. } else {
  28. LOG.warn("密码错:{},{}", userDto.getPassword(), user.getPassword());
  29. return null;
  30. }
  31. }
  32. /**
  33. * @return
  34. */
  35. public void list() {
  36. List<User> userList = userMapper.list();
  37. for (int i = 0; i < userList.size(); i++) {
  38. User user = userList.get(i);
  39. if (i == 1) {
  40. throw new NullPointerException();
  41. }
  42. System.out.println(user);
  43. }
  44. }
  45. }
  • @Service注解表示该文件是service的文件,而且一定要写上
  • 在逻辑层当中使用到的持久层mapper的去操作数据库
  • mapper其实是个接口,接口的实现是在resources当中的mapper/UserMapper.xml当中

接着就是Mapper层

  1. package com.imooc.demo.mapper;
  2. public interface UserMapper {
  3. List<User> findByLoginName(String loginName);
  4. List<User> list();
  5. }

然后我们看看Mapper接口的实现,在resources当中的mapper/UserMapper.xml当中

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.imooc.demo.mapper.UserMapper" >
  4. <select id="findByLoginName" resultType="com.imooc.demo.domain.User">
  5. select `id`, `login_name` as loginName, `name`, `password`
  6. from `user`
  7. where `login_name` = #{loginName}
  8. </select>
  9. <select id="list" resultType="com.imooc.demo.domain.User">
  10. select `id`, `login_name` as loginName, `name`, `password`
  11. from `user`
  12. </select>
  13. </mapper>

最后是关于整个spring boot项目的配置文件,resources/application.properties

  1. server.port=8001
  2. mybatis.mapper-locations=classpath:/mapper/*.xml
  3. logging.level.com.jiawahome.mapper=debug
  4. spring.datasource.url=jdbc:mysql://localhost:3306/demo?characterEncoding=UTF8&autoReconnect=true
  5. spring.datasource.username=root
  6. spring.datasource.password=root
  7. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

关于项目启动的端口,mybatis的mapper文件地址,日志设置,数据库的设置都在这里。

3. 项目初始设置

关于项目的一些设置,我们可以参考常用的基本设置
关于编辑区的一些设置,我们可以参考编辑区设置

开发中必会的技能

1. 高效的代码标记技能

  • Ctrl+Shift+V: 复制历史(当前版本的IDEA只保留15个历史)
  • 对于某行的复制,粘贴,剪贴,可以将鼠标放在当前行的任意位置,不需要使用鼠标全部选中
  • Alt+Shift+上/下:将某行代码上移或者下移

2. 快速跳转

  • 行内跳转:Home跳转到该行最前面,End跳转到该行最末尾
  • 行内快速跳转:Ctrl+左/右 可以实现跨单词跳转
  • 快速定位到某行:Ctrl + G
  • 文件Tabs之间切换:Alt + 左/右
  • 快速打开文件所在文件夹:文件右键-> Show In Explorer
  • 选中当中行:
    • 按住Home(定位到行首),然后Shift+End(行尾)
    • 按住Home(定位到行首),然后Shift+下
  • 选中一大段代码:
    • 光标在一大堆代码最前面,然后鼠标移动到一大段代码的尾部,然后Shift+鼠标左键

3. 快速查找和替换

  • 查找:Ctrl +F
  • 替换:Ctrl +R
  • 全局查找:Ctrl + Shift + F
  • 查找文件:Ctrl + Shift + N
  • 万能查找:连续按两次Shift(无法查找文件内容,所以查找文件内容请使用查找或者全局查找)

(在新的版本当中全局查找和万能查找进行了合并)

4. 万能快捷键

  • Alt + Enter: 智能辅助提示,给出的提示与当前光标所在的位置有关系
  • 见到红色报错就按。
  • 见到波浪线警告就按

运行与调试

1. 启动项目

  • 找到Application文件,然后在main方法的右键选择:Run Application
  • 通过上述方法,启动的文件方式会保存在菜单的启动选项当中,就是如下图:

image.png

  • 在IDEA下方的Run窗口当中也可以选择启动的方式和按钮

image.png

2. 调试项目

在上述所有启动项目的下面或者旁边,都有debug调试项目的按钮,我们下面要说调试代码的几个重要的按钮:

  • Step Over(F8): 执行到当前方法的下一句
  • Step Into(F7): 进入当前行调用的方法体里
  • Step out(Shift + F8): 执行完当前的方法,并跳出

下面是几个不常用的:

  • Force Step Into: 深入进入方法体,类似于JVM代码,一般不怎么使用
  • Run to Cursor: 代码执行到光标处

在代码当中打了很多断点后,在左侧会有个View BreakPoints的按钮,用来管理所有当前项目当中的所有断点,方便集中进行删除,销毁,还有部分设置。

IDEA还会把相关的变量的值都放在当前行的后面,但是在Debug面板当中的Variables当中也可以直观的看到所有变量的值和其变化,并且开发者还可以通过添加监控表达式的方式,来检测自己想看内容的变化。

3. 条件断点

条件断点一般在循环当中用的很多,因为如果循环非常多,不知道在第几次出现问题,或者要查在第几次出现问题就需要使用到条件断点了,一般我们要在for语句当中去添加断点,而不是for语句那一行,其次在Condition当中书写的条件是真正的Java语句代码:

第一种情况,我们要查在第某次循环的情况
image.png

第二种情况,我们可以根据代码的错误或者循环当中的语句随机应变书写条件
image.png

高级进阶

1. 代码生成Generate

  • 生成getter&&setter : 在类当中空白的地方直接右键,选择Generate,然后选择getter and setter,然后选择需要添加getter和setter的属性即可。

  • 生成构造函数:依旧是右键Generate, 选择Constructor,选择作为参数传入的属性即可。

  • 生成toString::依旧是右键选择Generate, 选择toString,但是特别要注意,它默认在选择Template的时候是选择了String concat(+)这种方式,但是我们应该强烈选择StringBuffer,因为String concat(+)这种方式是字符串通过+号连接的方式,在类当中属性很多的时候是性能不高的,因为字符串具有不可变性,在一次次改变当中实际是一次次的创建新内存,变量重新指向的过程。所以我们应该使用StringBuffer。

  • 生成hashCode和equals:依旧是右键选择Generate,选择equals() and hashCode(),然后选择要参与equals方法的类属性,再选择参与hashCode方法的类属性。这种重新生成hashCode和equals的情况经常发生在比较两个实例对象,比如说两个学生是不是同一个,但是学生有很多属性,只有学生的id是唯一且不同的,那么Student.equals()方法的逻辑就应该是只比较两个学生的id即可,无需比较其他属性,所以参与重写equals方法的属性就应该只有id。

2. 代码重构Refactor

代码重构多半是指代的使用IDEA帮助我们进行代码的规范操作。

  • 重命名局部变量:选中一个变量,然后Shift +F6

  • 重命名方法,所有调用到的地方都会同步修改:右键Refactor,选择Rename(快捷键也是Shift + F6)。然后方法名就被红色边框选中,然后修改完进行回车,回车后会提示你相关调用都需要修改,将不需要修改的右键Exclude掉, 最后点击Do Refactor即可

  • 重命名类:在目录当中选中类文件,Shift + F6然后重命名。(这个操作可以使用Ctrl + Z进行撤销)

  • 提取代码:选择一段代码,然后右键Refactor,选择Extract, 再选择Method,意思就是提取成为一个方法,方法的名称,参数名称都可以自定义修改。

3. 代码模板

代码模板通常指的是可以通过什么快捷输入帮我们输入一段固定的代码;

  • sout: 快速输出System.out.println()
  • psvm:快速输出main函数
  • fori:快速输出for循环,循环变量为i

上面这些都是可以在settings当中找到的live template,那如果我们想自定义一些模板的话,就可以自定义live template,依然是在settings当中找到live template当中,然后添加一个新的分组,在分组当中add template
image.png

  • logf就是快捷字母,输入logf,就会自动输出模板代码
  • $CLASSNAME$就是变量代替的地方,可以通过选择Edit cariables去编辑这个变量的类型和初始值。

除了上述的live templates,是直接打快捷键,postfix,先打变量或表达式,再打.快捷键,比如可以打userList.null就会自动输出if(userList == null)这样的代码块,打userList.fori就会输出for(int i = 0; i< userList.size(); i++) 这样的代码块。

postfix的学习和设置可以在settings当中的Postfix Completion当中进行查看

4. 常用的窗口

  • structure窗口:一帮可以帮助你快速阅读源码,一个类当中有哪些方法,属性,接口都能显示在这个窗口,structure窗口在IDEA的左边侧
  • todo窗口:如果你使用// todo这样的方式提醒自己这里将来还要书写代码,todo窗口当中就能显示todo标注的待办事项,防止遗漏书写代码
  • favorites窗口:收藏窗口,一般在不同文件夹切换文件比较麻烦,将不同文件夹的文件拖动到这里,方便切换
  • termimal窗口:这个窗口默认的就是用我们电脑的cmd窗口,我们希望使用git的窗口,我们可以在settings当中找到Terminal,在Shell path当中选择git安装路径下的bash.exe,然后重新打开Terminal

5. 更多使用技巧

  • 分屏:右键tab,选择split,左右分屏还是上下分屏自己选择
  • 浏览器: 在settings当中找到web browsers当中去设置IDEA中点击链接能打开的浏览器
  • 历史:可以右键文件,选择Local History -> Show History,查看文件修改历史,左旧右新
  • 方法调用:方法右键选择Find Usages,可以查看该方法在哪些地方被调用

常用插件

1. git插件

集成Git的操作:

  • 在IDEA的settings的Version Control中找到Git,在最上面Path to Git executable当中选择git.exe的路径,一般是:C:\Program Files\Git\bin\git.exe

  • 对于一个空项目,我们需要在VCS选项当中去选择Enable Version Control Integration这个选项,然后选择Git,这样项目就和Git插件关联起来了。(这一步如果在git命令行当中相当于git init)

  • 关于相关操作,我们去集成git插件去学习。

  • 关联远程仓库:在github上创建了项目之后(注意新建项目的时候不要创建README文件和.gitignore文件),我们可以在已有的项目的Terminal当中执行下面这两句命令就能将已有的项目和远程仓库连接并且提交(当然了在IDEA当中也有提交push按钮,直接点击会让你填写远程地址,都是一样的):

  • 撤销提交:Log窗口当中,在某个提交右键,选择Reset Current Branch to here。文件修改还是在的,只不过撤销了提交记录

  • 追加提交:在提交的时候,有一个Amend选择方框,勾选后提交,则本次提交就会追加到上一次的提交当中,或者说本次提交和上一次合并到了一起。

2. mybatis插件

我们下面介绍一个插件叫做:free mybatis plugin

  • 这个插件在2021版的IDEA当中无法使用,不知道怎么回事

3. maven插件

在settings当中的Maven当中找到相关设置,一般不需要单独下载maven,用idea内置的就可以了,这里有一个设置maven快速下载依赖的设置:

maven相关的操作都在IDEA的右边框当中,如果对pom.xml当中的有些东西进行修改的话,我们可以在这个maven的相关面板当中找到Reload All Maven Projects,就是重新下载所有的相关依赖

在maven操作面板当中,有个按钮Show Dependencies(Ctrl + Alt + Shift + U),可以帮助我们看到一个所有依赖的相关图,但是在新版的IDEA当中没有了,如果有依赖冲突,我们可以在pom.xml当中使用exclusions来解决,比如在spring-boot-starter-web当中使用了ch.qos.logback这个包,然后我们想使用新的版本的ch.qos.logback包,我们单独写一个ch.qos.logback的dependency,然后使用exclusion把spring-boot-starter-web当中的旧包申明移除:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>ch.qos.logback</groupId>
  7. <artifactId>logback-classic</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

关于maven还有插件maven helper,相关的使用我们可以查看: