4.2 Spring数据操作框架

Spring提供了对常用数据软件/服务操作的封装组件,包括关系型数据库、NoSQL数据库、Redis、Elasticsearch、 Cassandra等。本章主要讲述其中最为常用的JDBC、Redis以及MongoDB。

4.2.1 Spring JDBC

3.2节讲了ORM框架,其实Spring也提供了对ORM的支持,包括对Hibernate、JDO以及JPO的支持。相关组件的层次结构如下图所示:

比较常用的是Spring ORM下面一层的Spring JDBC以及Spring TX。

  1. Spring JDBC提供了对JDBC操作的封装,也是Java开发中经常用到的数据库操作工具, 经常用在需要灵活组装SQL的场景下使用,其核心类是JdbcTemplate,提供了很多数据CRUD操作。

    注入一个数据库连接池即可构造JdbcTemplate。

    注入JdbcTemplate到DAO中,可以进行数据库操作。

  2. Spring TX提供了对事务的支持

    使用tx:annotation-driven开启Spring的注解事务,并配置transaction-manager。

    使用@Transactional注解一个方法使其开启事务。

4.2.2 Spring Data Redis

基于jedis之上对Redis操作的封装。

  1. 配置jedis连接池

  2. 配置连接工厂

  3. 构造RedisTemplate即可使用它来做各种操作

    需要注意的一点:如果直接使用RedisTemplate,那么redis的key使用的是String的JDK序列化字节数组,并非是String.getBytes()得到的字节数组。可以通过RedisTmplate的defaultSerializer、keySerializer、valueSerializer、hashKeySerializer以及hashValueSerializer几个属性设置想要使用的序列化机制。其支持的几种序列化机制如下:

    • StringRedisSerializer: 简单的字符串序列化,使用的是String.getBytes()方法。StringRedisTemplate就是使用它作为key、value、hashKey以及hashValue的序列化实现。

    • GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化,对于每一种对象类型都有不同的实现。

    • JacksonJsonRedisSerializer: JSON的序列化方式,使用Jakson Mapper将object序列化为JSON字符串。

    • Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer同样是JSON序列化方式,使用的是jackson databind。

    • JdkSerializationRedisSerializer: 使用JDK自带的序列化机制,也是直接使用RedisTemplate时用的序列化机制。

4.2.3 Spring Data MongoDB

基于Mongo Java Driver对MongoDB的操作封装。使用流程如下:

  1. 定义定义Mongo对象并构造数据库工厂,对应的是MongoDB官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口。

  2. 配置映射相关信息,包括映射上下文、类型映射、映射转换等。

  3. 构造MongoTemplate,即可使用mongoTemplate进行数据库操作。

    这里需要注意上面配置的writeResultChecking和writeConcern是为了安全写入。

    使用MongoTemplate需要给数据库实体类加@Document,并指定集合的名字, 如果不加此注解或者没指定collection, 那么默认使用类的简单名称首字母小写做为集合的名字。

这里需要注意几点:

  • mongo的配置slave-ok为true时,如果readPreference为primary,会自动转换readPreference为secondaryPreferred。建议不要设置slave-ok此选项,直接用readPreference来控制读。

  • Spring Data MongoDB会默认在每个collection中添加_class字段,来标识原始来源类型,可以在defaultMongoTypeMapper将typeKey设置为null去掉此字段。

  • Spring Data MongoDB会把实体类中的id属性转换为_id(MongoDB默认使用的主键field),因此当你使用MongoTemplate做了数据操作后,再使用Mongo Java Driver查询的时候要使用_id而不是id。

  • 实体类中的id如果为空,MongoDB会自动生成ObjectId作为id,读取数据时id被赋值为ObjectId的字符串值。

  • 要注意对MongoDB安全写的配置,根据业务场景对MongoTemplate的writeResultCheckin和writeConcern配置合适的值。

Last updated