1、Java数据结构Pair、MutablePair、ImmutablePair详解
2、slf4j详解
3、@JsonFormat、@JSONField、@DateTimeFormat区别
1. @JsonFormat和@JSONField是处理请求参数为json格式的时间
例如前端传送时间为“2020-08-12 23:28:00”,使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”),这两者前面都带JSON,接收请求和返回数据格式为json时,注解生效
2. @DateTimeFormat也是处理时间格式,但它不支持反序列化,也就是不能转化前端数据格式为json。它能接收表单形式的时间格式,
3. 总结
前端读取数据库日期字段时使用 @JsonFormat和@JSONField 可以将时间戳转为格式化的日期数据。
前端使用JSON提交时用@JsonFormat和@JSONField
前端使用Form提交时用@DateTimeForma
4、Java中时间与时间戳的转换
- 时间转换成时间戳
方式一:
/**
* 时间转换成时间戳,参数和返回值都是字符串
* @param s
* @return res
* @throws ParseException
*/
public static String dateToStamp(String s) throws ParseException {
String res;
//设置时间模版
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(s);
long ts = date.getTime();
res = String.valueOf(ts);
return res;
}
在主函数中设置参数与运行结果
String date=dateToStamp("2021-09-07 09:09:39");
System.out.println(date);
//结果:1630976979000
方式二:
/**
* 日期转换成时间戳,参数可以是日期,返回值是字符串
*/
public static void Date2TimeStamp() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(new Date());
try {
String valueOf = String.valueOf(sdf.parse(format).getTime() / 1000);
System.err.println(valueOf);
} catch (ParseException e) {
e.printStackTrace();
}
}
- 时间戳转换成时间
方式一:
/**
* 将时间戳转换为时间,参数和返回值都是字符串
* @param s
* @return res
*/
public static String stampToDate(String s){
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(s);
Date date = new Date(lt);
res = simpleDateFormat.format(date);
return res;
}
在主函数中设置参数与运行结果
String s="1630339200000";
String date=stampToDate(s);
System.out.println(date);
//2021-08-31 00:00:00
方式二:
/**
* 时间戳先转换成日期字符串再转换成日期类型,参数是字符串,返回值是字符串也可是日期
*/
public static void TimeStamp2Date() {
String timestampString = "1631008034";
String formats = "yyyy-MM-dd HH:mm:ss";
Long timestamp = Long.parseLong(timestampString) * 1000;
//日期格式字符串
String dateStr = new SimpleDateFormat(formats, Locale.CHINA).format(new Date(timestamp));
System.err.println(dateStr);
Date date = null;
SimpleDateFormat formater = new SimpleDateFormat();
formater.applyPattern("yyyy-MM-dd HH:mm:ss");
try {
date = formater.parse(dateStr);
System.err.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
5、@SpringBootTest注解 --基于SpringBoot2.5.7版本
6、Java中自定义注解的用法
@Target
、@Retention
、@Documented
、@Inherited
注解都是作用在注解上的注解,java把他们亲切的叫做元注解,这四个注解正是Java的四大元注解。
1.
@Target
:用于描述注解的使用范围
2.@Retention
:用于描述注解的生命周期【源代码阶段、CLASS文件中有效、运行时有效】
3.@Documented
:表示该注解是否可以生成到 API文档中。注意:@Documented
是一个标记注解,没有成员。
4.@Inherited
:使用@Inherited定义的注解具备继承性 假设一个注解在定义时,使用了@Inherited
,然后该注解在一个类上使用,如果这个类有子类,那么通过反射我们可以从类的子类上获取到同样的注解。
@Target注解
@Target
注解算是比较常见的注解了,@Target
注解用于描述注解的使用范围,优雅的说就是使用了@Target
去定义一个注解,那么可以决定定义好的注解能用在什么地方。
为了显得身临其境的效果,我们可以先进@Autowired
注解看看
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
我想各位都应该很清楚@Autowired
注解的用法了,这个时候我们再来分析分析@Target
注解的用法。
内部值:ElementType[] value()
数组, value
值类型 ElementType
枚举类型,元注解中的枚举值决定了,一个注解可以标记的范围
TYPE
: 类型上面 用于描述类、接口(包括注解类型) 或enum
声明
FIELD
: 用于描述字段
METHOD
:方法
PARAMETER
: 参数 【参数名】
CONSTRUCTOR
: 构造方法
LOCAL_VARIABLE
: 局部变量
ANNOTATION_TYPE
: 可以打在注解上面
PACKAGE
:可以打在包上面
TYPE_PARAMETER
: 参数类型【形式参数类型】
TYPE_USE
: 任何位置都可以
这时应该更能清晰的看出,@Autowired
注解用于描述注解的使用范围了~
@Retention
@Retention也是开发中经常用到注解
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
@Retention
:用于描述一个注解存在的生命周期,主要包括源码,字节码文件,运行时。
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
1、RetentionPolicy.SOURCE
:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS
:注解被保留到class文件,但jvm加载class文件时候被遗弃【默认】
3、RetentionPolicy.RUNTIME
:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Document
@Document
注解较少用,简单了解即可。
该注解主要判断是否可以生成到 API文档中 ==》即生成API文档的时 检验
@Inherited
这是一个稍微复杂的注解类型. 它指明被注解的类会自动继承. 更具体地说,如果定义注解时使用了 @Inherited
标记,然后用定义的注解来标注另一个父类, 父类又有一个子类(subclass),则父类的所有属性将被继承到它的子类中.
@Inherited
表示一个【注解】能够被继承,不是说注解与注解之间能否相互继承,而是说:一个类A被注解了,那么另外一个类B,继承了A类B类能够继承到A类中,的注解 (即被@Inherited
注解过的注解)
7、fastjson使用详解
参考
8、java 里面添加out:极客用法
9、java 中 BigDecimal 详解
参考
设置保留两位小数,并向下取整
BigDecimal scale = new BigDecimal(totalScore).setScale(2, BigDecimal.ROUND_DOWN);
totalScore = scale.doubleValue();
10、Nginx 文件上传 413 错误解决方法
我们使用ngnix做web server的时候,nginx对上传文件的大小有限制,默认是1M。
当超过大小的时候会报413(too large)错误。这个时候我们找到nginx.conf配置文件下的location /{},在里面增加client_max_body_size 20M;
注意:20M设置为你需要的大小即可,但是如果客户端没有对上传文件的大小做限制,在上传文件的时候大于你设置的值,还是会报413错误导致你的客户端服务停掉,因此如果你不希望发生这样的事,将值改为0,即改为:
client_max_body_size 0; 即可。设置为0将禁用客户端请求主体大小的检查。
以下内容为官网原文:
更多配置见官网
句法: client_max_body_size size;
默认: client_max_body_size 1m;
内容: http,server,location
设置客户端请求正文的最大允许大小,在“ Content-Length”请求标头字段中指定。如果请求中的大小超过配置的值,则会向客户端返回413(请求实体太大)错误。请注意,浏览器无法正确显示此错误。设置size为0将禁用客户端请求主体大小的检查。
11、基础工具类Joiner的使用
Guava之Joiner笔记
Guava 中有一些基础的工具类,如下所列:
-
Joiner 类:根据给定的分隔符把字符串连接到一起。MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value。
-
Splitter 类:与 Joiner 操作相反的类,是根据给定的分隔符,把一个字符串分隔成若个子字符串。
-
CharMatcher,Strings 类:对字符串通用的操作,例如移除字符串的某一部分,字符串匹配等等操作。
-
其他类:针对Object操作的方法,例如 toString 和 hashCode 方法等。
Joiner
这是在我们代码中出现频率比较高的一个功能。经常需要将几个字符串,或者字符串数组、集合之类的东西,拼接成一个以指定符号分隔各个元素的字符串,比如要将一个用List保存的集合拼起来作为SQL语句的条件,在知道Joiner之前我们会这样做。
// 拼接: AND goods IN(123,1234,345)
productSql.append(" AND goods IN (");
for (Long goods : spuIdList) {
productSql.append(goods + ",");
}
productSql.delete(productSql.length() - 1, productSql.length()).append(")");
```java
上面的代码注意的一点就是我们要移除字符串最后的一个分隔符。虽然不难,但是很无聊,下面借助 Joiner 类,代码瞬间变得优雅起来。
productSql.append(" AND goods IN (“).append(Joiner.on(”,“).skipNulls().join(spuIdList)).append(”)");
**补充:**
* 如果传入的对象中包含空指针,会直接抛出空指针异常。Joiner 提供了两个方法,让我们能够优雅的处理待拼接集合中的空指针。
* 如果我们希望忽略空指针,那么可以调用 `skipNulls`方法,得到一个会跳过空指针的 Joiner 实例。如果希望将空指针变为某个指定的值,那么可以调用 `useForNull` 方法,指定用来替换空指针的字符串。
```
Joiner.on(",").skipNulls().join(spuIdList);
Joiner.on(",").useForNull("#").join(spuIdList);
```
* Joiner 不仅可以返回string ,还有方法能够处理StringBuilder类:
[](https://blog.csdn.net/LXYDSF/article/details/128011305?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167056121516800182186127%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167056121516800182186127&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128011305-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v3&utm_term=%20Joiner.on&spm=1018.2226.3001.4187)二、Joiner.MapJoiner
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MapJoiner 是 Joiner 的内部静态类,用于帮助将 Map 对象拼接成字符串。
@Test
public void testJoiner(){
Map<String, String> map = new HashMap<>();
map.put("红楼梦", "刘姥姥");
map.put("三国演义", "关羽");
map.put("水浒传", "李逵");
map.put("西游记", "猪八戒");
String str = Joiner.on(" ").withKeyValueSeparator(":").join(map);
System.out.println(str);//水浒传:李逵 红楼梦:刘姥姥 三国演义:关羽 西游记:猪八戒
}
[](https://blog.csdn.net/LXYDSF/article/details/128011305?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167056121516800182186127%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167056121516800182186127&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128011305-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v3&utm_term=%20Joiner.on&spm=1018.2226.3001.4187)三、常用API总结:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#### [](https://blog.csdn.net/LXYDSF/article/details/128011305?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167056121516800182186127%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167056121516800182186127&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128011305-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v3&utm_term=%20Joiner.on&spm=1018.2226.3001.4187)appendTo
```java
// 可追加,实现了Appendable接口的都可以使用
A appendTo(A appendable, Iterable<?> parts)
// 向appendable参数后追加first、second…所有参数
A appendTo(A appendable, @Nullable Object first, @Nullable Object second, Object… rest)
比较常见的实现类: BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer
用法
String[] arr = {"a","b","c"};
StringBuilder ab = new StringBuilder("start: ");
StringBuilder ac = Joiner.on("").appendTo(ab,arr);
System.out.println(ab); // start: abc
System.out.println(ac); // start: abc
Join+on
// 将可迭代的参数中所有子元素连接。
String join(Iterable<?> parts)
// 为static对象设置分隔符
static Joiner on(char separator)
Joiner实例不可变,即用final修饰,一旦初始化不可变,所以分步调用joiner的静态函数是不起作用的。如:
@Test
public void testJoiner(){
Joiner joiner = Joiner.on(',');
joiner.skipNulls(); // 不起作用!
String str = joiner.join("wrong", null, "wrong");
System.out.println(str);
}
// 会抛出 NullPointerException
这样使得joiner线程安全,并且返回的都是final static常量
其他
Joiner skipNulls()
Joiner useForNull(String nullText)
Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)
最后
大家有兴趣的可以去了解下Guava中其他类的用法,源码写的也很棒!
附上链接:
Joinner源码解析:https://blog.csdn.net/dancheng1/article/details/84819034
强大的Google Guava类库: https://cloud.tencent.com/developer/article/2035964
Guava库使用:https://blog.csdn.net/weixin_44139651/article/details/123804181
效率提升神器之Guava-Joiner:https://baijiahao.baidu.com/s?id=1736921815066348757&wfr=spider&for=pc