如何在Java8中处理日期和时间

1. 前言

在 Java 8 之前处理日期时间的 API 存在着一些诸如非线程安全、设计差、时区处理麻烦等问题,为了解决这一系列的问题,Java 8 推出了全新的日期时间 API 供使用,包路径为 java.time

其中最常使用的为下面的几个类

  • Instant:瞬时实例
  • LocalDate:本地日期,不包含具体时间
  • LocalTime:本地时间,不包含日期
  • LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
  • ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。

下面将举出具体例子来详细介绍

Java常用工具类之StringUtils类

原文链接:https://blog.csdn.net/diypp2012/article/details/82971716

该工具类是用于操作 Java.lang.String 类的。 StringUtils 类与 String 类的区别在于:此类是 null 安全的,即如果输入参数 String 为 null,则不会抛出NullPointerException 异常,代码更健壮。 以函数 isEmpty 为例子: 存在字符串stringTest, 若该字符串为空,返回 true

JWT整合Spring Security

1. 前言

之前介绍了一下 JWT ,在最后提到了

JWT 本身没啥难度,但安全整体是一个比较复杂的事情,JWT 只不过提供了一种基于 token 的请求验证机制。但我们的用户权限,对于 API 的权限划分、资源的权限划分,用户的验证等等都不是 JWT 负责的。也就是说,请求验证后,你是否有权限看对应的内容是由你的用户角色决定的。所以我们这里要利用 Spring 的一个子项目 Spring Security 来简化我们的工作。

了解JSON Web Token(JWT)

1. 前言

互联网服务离不开用户认证,一般流程是下面这样。

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

3、服务器向用户返回一个 session_id,写入用户的 Cookie。

4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?

一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

下面介绍 JWT 的使用。

Maven更换阿里镜像

1. 前言

Maven 默认的中央仓库速度慢,可以考虑换成阿里的镜像。修改方式主要有两种,全局修改和针对当前项目的修改。

2. 全局修改

2.1 Windows

Windowsmaven.m2 文件夹地址在 C:\User\****\.m2 (***为具体的用户名)

Spring Boot中配置Slf4j+logback日志框架

1. 前言

Slf4j的全称是 Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JPA一样,只是一种规则而已。所以单独的Slf4j是不能工作的,必须搭配其他具体的日志实现方案,比如apache的org.apache.log4j.Logger,jdk自带的java.util.logging.Logger等。

Ubuntu 18.04.2 安装redis

1. 前言

Redis 是目前业界使用最广泛的内存数据存储。相比 Memcached,Redis 支持更丰富的数据结构,例如 hashes, lists, sets 等,同时支持数据持久化。除此之外,Redis 还提供一些类数据库的特性,比如事务,HA,主从库。可以说 Redis 兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。本文介绍 Redis 在Ubuntu 18.04.2 系统下的安装,为后续学习奠定基础。

JPA使用Specification动态查询

1. 前言

有时我们在查询某个实体的时候,给定的条件是不固定,这个时候就需要动态构建相应的查询语句,在 Spring Data JPA 中可以通过继承 JpaSpecificationExecutor 接口来实现动态查询。相比于使用 JPQL 来进行动态查询,其优势是类型安全,更加的面向对象。

JPA中的CascadeType(级联操作)解析

1. Cascade介绍

​ Cascade(级联)在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须要删除对应的关联表信息,否则,会存有脏数据。所以,适当的做法是,删除主表的同时,关联表的信息也要同时删除,在 hibernate 中,只需设置 cascade 属性值即可。

JPA踩坑记录

以下是本人使用 JPA 的时候遇到的坑,记录一下

  1. 在使用的时候,能使用单向关联就尽量不要用双向关联,如果使用双向关联,请记得一定要在非主控端加上 @JsonIgnore 等让 Json 能够忽略序列化的注解,否则可能会出现爆内存的提示
  2. JPA 中的双向 @ManyToMany 不建议使用,尽量能不双向就不双向使用 @ManyToMany,如果非要使用千万记得要在非主控端加上 @JsonIgnore 等让 Json 能够忽略序列化的注解,否则可能会出现爆内存的错误提示
  3. 使用 findById() 而不是 getOne() 来通过主键查找一个实例。因为findById()是立即加载而getOne() 是使用延迟加载,需要在方法上加上@Transactional 注解,否则会出现懒加载异常
  4. JPA 自定义增删改的时候,记得加 @Transactional 注解,否则会出现懒加载异常
  5. 如果要使用懒加载的话,需要在 service 层增加 @Transactional 注解,以避免 session 被误关闭造成懒加载异常
  6. 不要相信 @DynamicUpdate 注解会自己给你 pass 掉属性为 null 的字段,它依旧会把数据库里所有你没传入参数的值设置为 null
  7. 想要动态更新的最好方式是将数据库中该条记录所有信息全部查询出来,并使用 copyProperties 将不为 null 的字段复制到新修改的字段中
  8. 在 @Test 下测试 Spring Boot JPA 时,要加上 @Transactional 与 @RollBack(value= false) 注解,否则执行完测试后,JPA会回滚操作

如果还遇到什么问题,会持续更新…