一开始因为大项目权限原因源码拉不下来,后来下载的simple分支,看的是simple Demo。

下载源码后看了一下依赖,发现主要是使用springboot-web,springboot-date-jpa,h2,还使用了freemarker模板引擎,以下是目录结构。

image.png

由于之前学过的是ssm,springboot和mybatis-plus的使用,并且数据库一直使用的是Mysql或sql server,没有学习过jpa+h2,所以我决定就从simple demo开始学习。

从配置文件开始,查看配置文件,发现只有短短的一行server.port=9990

那么先启动一下项目,发现是能启动成功的,访问/project/list接口查看结果。

image.png

发现结果能正常获取,在以我以前使用mysql的基础下思考,配置文件里没有配置数据源url应该是无法获取到数据源的,况且也没有给到数据表导入,这些数据是怎么获取的呢?

基本流程

所以进行了代码深入,点进了/project/list接口的实现方法中,再进入到对应服务实现类中发现,与之前编写的套路差不多,也是直接控制器->服务->仓储->数据源。但是仍然没有发现到有数据源的配置存在。

image.png

只好继续往下走,看到仓储存在的两个继承接口Repository<T,ID>JpaSpecificationExecutory<T>

image.png

查找资料并且到jpa的文档说明中发现,并以mybatis类比。

Repository<T,ID>相当于@Repository注解,生成一个repository bean供spring管理
JpaSpecificationExecutor与mybatis-plus中的BaseMapper接口差不多,属于JPA的标准查询方法接口

再回到list服务查看,他使用标准查询方法findAll中使用了两个参数,ProjectSpec和Pageable,这两个参数与控制器传进来的形参condition和pageable有关。回头查看控制器。

image.png

这里明显pageable是分页,而condition是访问时的条件,这个条件使用了一个Vo来接收了。所以可以判断到是使用了condition这个条件来构造ProjectSpec,我们查看ProjectSpec类的内部。

image.png

是实现了Specification接口,这个接口类似于mybatis-plus的条件构造器QueryWrapper,这里重写toPredicate后实现了条件构造器,查询资料发现,CriteriaBuilder是标准查询构造器,其中的构造链式方法也和QueryWrapper的极为相像,如下图。

image.png

发现其他的role,transaction,user结构都一样,就不再重复了。

了解domain层的注解

代码中出现的注解有: 有关lombok的@EqualsAndHashCode,@Accessors,@Data,@Setter @Getter 有关数据表映射的@Entity,@Table,@id,@SequenceGenerator,@GeneratedValue,@Column,@Enumerated,@Temporal。

值得注意的是,lombok中的@Date帮你编写了Getter,Setter,equals,hashCode,toString方法,也就是相当于代替了@Setter @Getter,@ToString,@EqualsAndHashCode。

一开始我不懂的两个注解参考资料如下:

@Enumerated枚举注解

@Temporal日期格式化注解

还有关于@EqualsAndHashCode的问题@Accessors的参数意义

CodeGenerator与Commons

Commons中各包的意义就是如其包名,我仔细分析的地方就是在CodeGenerator中使用了constant中的枚举类来创建模板。

仔细看到是CodeGenerator中使用了codetemplate中的各个模板生成了我以上观看的所有代码。

抛出疑问

根据了解,h2内存数据库是不需要数据源就能连接的,由springboot能自动配置,但对有关h2数据库的问题依旧保留疑问。参考https://blog.csdn.net/zyhlwzy/article/details/78733644