探讨依赖注入与数据库的关系 (依赖注入 数据库)

依赖注入与数据库:相互依存的关系

依赖注入(Dependency Injection,DI)和数据库是现代软件开发的两个核心概念。它们相互依存,DI可以使用数据库的数据,而数据库也可以通过DI来完成许多任务。本文将探讨依赖注入和数据库之间的关系,并介绍一个基于DI的数据库访问框架的实现。

什么是依赖注入?

在软件开发中,依赖是指一个对象与另一个对象之间的联系。假设我们有一个拥有几个方法的类A,这些方法需要使用类B和类C的实例。我们可以把类A称作B和C的依赖。但问题是,我们必须在类A中创建B和C的实例,这使得A的代码变得混乱,难以维护。依赖注入(DI)解决了这个问题。在DI中,我们把类A依赖的接露给外部,让外部创建一个实现这个接口的类的实例,然后把它注入到A的构造函数或属性中。这使得A的代码变得简洁易读,并且可以更好地维护。

如何使用依赖注入与数据库交互?

数据库是现代应用程序中最核心的组成部分之一。我们必须从应用程序中读取数据,把数据写回数据库。面向对象编程语言例如Java、C#和Python提供了一些API来访问数据库,但在实际使用过程中,我们需要将通用的CRUD操作封装到类中,使得我们可以轻松地使用它们。

为了与数据库交互,我们需要一个框架提供数据访问对象(Data Access Object,DAO)和ORM对象关系映射(Object-Relational Mapping,ORM)的实现。这个框架应该是基于依赖注入的,这样我们就可以注入我们的数据访问对象或ORM对象来访问数据库。

例如,我们假设我们有一个类UserDAO,它使用一个数据库连接(Connection对象)并封装了许多用于执行SQL查询和修改的方法。我们可以通过依赖注入为UserDAO注入这个Connection对象。例如,我们可以使用Spring Framework来注入连接对象:

“`java

@Repository

public class UserDAO {

private final Connection connection;

@Autowired

public UserDAO(Connection connection) {

this.connection = connection;

}

public List getUsers() {

// execute SQL query and return list of User objects

}

// other methods…

}

“`

其中,@Autowired注解告诉Spring Framework自动注入Connection对象。我们还可以使用Spring的JdbcTemplate来执行SQL操作。

ORM对象关系映射

ORM对象关系映射是一个针对关系型数据库的中间层,它充当对象与数据库之间的映射工具。ORM负责将数据库中的数据转化为Java或C#对象,以及将这些对象转化为SQL查询语句。很多ORM框架,例如Hibernate和Entity Framework,基于依赖注入,这意味着我们可以注入ORM来使用它们。

ORM框架可以访问数据库中的数据,并将数据转化为对象,这些操作通常通过使用注解或XML文件进行配置。例如,我们可以使用Hibernate来映射一个User类到一个数据库表:

“`java

@Entity

@Table(name = “users”)

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = “name”)

private String name;

@Column(name = “age”)

private int age;

// getters and setters

}

“`

其中,@Entity和@Table注解指定User类对应的数据库表名。@Id注解指定了对象的ID属性,它将在数据库中自动生成并映射到主键列。@Column注解指定了name属性对应的列名。

接下来,我们可以为User类创建一个DAO对象,使用ORM框架与数据库进行交互:

“`java

@Repository

public class UserDAO {

@Autowired

private SessionFactory sessionFactory;

public List getUsers() {

Session session = sessionFactory.getCurrentSession();

CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();

CriteriaQuery query = criteriaBuilder.createQuery(User.class);

Root root = query.from(User.class);

query.select(root);

Query q = session.createQuery(query);

return q.getResultList();

}

// other methods…

}

“`

其中,我们使用了Hibernate的SessionFactory对象来创建Session对象,并使用它执行SQL查询。

结论

相关问题拓展阅读:

spring事物管理是怎么实现的

Spring框架简介

Spring框架是一个2023年2月才出现的开源项目,该开源项目起源自Rod Johnson在2023年末出版的《Expert One-on-One J2EE Design and Development》一书中的基础性代码。在该书中,Rod Johnson倡导J2EE实用主义的设计思想,而Spring框架正是这一思想的更全面和具体的实现。Spring框架由一个容器,一个配置和组织组件 的框架,和一组内置的为事务、持久化和Web用户接口提供的服务组成。作为一种轻量级的J2EE框架,Spring提供了一种有效的方式来建立和组织 J2EE应用程序。

Spring特性

IoC(Inversion of Control;控制反转);又称DI(Dependency Injection;依赖注入);是面向对象领域新兴的编程思想;也是Spring的精髓所在。简单地说;IoC就是指程序之间的关系由容器来控制;而不 是传统实现中由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码转到外部容器,控制权的转移,也就是所谓的反转。IoC将控制创 建的职责搬进了框架中;并把它从应用代码脱离开来。当使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据 XML配置数据提供给它。

Spring IoC,借助于依赖注入设计模式,使得开发者不用理会对象自身的生命周期及其关系,而且能够改善开发者对模式的使用。对于一个颤猜森对象的管理不是什么困难,难 就难在对整个对象群的管理。依赖注入可以让容器管理对象,即“Don’t call me, I will call you”。这样对象本身的生命周期以及对象之间的关系就不再让开发者费神了。

Spring AOP,借助于Spring实现拦截器,开发者能够实现以声名方式使用企业级服务,比如安全、事务服务。AOP 合理的补充了OOP,借助于Spring AOP,开发者能够高效的使用J2EE服务。

Spring服务抽象,借助于各种J2EE API抽象,使得开发者能够一致地使用J2EE 技术,而不管具体是使用什么J2EE API,借助于Spring服务抽象,使代码大大减少,满足“更少代码,更少BUG”的软件设计原则。

Spring IoC+Spring AOP+Spring服务抽象,一起形成Spring,这样茄亩一个有机体,使构建轻量级J2EE成为可能。

Spring事务管理

Spring事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的兆碧代码比较多;声明式的比编程式的更灵活方便。

1.传统使用JDBC的事务管理

以往使用JDBC进行数据操作,使用DataSource,从数据源中得到Connection,我们知道数据源是线程安全的,而连接不是线程安全 的,所以对每个请求都是从数据源中重新取出一个连接。一般的数据源由容器进行管理,包括连接池。例如TOMCAT,WEBSPHERE,WEBLOGIC 等这些J2EE商业容器都提供了这个功能。

以往的我们使用JDBC在写代码时,事务管理可能会是这样:

Connection conn = null;

try{

conn = DBConnectionFactory.getConnection;

conn.setAutoCommit(false);

//do something

conn.commit(); //commit transcation

}catch(Exception e)

finally catch(SQLException se){ //do sth.}

//close ResultSet,PreparedStatement,Connection

//notice:Maybe ocurr Exception when u close rs,pstmt,conn

}

按照以往的思路来写代码,代码量比较长,而且容易疏忽,忘掉一些try/catch,引发一些异常无法catch,虽然有时候我们会写Dool类,来关闭这些资源,并且保证在关闭这些资源时,不向外抛异常,但是这样做会导致额外的麻烦。

2.Spring事务管理提供的编程式

Spring提供了几个关于事务处理的类:

TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交

Spring+Hibernate的实质:

就是把Hibernate用到的数据源Datasource,Hibernate的SessionFactory实例,事务管理器HibernateTransactionManager,都交给Spring管理。

那么再没整合之前Hibernate是如何实现事务管理的呢?

通过ServletFilter实现数据库事务的管理,这样就避免了在数据库操作中每次都要进行数据库事务处理。

一.事务的4个特性:

原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做。

一致性:数据不会因为事务的执行而遭到破坏。

隔离性:一个事务的执行,不受其他事务(进程)的干扰。既并发执行的个事务之间互不干扰。

持久性:一个事务一旦提交,它对数据库的改变将是永久的。

二.事务的实现方式:

实现方式共有两种:编码方式;声明式事务管理方式。

基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。

声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

三.创建事务的时机:

是否需要创建事务,是由事务传播行为控制的。读数据不需要或只为其指定只读事务,而数据的插入,修改,删除就需要事务管理了。

一种常见的事务管理配置:事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED

adminService

columnsService

newsService

crawlService

memberLevelService

memberService

categoryService

merService

cartService

ordersService

trafficService

true

transactionInterceptor

关于依赖注入 数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 探讨依赖注入与数据库的关系 (依赖注入 数据库)