1、Maven中的dependencyManagement
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。
eg:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-bom</artifactId>
<packaging>pom</packaging>
<version>1.8.0</version>
<description>
ruoyi-api-bom api依赖项
</description>
<dependencyManagement>
<dependencies>
<!-- 系统接口 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-system</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 资源服务接口 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-resource</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
.
2、@Data
@Data注解的主要作用是提高代码的简洁,使用这个注解可以省去实体类中大量的get()、 set()、 toString() 等方法。
在实体类上注解
eg:
package com.ruoyi.system.api.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 当前在线会话
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public class SysUserOnline implements Serializable {
/**
* 会话编号
*/
private String tokenId;
/**
* 部门名称
*/
private String deptName;
/**
* 用户名称
*/
private String userName;
/**
* 登录IP地址
*/
private String ipaddr;
/**
* 登录地址
*/
private String loginLocation;
/**
* 浏览器类型
*/
private String browser;
/**
* 操作系统
*/
private String os;
/**
* 登录时间
*/
private Long loginTime;
}
.
3、@NoArgsConstructor和@AllArgsConstructor
@NoArgsConstructor:生成无参的构造方法。
@AllArgsConstructor:生成该类下全部属性的构造方法。
在springboot中,对于一个bean类,注入其他bean的时候,常见的是使用@Autowired,实际上也可以使用构造函数注入,这个时候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor来代替。
详细见@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的区别以及在springboot常用地方
.
4、@EqualsAndHashCode
@EqualsAndHashCode注解的作用就是自动实现model类的equals方法和hashcode方法。
- @EqualsAndHashCode(callSuper = true),就是用自己的属性和从父类继承的属性来生成hashcode;
- @EqualsAndHashCode(callSuper = false),就是只用自己的属性来生成hashcode;
- @Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集, 和@EqualsAndHashCode默认是false。
详细见Lombok 中 @EqualsAndHashCode注解的使用
.
5、@TableName、@TableField、@TableLogic
-
@TableName(value = …)
当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名(不加这个注解默认将实体类的小写形式在db中寻找) -
@TableField 字段注解,该注解用于标识非主键的字段。将数据库列与 JavaBean 中的属性进行映射
-
@TableLogic:在实体类中属性加上@TableLogic注解,表示该字段是逻辑删除字段。
-
@TableField(exist = false) :可以解决表中表的问题,加载bean属性上,表示当前属性不是数据库的字段(非数据库字段),但在项目中必须使用,这样可以用来把一个数据表当作一个字段来输出,用来实现表中表数据输出。
-
@TableField(fill = FieldFill.*):用于设置实体类中对应的字段在插入时需要填充,FieldFill 是一个枚举类型,它定义了 4 种自动填充策略,分别为:DEFAULT: 不进行任何填充、INSERT: 插入时填充、UPDATE: 更新时填充、INSERT_UPDATE: 插入和更新时都填充。当我们在实体类中使用 @TableField(fill = FieldFill.INSERT) 注解时,表示该字段在插入数据时会自动填充相应的值,而在更新数据时不会进行填充。
eg:
详细见注解@TableName、@TableField
.
6、Spring校验注解:@NotNull、@NotBlank、@NotEmpty
- 1.@NotNull
不能为 null,但可以为 empty,一般用在 Integer 类型的基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制 - 2.@NotEmpty
不能为 null,且长度必须大于 0,一般用在集合类上或者数组上 - 3.@NotBlank
只能作用在接收的 String 类型上,注意是只能,不能为 null,而且调用 trim() 后,长度必须大于 0即:必须有实际字符
注:
- 注意在使用 @NotBlank 等注解时,一定要和 @valid 一起使用,否则 @NotBlank 不起作用。
- 一个 BigDecimal 的字段使用字段校验标签应该为 @NotNull。
- 在使用 @Length 一般用在 String 类型上可对字段数值进行最大长度限制的控制。
- 在使用 @Range 一般用在 Integer 类型上可对字段数值进行大小范围的控制。
详细见常用的校验注解之 @NotNull、@NotBlank、@NotEmpty 的区别
.
7、@Validated,@Email,@Size、@Length、@Max、@Min
- @Validated:对传输的参数进行数据校验,可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
- @Email :被注释的元素必须是电子邮件地址
- @Min 验证 Number 和 String 对象是否大等于指定的值
- @Max 验证 Number 和 String 对象是否小等于指定的值
- @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
- @Length(min=, max=) 验证字符串长度是否在给定的范围之内
max和min是对你填的“数字”是否大于或小于指定值,这个“数字”可以是number或者string类型。长度限制用length。
详细见SpringBoot @Validated注解实现参数校验
.
8、@ExcelIgnoreUnannotated、@ExcelProperty
- @ExcelIgnoreUnannotated:没有注解的字段都不转换(EasyExcel里的注解)
- @ExcelProperty:用于匹配excel和实体类的匹配,参数:value是列名,index是列名的序号, converter默认自动选择,指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext) 方法即可。
注:
1、这里自己编写了字典格式化@ExcelDictFormat注解类:
package com.ruoyi.common.excel.annotation;
import com.ruoyi.common.core.utils.StringUtils;
import java.lang.annotation.*;
/**
* 字典格式化
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ExcelDictFormat {
/**
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
*/
String dictType() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
String readConverterExp() default "";
/**
* 分隔符,读取字符串组内容
*/
String separator() default StringUtils.SEPARATOR;
}
2、在@ExcelProperty(value = “是否默认”, converter = ExcelDictConvert.class),字典格式化转换处理ExcelDictConvert实现了Converter<Object '> 里的方法:
package com.ruoyi.common.excel.convert;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.ruoyi.common.core.service.DictService;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.excel.annotation.ExcelDictFormat;
import com.ruoyi.common.excel.utils.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
/**
* 字典格式化转换处理
*/
@Slf4j
public class ExcelDictConvert implements Converter<Object> {
@Override
public Class<Object> supportJavaTypeKey() {
return Object.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return null;
}
@Override
public Object convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
ExcelDictFormat anno = getAnnotation(contentProperty.getField());
String type = anno.dictType();
String label = cellData.getStringValue();
String value;
if (StringUtils.isBlank(type)) {
value = ExcelUtil.reverseByExp(label, anno.readConverterExp(), anno.separator());
} else {
value = SpringUtils.getBean(DictService.class).getDictValue(type, label, anno.separator());
}
return Convert.convert(contentProperty.getField().getType(), value);
}
@Override
public WriteCellData<String> convertToExcelData(Object object, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
if (ObjectUtil.isNull(object)) {
return new WriteCellData<>("");
}
ExcelDictFormat anno = getAnnotation(contentProperty.getField());
String type = anno.dictType();
String value = Convert.toStr(object);
String label;
if (StringUtils.isBlank(type)) {
label = ExcelUtil.convertByExp(value, anno.readConverterExp(), anno.separator());
} else {
label = SpringUtils.getBean(DictService.class).getDictLabel(type, value, anno.separator());
}
return new WriteCellData<>(label);
}
private ExcelDictFormat getAnnotation(Field field) {
return AnnotationUtil.getAnnotation(field, ExcelDictFormat.class);
}
}
详细见EasyExcel 样式注解大全 和 Easy Excel 常用注解
.
9、@Pattern
@Pattern:检验,比如时间格式校验、字典类型校验。
把这个注解加在entity的参数上,可以选择分类也可以默认;关于注解中需要传的参数:一般默认就填入正则表达式即可,但是java中字符串需要转义。
.
10、@JsonIgnore、@JsonProperty
-
@JsonIgnore
作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。 -
@JsonProperty
作用:主要用于实体类的属性上,作用可以简单的理解为在反序列化的时候给属性重命名(多一个名字来识别) -
@JsonInclude
作用:是jackSon中最常用的注解之一,是为实体类在接口序列化返回值时增加规则的注解。
详细见json过滤某些属性 之@jsonignore
和@JsonProperty使用详解
和@JsonInclude注解
.
11、Tree基类
package com.ruoyi.common.core.web.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
/**
* Tree基类
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class TreeEntity<T> extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 父菜单名称
*/
@TableField(exist = false)
private String parentName;
/**
* 父菜单ID
*/
private Long parentId;
/**
* 子部门
*/
@TableField(exist = false)
private List<T> children = new ArrayList<>();
}
.
12、Entity基类
package com.ruoyi.common.core.web.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Entity基类
*/
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 搜索值
*/
@JsonIgnore
@TableField(exist = false)
private String searchValue;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
private Map<String, Object> params = new HashMap<>();
}