02-02使用NoSQL数据库

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()方法。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181111G10OMU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券