Spring DAO、Spring ORM、Spring JDBC的区别

Spring DAO、Spring ORM、Spring JDBC的区别

Spring框架是Java平台的应用程序框架和反转控制容器。该框架的核心特性可以被任何Java应用程序使用,但也有一些扩展用于在Java EE平台上构建web应用程序。

Spring-DAO

Spring-DAO不是一个spring模块。它不提供访问数据的接口或模板。在使用Spring DAO时需要编写的一个重要更改是,它必须使用@Repository进行注释。这样做的原因是,JDBC、Hibernate、JPA等底层技术中可能出现的异常被一致地转换为各自的DataAccessException子类。让我们通过一个学生服务场景的例子来了解这一点。

最初,使用的是Hibernate的持久性机制。假设让我们假设在服务层捕获HibernateException。应该有一些可行的步骤来捕捉它。但是在某个时间点,它已经被更改为JPA,而不是Hibernate,那么就不需要更改DAO接口。

相反,如果用@Repository注释它,那么与当前底层技术相关的异常将直接转换为spring DataAccessException。由于该特性,尽管底层技术从hibernate更改为JPA或从JPA更改为hibernate,但仍然会抛出相同的Spring DataAccessExceptions。根据底层技术,spring将根据它们的本地异常进行转换。

使用与异常相关的spring DAO的限制

  • 不应该捕获持久性异常
  • 异常的层次结构通常比spring提供的更丰富、更有意义。但是没有从一个提供者到另一个提供者的映射。在DAO中添加@Repository的原因是,扫描过程会自动添加bean。Spring倾向于向注释添加其他有用的特性。

与Spring DAO相关的示例代码片段。服务实现层必须用@Repository和相应的服务层进行注释。

// Necessary imports
@Repository('<Specify the DAO that is getting accessed')
// Eg : StudentDAO
public class StudentDAOImplementsation
    extends HibernateDao<Student, Long>
    implements StudentDAO {
  
    @Override public boolean remove(Student studentObject)
    {
        // Write necessary steps
        return true;
    }
}

Spring ORM

Spring-ORM是一个非常有效的模块,它充当了一个伞模式。将其称为保护伞的原因是它涵盖了许多持久性技术,即JPA、JDO、Hibernate和iBatis。对于每一项单独的技术,Spring都提供了集成类。有了这些集成类,每种技术都可以轻松地与Spring事务管理集成。DataSource的注入主要是通过SessionFactory或EntityManagerFactory等bean完成的。对于纯JDBC,除了JdbcTemplate之外,不需要任何集成类,因为JDBC(Java数据库连接)直接依赖于数据源。对于每种技术,配置基本上包括将DataSource bean注入到某种类型中。对于纯JDBC,不需要这样的集成类(除了JdbcTemplate),因为JDBC只依赖于DataSource。对于像JPA或Hibernate这样的ORM, Spring-JDBC不是必需的,但是Spring-Data是必需的。Spring-Data只是一个伞形项目,它可以提供一个通用API来定义访问DAO和注释,它涵盖了SQL和NoSQL数据源。模型类必须使用@Entity进行注释,其中主键必须使用@Id进行注释。下面给出了学生模型类的示例代码。

// Necessary import statements
  
// This is much required and here model class
// should match with database table name
@Entity 
public class Student {
  @Id
  private int studentId;
  // other necessary attributes like name, address etc.,
  // Corresponding getter and setter methods
}

Spring ORM DAO和服务类必须使用@Component进行注释

// Necessary import statements
@Component
public class StudentDAO {
  @PersistenceContext
  private EntityManager em;
  // Rest set of code
}

Spring JDBC

JdbcTemplate类由Spring-JDBC提供。它直接帮助检查SQL查询和参数。不需要担心管道代码,因为它不需要那样做。使用DataSource进行配置是必须的。下面给出了示例代码。

// necessary import statements
int totalStudents = jdbcTemplate.queryForObject("select count(1) from Student", Integer.class);
Student student = jdbcTemplate.queryForObject("select name, address from Student where id=?", 
            rs -> new Student(rs.getString(1), rs.getString(2)), 
            12345);

使用Spring-JDBC的优点是它提供了一个JdbcDaoSupport,对于扩展DAO非常有用。它有两个属性,即DataSource和JdbcTemplate。它们有助于实现DAO方法。此外,还有一个可用的异常转换器,它将SQL异常转换为spring DataAccessExceptions。

区别表

Spring-DAO Spring ORM Spring JDBC
通用概念和@Repository注解是必须的。 与Spring轻松整合,具有以下特点
Hibernate的SessionFactory
用于JPA的EntityManagerFactory
用于MyBatis的SqlSessionFactory
对于普通的JDBC调用。
数据访问的实现是完全分离的,因此它是独立于数据库的。 通过与所需工具的整合,可以实现多技术的实施。 如果应用程序并不复杂和多样化,并且位于一个单一的数据库上,我们可以使用这个方法,而且很有效率。
需要指定一个额外的层和它的依赖关系。因此,如果应用程序很复杂,可能需要一些时间来启动。 需要指定一个额外的层和它的依赖关系。因此,如果应用程序很复杂,可能需要一些时间来启动。 由于这是直接的,不需要复杂的依赖关系,但如果我们使用这个,可移植性会变差。
由于附加层的复杂性,维护问题将会存在。 由于附加层的复杂性,维护问题将会存在。 在这里只需较少的维护。
像工厂类和数据传输对象(DTO)这样的设计模式需要和DAO一起实现。 得到了多种技术的支持,如Hibernate、JPA和iBatis。 实施很简单。如果依靠单一的数据库和直接查询的目的手段可以依靠这个。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程