zoukankan      html  css  js  c++  java
  • Spring集成数据访问框架、集成NoSql数据库

    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。

  • 相关阅读:
    《Orange‘s》 Bochs环境配置
    《CSAPP》读书笔记
    基于SDL2实现俄罗斯方块
    VS 提示对象被多次指定;已忽略多余的指定
    SDL2.0 vs2017环境配置
    初探模板元编程
    从代码理解 cartographer X --- 浅析Cartographer框架之美
    从代码理解 cartographer 1
    Arch Linux 安装总结
    从代码理解 cartographer 3 --- 理解 Range data 数据的流入
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/12821438.html
Copyright © 2011-2022 走看看