Spring集成数据访问框架
Spring自带了一组数据访问框架,集成了多种数据访问技术。不管直接使用JDBC,还是Hibernate、Mybatis这样的ORM框架,Spring都可以帮助我们消除持久化代码中单调枯燥的数据访问逻辑。
Spring允许我们在持久层选择不同的方案,如JDBC、Mybatis、Hibernate、Java持久化API(Java Persistence API, JPA)以及NoSql数据库。
为了避免持久化的逻辑分散到应用的各个组件中,最好将数据访问的功能放到一个或多个专注于此任务的组件中,这样的组件通常被称为数据访问对象,即DAO,或者Repository。其实无论是DAO还是Repository就是一层设计,类比其它层有controller、service。
1、spring提供统一异常体系
使用Spring可以抛出一致的数据访问异常。JDBC的异常太笼统,在catch里无法修复;Hibernian提供了很多数据访问异常,但这些异常是平台特有的。Spring提供了更多的数据访问异常,和平台无关。
Spring所有的异常都继承自非检查型异常DataAccessException,因为Spring认为触发异常的很多问题是不能在catch代码块中修复的。
2、spring模板访问
如果想要使用Spring的数据访问异常,我们必须使用Spring所支持的数据访问模板。
不管使用什么数据访问技术,都需要一些特定的数据访问步骤,如获取一个连接、事务、处理错误、释放资源以及访问数据库逻辑。前四者都是固定的,最后一个不同访问一定不同。spring使用模板方法模式封装前四者,最后一个由我们自己编写。
针对不同的持久化技术,Spring提供了多个模板,有JDBCTemplate、HibernateTemplate、JpaTemplate以及针对MyBatis的SqlMapClientTemplate。
配置数据源
在声明模板和Repository之前,我们需要配置数据源来连接数据库。
JDBC每次都需要创建新的连接;Spring基于JDBC提供了三个数据源类DriverManagerDataSource、SimpleDriverDataSource、SingleConnectionDataSource,但这三个数据源类也都没有提供连接池功能。因此应该使用数据源连接池,数据源连接池有c3p0等。
基于Spring无论使用JDBC连接、Spring自带的数据源还是第三方数据源,都只需要声明一个类,给这个类配置数据库连接、用户名、密码等即可。
在Spring中集成Hibernate
1、声明Hibernate的SessionFactory
Spring提供了三个类供我们声明Hibernate的SessionFactory
2、Repository编程
在Spring和Hibernate的早期岁月中,需要把HibernateTemplate注入到Repository。HibernateTemplate能够保证每个事务使用同一个Session。但这种方式的缺点是Repository的实现与Spring耦合。
现在的最佳实践是不使用HibernateTemplate,而是使用ContextSession。通过这种方式,会直接将HibernateSessionFactory装配到Repository中,并使用它来获取Session。
但这样Spring的统一非检查类型异常就使用不了了,不过,我们可以添加一行配置,为其添加异常转换,如下:
@Bean public BeanPostProcessor persistenceTranslation() { return new PersistenceExceptionTranslationPostProcessor(); }
PersistenceExceptionTranslationPostProcessor是一个bean后置处理器,它会在所有拥有@Repository注解的类上添加一个通知器,这样就会捕获任何平台相关的异常并以Spring非检查数据访问异常的形式重新抛出。
在Spring中集成JPA
1、声明EntityManagerFactory
2、Repository编程
Spring对JPA也提供了JpaTemplate模板及对应的JpaDaoSupport,但是JpaTemplate已经被弃用了。同上。
所以我们可以在Repository中直接注入EntityManagerFactory。
3、Hibernate提供了自动生成sql的功能,我们也可以借助Spring Data JPA实现自动化的JPA Repository,从而避免使用JPA还要编写sql
a、不需要我们写Repository的实现类,Spring Data JPA会自动生成Repository的实现类,并为我们添加18个基本的访问数据库的方法、自动生成sql。
b、这18个方法一定不够我们使用,如果我们要自定义访问数据库的逻辑,也不需要编写Repository的实现类,在Repository接口的里编写方法即可,Spring会根据方法名泛型参数等生成DAO方法及sql。
c、如果想更灵活地自定义访问数据库的逻辑,还不需要写Repository的实现类,在Repository接口的某个方法上添加@Query注解,注解的参数传入Sql即可。
d、编写Repository的实现类
当Spring Data JPA为一个Repository接口生成实现类的时候,会查找名字与接口相同并以Impl为后缀的一个类,如果这个类存在,Spring Data JPA会把它上述方法和这个实现类的方法合并。
Spring集成NoSql数据库
Spring Data JPA是Spring Data项目下的一个子项目,可以在使用JPA时在运行时自动生成Repository的实现。
另外,Spring Data 还提供了对多种NoSQL数据库的支持,如MongoDB、Neo4j、Redis。它不支持自动化的Repository,还支持基于模板的数据访问和映射注解。
Spring集成MongoDB
MongoDB是文档数据库,它一般是单表操作不支持关联关系的复杂数据模型。文档数据库不是通用的数据库,它所擅长解决的是一个很小的问题集。
Spring Data JPA为基于JPA的数据访问实现了自动生成Repository实现类。Spring Data MongoDB也为MongoDBy实现了相同的功能。
Spring Data MongoDB与Spring Data JPA有一点不同,Spring Data MongoDB还为MongoDB提供了将Java 对象映射为文档的功能。这是因为JPA规范本身已经提供了对象关系映射注解,所以Spring Data JPA就不再需要提供这样的功能了。
一、Spring Data MongoDB提供的功能:
通过注解映射对象文档
使用MongoTemplate访问文档数据库
自动化运行时生成Repository实现
二、使用
1、配置MongoDB
2、为Java实体类添加映射注解
3、使用MongoDBTemplate访问MongoDB
通常来讲,我们会将Spring提供的MongoDBTemplate的MongoOperations注入到Repository中,并使用它来操作数据库。
4、编写MongoDB Repository
如果你不愿意编写MongoDB Repository,可以使用Spring Data MongoDB自动生成Repository的实现。
a、自动生成一些访问MongoDB的方法
b、添加自定义的访问MongoDB的方法,类似于Spring Data JPA
c、使用@Query注解,更加灵活地自定义访问MongoDB,类似于Spring Data JPA
d、编写MongoDB Repository实现类,类似于Spring Data JPA
Spring集成Neo4j
Neo4j是一个图数据库。
Spring Data Neo4j提供了很多与Spring Data JPA和Spring Data MongoDB相同的功能。
一、Spring Data Neo4j提供功能:
将Java对象映射到图节点和关联关系的注解
面向模板的Neo4j访问方式
自动生成Repository实现
二、使用
1、配置Neo4j
2、使用注解映射Java对象和图
3、使用Neo4jTemplate
4、创建自动化的Neo4jRepository
Spring集成Redis
Redis是一种key-value数据库,key-value存储和哈希Map有很大的相似性。对于哈希Map和key-value存储来说,其实没有太多的操作。只是提供将某个value存储到特定的key上,根据key获取value这样的操作。因此,Spring Data 的自动生成Repository的实现类并没有应用到Redis上。
可以使用Spring 的模板访问Redis。