Spring Boot总结(一):入门
Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(四):提高数据库访问性能
Spring Boot总结(五):安全设计
Spring Boot总结(六):Spring Boot SSO
Spring Boot总结(七):使用分布式文件系统
Spring Boot总结(八):云应用开发
Spring Boot总结(九):构建高性能的服务平台
Spring Boot总结(十):自动配置实现原理
Spring Boot总结(十一):数据访问实现原理
Spring Boot总结(十二):微服务核心技术实现原理
对于传统关系型数据库来讲,Spring Boot使用JPA(Java Persistence API)资源库来实现对数据库的操作,使用MySQL也是如此,简单地讲,JPA就是为POJO(Plain Ordinary Java Object)提供持久化的标准规范,即将Java的普通对象通过对象关系映射(Object-Relational Mapping,ORM)持久化到数据库中;
JPA:spring-boot-starter-data-jpa
mysql:mysql-connector-java
@Table指定关联的数据库的表名
@Id定义一套记录的唯一标识
@GeneratedValue将其设置为自动生成
@ManyToOne定义多对一关系
日期类型使用@DateTimeFormat来进行格式化
@JsonBackReference用来防止关系对象的递归访问
接口:JPARepository继承于PagingAndSortingRepository,它提供了分页和排序的功能,PagingAndSortingRepository继承与CrudRepository,它提供了增删改查功能。
JPA还提供了一些自定义的声明方法的规则,例如在接口中使用关键字findBy、readBy、getBy作为方法名的前缀,拼接实体类中的属性字段(首页字母大写),并可选的拼接一些SQL关键字来组合成一个查询的方法。
对于符合JPA规则的,这些方法不需要实现,JPA会代理实现这些方法;
JPA的配置类:
@EnableTransactionManagement 启用了JPA的事务管理;
@EnableJPARepository 启用了JPA资源库并指定了上面定义的接口资源库的位置;
@EntityScan指定定义实体的位置
数据库的表结构不需要创建,在程序运行的时候会根据实体的定义自动的创建;
hibernate:
ddl:update
就是使用Hibernate来自动的更新表结果,即如果数据表不存在则创建表,或者如果修改了表结构,在程序启动的时候则执行表结构的同步更新;
使用spring:datasource来设置数据源:
url:
username:
password:
Redis是一种可以持久存储的缓存系统,是一个高性能的key-value数据库,它使用键-值的方式来存储数据;
spring-boot-starter-redis
Redis提供了下列几种数据类型可供存取:
对于Redis,Spring Boot没有提供像JPA那样的相应的资源库接口
RedisTemplate初始化
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate
StringRedisTemplate
Jackson2JsonRedisSerializer
ObjectMapper
}
}
安装redis之后,在application.yml中配置连接Redis服务器等参数;
对于使用Redis还可以将注解方式与调用数据库方式相结合,那样就不需要编写像上面那样的服务类,并且使用起来更加的简单。
MongoDB是文档型的NoSQL数据库,具有大数据量、高并发等优势,但缺点是不能建立实体关系,而且也没有事务管理机制;
Spring Boot中使用MongoDB就像使用JPA一样容易,并且同样拥有功能完善的资源库,同样的,如果要使用MongoDB,首先必须在Maven中添加spring-data-mongodb
除了MongoDB依赖之外,还需要一些附加的工具配套使用;
例如:org.pegdown
spring-boot-starter-hateoas
jackson-annotations
MongoDB是文档型数据库,使用MongoDB也可以使用关系型数据库那样为文档建模
@Document(collection=)
@Id
@NotNull
@PersistenceConstructor
MongoDB也有像使用JPA那样的资源库,可以继承于MongoRepository,实现文档的持久化
MongoDB的配置类:继承AbstractMongoConfiguration
Neo4j是具有传统数据库的优点,又具备NoSQL数据库优势的一种数据库,Neo4j是一个高性能的NoSQL图数据库,并且具备完全事务特性,Neo4j将结构化数据存储在一张图上,图中每一个节点的属性表示数据的内容,每一条有向边表示数据的关系。Neo4j没有表结构的概念,它的数据用节点的属性来表示;
spring-data-neo4j
虽然Neo4j没有表的概念,但是它有节点和关系的概念。
Neo4j的实体关系模型的定义比起关系型数据库的实体-关系模型的定义要简单的多,但是它更加形象和贴切的表现了实体之间的关系。更难能可贵的是,这个实体-关系模型可以不经过任何的转换直接存到数据库中,即,在Neo4j图数据库中保存的数据仍然是一张图,对于业务人员和数据库设计人员来讲,它的意义相同,所以使用neo4j数据库,很大程度上减轻了设计工作和沟通成本;
像JPA使用了ORM一样,Neo4j使用了对象-图形映射(Object-Graph Mapping,OGM)的方式来建模。
类注解:
@JsonIdentityInfo防止查询数据的时候引发递归访问效应
@NodeEntity 标识这个类是一个节点实体
属性注解:
@GraphId定义了节点的一个唯一性标识,它将在创建节点时候由系统自动生成,所以它是不可缺少的。节点的属性可以跟随需要增加或则减少,并不影响节点的使用;
@Relationship(type=”ACTS_IN”,direction=Relationship.INCOMING)
@EelationshipEntity表名这个类是一个关系实体,并用type指定了关系的模型,其中@StartNode指定起始节点的实体,@EndNode指定终止节点的实体,这说明了图中有向边的起点和终点的定义。
节点实体的持久化:
继承GraphRepository。
关系实体不需要 持久化,当保存节点实体的时候,节点实体的关系将会通知保存;
@EnableTransactionManagement启用了事务管理;
@EnableNeo4jRepository启用了Neo4j资源库并指定了我们定义的资源库接口的位置;
@Configuration直接来声明Neo4j的配置类,该类继承于Neo4jConfiguration
在重载的SessionFactory函数中设定了定义实体的位置,这将促使定义的实体被作为域对象导入,RemoteServer设定连接Neo4j服务器的URL、用户名和密码;
需要注意的是:Neo4j还没有日期格式的数据类型,所以在读取日期格式类型的数据的时候,使用注解@DateTimeFormat进行格式转换,而在保存@DateLong将它转换成Long类型的数据进行存储;