`

Spring 使用数据库(数据库交互处理)

    博客分类:
  • java
阅读更多
Spring里的数据处理多数采用“模板方法”模式

web.xml文件中加载Spring配置文件路径:
<!--加载spring文件-->
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


获取数据源:
<!--常量配置文件读入-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
		<list>
			<value>classpath*:config/jdbc.properties</value>
			<value>classpath*:config/hibernate.properties</value>
			<value>classpath*:config/mail.properties</value>
		</list>
	</property>
</bean>

上面这段代码还可以简化成如下代码:
<context:property-placeholder
		location="classpath:config/hibernate.properties" />

PropertyPlaceholderConfigurer类和context:property-placeholder元素在spring里面所起的作用是相同的,都是加载常量配置文件,只是context:property-placeholder元素更简化。


针对不同的对象/关系映射框架提供的模板有JdbcTemplate、HibernateTemplate、SimpleJdbcTemplate等很多模板。

使用模板的两种方法:
1)、将其配置为Spring上下文里的Bean,然后将其织入到程序的DAO。
2)、使用Spring的DAO支持类进一步简化程序DAO。【DAO支持类派生出自己的DAO类:在编写自己的DAO实现时,可以继承DAO支持类,然后调用模板获取方法来直接访问底层的数据访问模板。例如程序DAO继承了JdbcDaoSupport,那么只需调用getJdbcTemplate()方法就可以获得一个JdbcTemplate来使用。另外每个DAO支持类都能访问它与数据库进行通信所有的类,例如JdbcDAOSupport.getConnection()获得链接。DAO支持类举例:JdbcDAOSupport、HibernateDAOSupport、simpleJdbcDAOSupport等】

Spring的大多数持久支持选项依赖于数据源,首先需要配置Spring数据源,无论什么DAO支持类,都需先陪这个。

数据源获得的几种途径(Spring里配数据源的途径):
1)、jdbc驱动程序定义的数据源;
2)、jndi查询的数据源;
3)、连接池的数据源;

下面是采用连接池的方式配置数据源,首先配置连接池,需要下载DBCP,然后把jar文件放到classPath下,DBCP里面有多个提供池功能的数据源,我们采用最常用的一个BasicDataSource,这个使用起来比较简单,BasicDataSource的配置代码和常用的配置属性见P110。

jdbc驱动定义的数据源有两种:DriverManagerDataSource、SingleConnectionDataSource,这两种都有弊端,一般不用(一个是没有进行池管理,一个是只有一个连接,用的很少)。


下面说一下项目里面子常用的数据源配置结构,项目里最常用的配置方式是把数据库相关的配置信息放到properties文件里面,然后在配置数据源的时候引用这些配置。

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
		<list>
			<value>classpath*:config/jdbc.properties</value>
			<value>classpath*:config/hibernate.properties</value>
			<value>classpath*:config/mail.properties</value>
		</list>
	</property>
</bean>

上面这段就表示将数据库相关的三个配置文件加载到容器里面去,然后下面就配置数据源使用这些配置信息。通过$符号就能获取到上面这些配置文件里面配置的信息
     <bean id="proxoolDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
            <property name="driver" value="${jdbc.driverClassName}"/>
            <property name="driverUrl" value="${jdbc.web.url}"/>
            <property name="user" value="${jdbc.web.username}"/>
            <property name="password" value="${jdbc.web.password}"/>
            <!-- 别名 -->
            <property name="alias" value="${jdbc.web.alias}"/>
            <!-- 最小连接数 (默认2个) -->
            <property name="minimumConnectionCount" value="${proxool.minimumConnectionCount}"/>
            <!-- 最大连接数 (默认5个) -->
            <property name="maximumConnectionCount" value="${proxool.maximumConnectionCount}"/>
            <!-- 测试的SQL执行语句 -->
            <property name="houseKeepingTestSql" value="${proxool.houseKeepingTestSql}"/>
            <!-- -->
            <property name="simultaneousBuildThrottle" value="${proxool.simultaneous-build-throttle}"/>
            <!-- 最大活动时间(超过此时间线程将被kill,默认为5分钟) -->
            <property name="maximumActiveTime" value="${proxool.maximumActiveTime}"/>
            <!-- 最少保持的空闲连接数 (默认2个) -->
            <property name="prototypeCount" value="${proxool.prototypeCount}"/>
            <property name="trace" value="true"/>
            <property name="verbose" value="true"/>
            <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒) -->
            <property name="houseKeepingSleepTime" value="${proxool.hourseKeepingSleepTime}"/>
            <!-- 连接最长时间(默认为4个小时) -->
            <property name="maximumConnectionLifetime" value="${proxool.maximumConnectionLifetime}"/>
            <!-- -->
            <property name="statistics" value="${proxool.statistics}"/>
     </bean>

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面首先讲解第一部分内容:使用JDBC模板

对于JDBC来说,Spring提供了3个模板类:JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate。
下面是这3个类最基本的类似的使用方式(它们的使用方式非常类似,只是执行查询、修改等操作时参数不同,配置完全类似):
1、首先声明Template:
<bean id="jdbcTemplate" class="org.spring......JdbcTemplate">
   <property name="datasource" ref="dataSource"/>
</bean>
2、然后在Dao里面声明private JdbcTemplate jdbcTemplate,并声明set方法。
3、声明Dao Bean,并注入jdbcTemplate属性:
<bean id="rantDao" class="com.roadrant......JdbcRantDao">
   <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
4、接下来就可以在DAO中使用jdbcTemplate操作数据库了。具体使用方式参考书上使用范例。(书上都有,要详细查看其中比如更新、查询、删除等对应方法)。

注意:上面是JdbcTemplate的大体使用示例及配置,另外两个NamedParameterJdbcTemplate、SimpleJdbcTemplate的配置基本相同,只需将类名修改下并且DAO是声明变量时将变量类型修改下即可。具体的操作SQL语句方式示例自己详细看书。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面讲解第二部分内容:Spring对JDBC的DAO支持类:

Spring的JdbcDaoSupport就是用于编写基于JDBC的DAO类的基类,我们只需让自己的DAO类继承它即可(下面是使用步骤):
1、让自己的DAO类继承JdbcDaoSupport,例如
public class JdbcRantDao extends JdbcDaoSupport......{.......}
2、接下来声明自己的DAO,并注入jdbcTemplate(不需要DAO里面定义jdbcTemplate属性)或直接将数据源注入(更简单,这样就不需要在Spring里声明jdbcTemplate Bean了)
<bean id="rantDao" class="com.roadrantz......JdbcRantDao">
   <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
【注:这样的话就不需要在自己的DAO里定义jdbcTemplate这个属性了,因为JdbcDaoSupport类里有这个属性,继承过来即可。但还需要在Spring里声明jdbcTemplate Bean】;



<bean id="rantDao" class="com.roadrantz......JdbcRantDao">
   <property name="dataSource" ref="dataSource"/>
</bean>
【注:当JdbcDao的dataSource属性被设置后,它会在内部创建一个JdbcTemplate实例,这样我们就不需要自己再Spring里明确声明一个JdbcTemplate Bean了,并且自己的Dao类里也不需要定义JdbcTemplate属性了。这种使用方式比较简单实用】

3、利用JdbcDaoSupport的getJdbcTemplate()方法能方便的访问JdbcTemplate,然后用它操作SQL语句操作数据库。具体JdbcTemplate操作SQL语句及各种增删改查操作示例见书上。

注意:上面是Spring对Jdbc的Dao支持类,使用示例及配置,另外两个NamedParameterJdbcDaoSupport、SimpleJdbcDaoSupport的配置基本相同,只需将Dao继承的类名修改下即可,例如getNamedParameterJdbcTemplate()方法即可获得NamedParameterJdbcTemplate的一个实例。具体操作SQL的使用方式将书上。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面讲解第三部分内容:Spring对ORM框架的支持,重点讲解Spring里继承Hibernate:

选择Hibernate版本:Hibernate2和Hibernate3使用中最重要一点区别是Hibernate3支持注解,Hibernate2不支持。大部分情况下还是使用Hibernate3。

与Hibernate进行狡猾的主要接口是org.hibernat.session,这个session接口提供了基本的数据访问功能,比如从数据库保存、更新、和加载对象,通过它,程序能执行任何持久功能。获得Hibernate Session对象引用的标准方式是实现Hibernate的SessionFactory接口。SessionFactory负责打开、关闭、和管理Hibernate Session,以及其他一些功能。

就像JdbcTemplate把JDBC的繁琐工作抽离出去一样,Spring的HibernateTemplate在Hibernate   Session之上提供了一个抽象层,其主要功能是简化打开和关闭Hibernate会话,并且把Hibernate的特定异常转化为表Spring ORM异常之一。

下面是Spring集成Hibernate的步骤:
1、声明hibernateTemplate Bean并注入sessionFactory:
<class id="hibernateTemplate" class="org.springframework.......HibernateTemplate">
   <property name="sessionFactory" ref="sessionFactory"/>
</class>
2、声明SessionFactory Bean,sessionFactory属性被设置为org.hibernate.SessionFactory实现的一个引用,这里提供几种可选的声明方式:
  1)、使用Spring的LocalSessionFactoryBean:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalLocalSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <property name="mappingResources"><!--映射文件-->
      <list>
         <value>com/roadrantz/domain/Rant.hbm.xml</value>
         .................
      </list>
   <property/>
   <property name="hibernateProperties"><!--hibernate配置属性-->
      <props>
         <prop key="hibernate.dialect">${hibernate.dialect}</prop>
      </props>
   </property>
</bean>
  2)、我们可以选择使用注解把持久元数据标记到域对象。对于基于注解的Hibernate来说,Spring的AnnotationSessionFactory和上面的LocalSessionFactory Bean很像,只是它基于一个或多个域类里的注解和创建SessionFactory:
<bean id="sessionFactory" class=".............AnnotationSessionFactory">
   <property name="dataSource" ....../>
   <property name="annotatedClasses"><!--包含一个或多个包含持久注解的类-->
      <list>
         <value>com.roadrantz.domain.Rant</value>
         ..............
      </list>
   </property>
   <property name="hibernateProperties">......</property>
</bean>

3、然后在自己的Dao类里面定义属性,例如:
private HibernateTemplate hibernateTemplate;并定义此属性的set方法。
4、声明Dao Bean,并注入hibernateTemplate属性:
<bean id="rantDao" class="com.roadrantz........HibernateRantDao">
   <property name="hibernateTemplate" ref="hibernateTemplate">
</bean>
5、接下来就是使用hibernateTemplate操作数据库了,详细操作方式看书,。
例如:hibernateTemplate.saveOrUpdate(velicle);

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面讲解第四部分内容:Spring对Hibernate的DAO支持类:

为了让上面讲解的一部分的事情简单一些,Spring提供了HibernateDaoSupport,它能够让我们把会话工厂Bean直接装配到DAO类,会创建一个HibernateTemplate供DAO使用。

下面是使用步骤:
1、让自己的Dao类继承HibernateDaoSupport。例如:
public clss HibernateRantDao extends HibernateDaoSupport{....................}
2、在Dao里面使用getHibernteTemplate()方法获得由HibernateDaoSupport创建的HibernateTemplate(在Dao里面不需要自己定义HibernateTemplate属性了),并用它来操纵数据库。
例如:
public void saveMotorist(Motorist motorist) {
   getHibernateTemplate().saveOrUpdate(motorist);
}
3、声明Dao Bean,并把SessionFactory Bean装配到Dao Bean的SessionFactory属性:
<bean id="rantDao" class="com.roadrantz.dao.hibernate.HibernateRantDao">
   <property name="sessionFactory" ref="sessionFactory"/>
</bean>
【HibernateRantdao的新父类HibernateDaoSupport需要一个Hibernate SessionFactory,这样它才能在内部生成一个HibernateTemplate,所以需要把sessionFactory Bean注入到里面】

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面讲解第五部分内容:Hibernate3上下文会话(解决Hibernate与Spring的耦合问题):

HibernateTemplate的缺点是具有一定的侵入性,当我们使用Spring的HibernateTemplate时(无论直接使用还是通过HibernateDaoSupport),HibernateRantDao类都被耦合到Spring API,而Hibernate3的上下文会话可以解决这一问题。
下面是Hibernate3的上下文会话使用方式:
1、在自己的Dao里面定义SessionFactory sessionFactory属性,并定义此属性set方法。
2、配置自己的Dao Bean,并注入sessionFactory属性:
<bean id="rantDao" class="com.roadrantz.......HibernateRantDao">
   <property name="sessionFactory" ref="sessionFactory"/>
</bean>
【在这个新的HibernateRantDao里,sessionFactory属性注入了一个sessionFactory引用,由于sessionFactory来自于Hibernate API,所以HibernateRantDao不再依赖于Spring框架,现在我们就要使用sessionFactory来处理当前会话,而不是使用HibernateTemplate来执行持久操作。】
3、使用SessionFactory来处理当前会话:
public void saveRant(Rant rant) {
   sessionFactory.getCurrantSession().saveOrUpdate(rant);
}
分享到:
评论

相关推荐

    spring连接数据库实例

    Spring框架是Java开发中广泛使用的轻量级框架,...通过这些知识点,我们可以高效地在Spring应用中实现与数据库的交互,提高开发效率。在实际项目中,还可以结合Spring Data JPA或MyBatis等ORM框架进一步提升开发体验。

    spring和数据库层的结合

    **JDBC (Java Database Connectivity)** 是Java中用于与数据库交互的标准API。Spring框架通过提供高级的JDBC支持,简化了数据库访问代码的编写。 1. **数据源配置**:Spring允许配置数据源,这样就封装了数据库连接...

    spring多数据库

    这在处理跨系统数据交互、数据隔离或者不同数据源的场景下非常有用。"spring多数据库"项目就是针对这种需求而设计的,旨在提供一个标准的Spring项目结构,方便开发人员进行多个数据库之间的切换查询。 首先,Spring...

    SpringMVC 与底层数据库的交互

    在与底层数据库交互时,SpringMVC通常结合Spring Data JPA或MyBatis等持久层框架一起工作,以实现高效的数据操作。下面我们将深入探讨SpringMVC与数据库交互的核心概念和技术。 1. **DispatcherServlet**:...

    spring security与数据库交互实现简单例子

    在这个简单的例子中,我们将探讨如何利用Spring Security与数据库进行交互来实现用户认证和授权。 首先,`applicationContext-security.xml`是Spring Security的配置文件,它定义了安全相关的bean和规则。这个文件...

    初学SpringCloud连接Oracle数据库

    为了在SpringCloud服务中使用这个数据库连接,你可能还需要配置Ribbon或Feign客户端,以在微服务间进行数据交互。Ribbon是客户端负载均衡器,Feign是一个声明式HTTP客户端。配置它们可以使你的服务通过服务名而不是...

    Spring数据库访问之异常处理

    在Spring框架中,数据库访问是核心功能之一,它提供了丰富的工具和API来简化与数据库的交互。本篇文章将深入探讨Spring中的数据库异常处理机制,帮助开发者更好地理解和处理在数据库操作中可能遇到的问题。 首先,...

    spring roo 生成数据库表

    总结来说,Spring Roo是一个强大的工具,能够帮助开发者快速构建符合最佳实践的Java应用,特别是在处理与数据库交互的场景下。通过使用Roo,你可以节省大量时间,专注于业务逻辑,而不是基础架构。如果你想要深入...

    Spring Security 把授权信息写入数据库

    在处理与数据库交互方面,Spring Security提供了更强大的支持,包括长期的remember-me功能和基于数据库的角色与用户管理API。 24.2. 目标 在原有应用中,用户信息和资源访问控制已经在数据库中管理。目标是将现有...

    Spring与非关系数据库搭配使用

    首先,Spring框架提供了强大的数据访问抽象层,使得开发者可以轻松地与各种数据库交互,包括关系型数据库如MySQL、Oracle,以及非关系型数据库如MongoDB、Cassandra等。Spring Data项目是这一抽象层的核心,它为多种...

    Spring Framework 开发参考手册,数据库系统的JDBC驱动程序

    在Spring中,JDBC(Java Database Connectivity)驱动程序是用于与各种数据库进行交互的重要组件。本参考手册将深入探讨Spring Framework如何整合和使用JDBC驱动,以及在实际开发中的最佳实践。 1. **JDBC概述** ...

    spring连数据库实例`

    在这个"spring连接数据库实例"中,我们将探讨Spring如何与数据库进行交互,以及它在实际项目中的应用。 1. **Spring JDBC模块** Spring 提供了JDBC抽象层,简化了数据库操作,避免了繁琐的JDBC代码和资源管理。...

    Spring Security数据库认证实例(dao认证)

    **Spring Security数据库认证实例(dao认证)** Spring Security是一个强大且高度可定制的身份验证和访问控制框架...这个实例对于理解Spring Security如何与数据库交互非常有帮助,也为构建更复杂的安全系统奠定了基础。

    基本的spring mvc + spring security实现的登录(无数据库)

    这个简单的示例为初学者提供了一个了解Spring MVC和Spring Security交互的基础平台,有助于理解这两个框架在实际项目中的作用和集成方式。通过深入研究和实践,可以进一步提升Web应用的安全性和可维护性。

    spring security 数据库存储资源信息 记住我 支持AJAX

    Spring Security可以通过集成JDBC或使用Spring Data JPA等方式与数据库交互,存储用户、角色和权限。这通常涉及到自定义UserDetailsService和AuthoritiesPopulator接口的实现,以从数据库中加载用户信息和权限。 接...

    spring boot做的显示数据库的数据

    标题 "spring boot做的显示数据库的数据" 暗示了我们正在讨论如何使用Spring Boot框架来展示从MySQL数据库...通过这个实践,开发者可以深入理解Spring Boot如何与数据库交互,以及如何构建简单的数据驱动的应用程序。

    Spring+Servlet读取数据库返回JSON数据(源码).zip

    2. 创建一个服务类(Service),使用Spring提供的模板方法与数据库交互。 3. 创建一个控制器(Controller),该控制器会调用服务类的方法,将返回的对象集合转换为JSON。 4. 使用Jackson库的`ObjectMapper`类将Java...

    struts+hibernate+spring 对数据库进行增删改查

    Hibernate通过持久化对象与数据库交互,执行增删改查操作;而Spring则作为整体的协调者,管理所有组件的生命周期,提供事务管理和数据源配置,使得整个应用的架构更加松耦合。 总的来说,SSH框架的组合使用,为...

    图片与数据库的交互

    开发者可能使用了常见的Web框架(如Django、Express或Spring Boot)来实现这些功能,并且数据库可能是MySQL、PostgreSQL或者NoSQL数据库如MongoDB。 综上所述,实现图片与数据库的交互是一个综合性的任务,涉及前端...

    spring-batch同步数据库mysql源码

    3. **JdbcPagingItemReader和JdbcBatchItemWriter**:这两个类分别用于分页读取数据和批量写入数据,是Spring-Batch与数据库交互的核心。 4. **SqlServerPagingQueryProvider和OraclePagingQueryProvider**:如果...

Global site tag (gtag.js) - Google Analytics