1. Java 目录结构
src | - main | - | - java | - | - | - com (包名) | - | - | - | - | - xx (包名) | - | - | - | - | - | - module (包名) | - | - | - | - | - | - | - controller (控制层, 接收和处理用户请求) | - | - | - | - | - | - | - domain (专门维护数据库字段的) | - | - | - | - | - | - | - dto (输入层, 只能接收已维护的字段) | - | - | - | - | - | - | - vo (输出层, 只能输出已维护的字段) | - | - | - | - | - | - | - mapper (写操作数据库方法接口用的, 关联resources.mapper 文件夹) | - | - | - | - | - | - | - service (接口类) | - | - | - | - | - | - | - | - impl (接口实现, 逻辑在这里写) | - | - resources | - | - | - mapper | - | - | - | - *.xml (写SQL语句操作数据库用的) | - | - | - application.yml (配置文件) target (用于存放编译生成的类文件、资源文件和构建后的包文件等)
2. 数据分页用法
public TableDataInfo<HomestayVo> getData() { List<> list = new ArrayList<>(); startPage(); return getDataTable(list); } // 请求接口时必须带上 pageSize(分页条数) 和 PageNum(当前页数) 参数字段 // 注意:startPage 只对第一条 SQL 生效,若想其他SQL生效,则必须在调用SQL前手动调用startPage()
3. forEach 循环用法
dto.getImageSrc().forEach(e -> { });
3.1 for 循环用法
for (Image e : dto.getImageSrc()) { }
4. 接受参数
public AjaxResult getData(HttpServletRequest request) { String orderId = request.getParameter("orderId"); }
5. 自增 ID 配置代码
/** * 序号 */ @TableId(value = "id", type = IdType.ASSIGN_ID) private String id;
6. 使用雪花算法生成 ID 时,注意将 Long 类型改为 String 类型。若不改会引起以下问题
后端传给前端后几位数字变为 0 问题
问题描述:
当后端为 Long 类型的数字传给前端,在 Postman 里面是正常的,但前端页面取到的后几位数字变为了0
问题分析:
Javascript 的 Number 类型最大长度是 17 位
Java 的 long 类型长度是 19 位
7. APP/小程序接口提示没有权限,请联系管理员授权
若不需要分配接口权限的话,去掉 “@PreAuthorize”注解即可
8. Java 项目启动后自动调用某个方法
通过使用 @Component 以及 @PostConstruct 注解来实现此功能
@Component public class Example{ @PostConstruct public void init() { // 在依赖注入完成后执行的初始化代码 } }
9. Maven 依赖版本号不生效
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency> </dependencies>
结果发现以上依赖不生效,一直加载3.6.3的包,后来得知
dependencyManagement 标签的优先级要高于 dependencies 标签
所以改为以下代码即可生效
<dependencyManagement> <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency> </dependencies> </dependencyManagement>
10. 异常处理之 try-catch-finally
try { … // 可能产生异常的代码 Jedis resource = jedis.getResource(); return; } catch (ExceptionName1 e) { … // 当产生ExceptionName1型异常时的处置措施 } catch (ExceptionName2 e) { … // 当产生ExceptionName2型异常时的处置措施 } finally { … // 无论是否发生异常都会执行 if (jedis != null) { jedis.close(); } }
11. 异常处理之 try-with-resources
try (Jedis resource = jedis.getResource()) { return resource; } catch (ExceptionName1 e) { … // 当产生ExceptionName1型异常时的处置措施 } catch (ExceptionName2 e) { … // 当产生ExceptionName2型异常时的处置措施 }
在Java 7及以上的版本中,可以使用 try-with-resources 语句来自动关闭资源。try-with-resources 语句会在代码块结束时自动关闭已声明的资源,无需显式调用关闭方法,从而简化资源管理的代码。
12. 同步锁 synchronized。在多用户同时请求接口(添加、修改、删除)一般需要用到。以下是同步锁代码
synchronized(lock) { // 这里是同步执行的代码 }
13. 运行项目命令
nohup /www/wwwroot/xxx/jdk1.8.0_151/bin/java -jar ruoyi-admin.jar --spring.profiles.active=prod &
查询运行日志
tail -f nohup.out
14. 开启事务
@Transactional
15. 获取当前用户ID
// 获取用户信息 LoginUser user = SecurityUtils.getLoginUser(); if(user == null || user.getUserId().isEmpty()) { throw new RuntimeException("请重新登录"); } SysUser userInfo = sysUserServiceImpl.selectUserById(user.getUserId());