SpringData JPA是Spring Data下的多个子项目之一,通过在运行时自动生成Repository实现,Spring Data JPA让JPA的使用过程更简单。Spring Data还提供了对多种NoSQL数据库的支持,包括MongoDB、Redis等,不仅支持自动化的Repository,还支持基于模板的数据访问和映射注解。
使用MongoDB持久化文档数据
有一些数据的最佳表现形式是文档,也就是不要把数据分散到多个表、节点或实体中,将这些信息收集到一个非规范化的结构中会更方便,通常来说,文档是独立的实体。能够按照这种方式优化并处理文档的数据库,被称为文档数据库。
文档数据库不适用的场景:文档数据库不是通用的数据库,所擅长解决的是一个很小的问题集。有些数据具有明显的关联关系,文档数据库并没有针对存储这样的数据进行优化。在文档数据库中存储具有丰富关联关系的数据也不是不行,只是这样做麻烦大于收益。
MongoDB是最流行的开源文档数据库之一,Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB:
通过注解实现对象-文档映射
使用MongoTemplate实现基于模板的数据库访问
自动化的运行是Repository生成功能
配置MongoDB
@Configuration
//启用MongoDB的Repository
@EnableMongoRepositories(basePackages="com.coder.spring.profile.mongo")
public classMongoConfigextendsAbstractMongoConfiguration{
//指定数据库名称
@Override
protectedStringgetDatabaseName() {
return"testDB";
}
//创建Mongo客户端
@Override
publicMongomongo()throwsException {
return newMongoClient();
}
}
MongoDB是远程的数据库服务的
@Configuration
//启用MongoDB的Repository
@EnableMongoRepositories(basePackages="com.coder.spring.profile.mongo")
public classMongoConfigextendsAbstractMongoConfiguration {
@Autowired
privateEnvironmentenvironment;
//指定数据库名称
@Override
protectedStringgetDatabaseName() {
return"testDB";
}
//创建Mongo客户端 远程验证
@Override
publicMongomongo()throwsException {
MongoCredential credential = MongoCredential.createMongoCRCredential(
environment.getProperty("mongo.username"),
"testDB",
environment.getProperty("mongo.password").toCharArray());
return newMongoClient(newServerAddress("localhost",37000),Arrays.asList(credential));
}
}
XML配置:
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
profile="dev"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
为模型添加注解,实现MongoDB持久化
MongoDB没有提供对象-文档映射的注解,SpringData MongoDB提供了一些将java类映射为MongoDB的注解。
@Document和@Id注解类似于JPA的@Entity和@Id注解。
@Document(collection="follow_activity")
public classFollowActivityPOimplementsSerializable{
@Id
privateLongid;
@Field("name")
privateStringactivityName;
}
Java类中,除非将属性设置为瞬时态(transient)的,否则java对象中所有的域都会持久化为文档中的域,并且如果不适用@Field注解进行设置的话,那么文档中的名字将会与对应的Java属性相同。
使用MongoTemplate访问MongoDB
//将MongoTemplate注入到类型为mongoOperations的属性中
@Autowired
MongoOperationsmongoOperations;
publicLonggetCount(){
returnmongoOperations.getCollection("order").getCount();
}
MongoOperations是MongoTemplate所实现的接口,暴露了多个使用MongoDB文档数据库的方法。通常,将MongoOperations注入到设计的Repository类中,并使用它操作Repository方法。
编写MongoDB Repository
通过扩展MongoRepository,Repository接口能继承多个CRUD操作,它们会由Spring Data MongoDB自动实现
使用Redis操作Key-Value数据
Redis是一种特殊类型的数据库,被称为key-value存储。
连接到Redis
Redis连接工厂会生成到Redis数据库服务器的连接。SpringData Redis为四种Redis客户端实现提供了工厂
JedisConnectionFactory
JredisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory
@Bean
publicRedisConnectionFactoryredisFactory(){
JedisConnectionFactory factory =newJedisConnectionFactory();
factory.setHostName("test-server");
factory.setPort("6973");
factory.setPassword("123456");
returnfactory;
}
使用RedisTemplate
Redis连接工厂会生成到Rediskey-value存储的连接。借助RedisConnection,可以存储和读取数据。Spring Data Redis提供了两个模板:
RedisTemplate
StringRedisTemplate
RedisTemplate可以极大的简化Redis数据访问,能够持久化各种类型的key和value,并不局限于字节数组。由于key和value通常都是String类型,StringRedisTemplate扩展了RedisTemplate,只关注String。
RedisTemplate和其子API的很多功能,区分了单个值和集合值
使用key和value的序列化器
当某个条目保存到Rediskey-value存储的时候,key和value都会使用Redis的序列化器进行序列化。Spring Data Redis提供了多个序列化器:
GenericToStringSerializer:使用Spring转化服务进行序列化
JacksonJsonRedisSerializer:使用Jackson1,将对象序列化为JSON
Jackson2JsonRedisSerializer:使用Jackson2,将对象序列化为JSON
JdkSerializationRedisSerializer:使用Java序列化
OxmSerializer:使用Spring O/X映射的编排器和解排器实现序列化,用于XML序列化
StringRedisSerializer:序列化String类型的key和value
这些序列化器都实现了RedisSerializer接口,如果其中没有符合需求的序列化器,那么还可自行创建。
当想把key和value序列化为不同的类型,如key为String,Value为JSON。可以通过RedisTemplate的setKeySerializer()和setValueSerializer()方法。
领取专属 10元无门槛券
私享最新 技术干货