`
DynamicMan
  • 浏览: 25471 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

6.spring持久化相关

 
阅读更多

        Spring在持久化上做出了一个统一的模型,目的是为了简化持久化的开发,使得数据访问层和持久化方案的选择相互独立。

        统一了数据访问异常:

传统的JDBC异常分类比较薄弱,并且都为检查型异常,在程序员对数据库的操作过程中,需要强制的去捕获SQLException,第一是工作比较繁琐,第二个就算捕获了之后其实际意义也不大,并且SQLException包含的异常问题不能够准确的进行表达,有可能是连接异常,有可能是数据访问的其他问题,spring在此基础上统一了数据访问异常,提供更加丰富的异常管理,并且所有异常都会运行期异常,不需要用户做出捕获动作,需要进行捕获时,由程序员自行决定,无论是选择何种持久化方案,在spring的管理下,异常都可以得到统一,这样从异常的角度完成了数据访问层和持久化方案选择的独立。

        数据访问模板:

spring提供数据访问模板,利用模板方法模式以及回调来简化数据访问层的代码编写,使得程序员在数据访问代码编写时候,关注点只关注数据访问的核心逻辑,对于连接的打开,关闭等操作都进行了忽略,大大的加快了数据访问的开发效率,也就是说spring提供模板,减少了系统当中的样板代码的编写

常用的模板:

模板类 用途
jca.cci.core.CciTemplate JCA CCI连接
jdbc.core.JdbcTemplate JDBC连接
jdbc.core.namedparam.NamedParameterJdbcTemplate 支持命名参数的Jdbc连接
jdbc.core.simple.SimpleJdbcTemplate 通过Java 5简化后的JDBC连接
orm.hibernate.HibernateTemplate hibernate2.x session
orm.hibernate3.HibernateTemplate hibernate3.x session
orm.ibatis.SqlMapClientTemplate ibatis sqlMap客户端
orm.jdo.jdoTemplate Java数据对象实现
orm.jpa.jpaTemplate Java持久化API管理器

 

        提供DAO支持类:

DAO支持类与spring提供的模板如出一辙,如果要使用模板,则可以继承于spring DAO的支持类,之后很方便的获取到DAO支持类提供的模板,进行数据访问操作。上述模板介绍中每一个模板都对应一个DAO支持类,用于更为方便的在spring中获取到模板。

 

配置数据源:

在spring配置数据源有三种方式:

通过JDBC驱动定义的数据源
JNDI查找数据源
连接池的数据源

JDNI数据源:

增加命名空间:

xmlns:jee="http://www.springframework.org/schema/jee"

 

xsi:schemaLocation="http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"

 XML配置:

<jee:jndi-lookup jndi-name="jdbc/DS" resource-ref="true" />

 jndi-name用于指定JNDI查找路径,如果是在JAVA应用服务器中需要配置resource-ref为true,这样会自动添加上java:comp/env/前缀

 

数据库连接池:

数据库连接池的选择很多,通常会有prooxy,c3p9,dbcp等等,spring本身没有提高数据库连接池的实现,但是可以有效的与第三方数据库连接池进行集成

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  <property name="url" value="jdbc:mysql://localhost:3306/hello?useUnicode=true&amp;charact   erEncoding=utf8"></property>
  <property name="username" value="root"></property>
  <property name="password" value="root"></property>
  <property name="initialSize" value="5"></property>
  <property name="maxActive" value="10"></property>
</bean>

 

基于JDBC驱动的数据源:

spring提供了两个最简单的JDBC数据源:

DriverMangerDatasource:每个连接请求返回一个新建的连接,但是没有池化管理

SingleConnectionDatasource:每次返回都用同一个连接

应用一个连接的SingleConnectionDatasource不适用于多线程的应用程序,而每次请求都会创建的DriverManager会在程序运行中出现性能问题,所以强烈建议在生产环境中使用数据库连接池

<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  <property name="url" value="jdbc:mysql://localhost:3306/hello?useUnicode=true&amp;charact   erEncoding=utf8"></property>
  <property name="username" value="root"></property>
  <property name="password" value="root"></property>
</bean>

 

在Spring中使用JDBC:

spring提供三种JdbcTemplate用于对JDBC的访问,JdbcTemplate,SimpleJdbcTemplate,NamedParameterJdbcTemplate,其中SimpleteJdbcTemplate在3.1中已经被废弃,原因是JdbcDaoSupport 或NamedParameterJdbcDaoSupport已经提供了其所有功能,所以要使用SimpleJdbcTemplate继承于JdbcDaoSupport即可

JdbcTemplate:最基本的Jdbc模板,提供基本的数据库访问

SimpleJdbcTemplate:利用java 5的一些特性,如自动装箱,泛型,以及可变参数来简化JDBC模板使用

NamedParameterJdbcTemplate:查询时候,可以使用命名参数绑定到sql中,而不是只是简单的索引参数

 

JdbcTemplate配置:

 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"></property>
</bean>
 SimpleJdbcTemplate配置:

 

 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
  <constructor-arg ref="dataSource"></constructor-arg>
</bean>
 NamedParameterJdbcTemplate配置:

 

 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcT  emplate">
  <constructor-arg ref="dataSource" ></constructor-arg>
</bean>
 使用:

 

 

public void addBand(Band band){
  String sql = "insert into t_band(id, name), values(?,?)";
  getJdbcTemplate().update(sql, band.getId(), band.getName());
}
 
public Band findBandById(String id){
	String sql = "select id,name from t_band where id = ?";
	return getJdbcTemplate().queryForObject(sql, new ParameterizedRowMapper<Band>() {
		@Override
		public Band mapRow(ResultSet rs, int rowNum) throws SQLException {
			Band band = new Band();
			band.setId(rs.getString(1));
			band.setName(rs.getString(2));
			return band;
		}
	}, id);
}
 有命名参数绑定的sql,使用NamedParameterJdbcTemplate,该例中JdbcTemplate来自于NamedParameterJdbcDaoSupport:

 

 

public Band findBandById(String id){
	String sql = "select id,name from t_band where id = :id";
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("id", id);
	return getJdbcTemplate().queryForObject(sql, new ParameterizedRowMapper<Band>() {
		@Override
		public Band mapRow(ResultSet rs, int rowNum) throws SQLException {
			Band band = new Band();
			band.setId(rs.getString(1));
			band.setName(rs.getString(2));
			return band;
		}
	}, params);
}
 

 

Spring集成HIbernate:

LocationSessionFactory(hibernate4)的配置:

 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="mappingResources">
		<list>
			<value>band.hbm.xml</value>
		</list>
	</property>
	<property name="hibernateProperties">
		<props>
			<prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
		</props>
	</property>
</bean>

 基于注解扫描@Entity

 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="packagesToScan" value="org.robbie.test"></property>
	<property name="hibernateProperties">
		<props>
			<prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
		</props>
	</property>
</bean>

 

 在Spring中使用hibernate:

 

package org.robbie.test.spring.beans;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MyDao{
	
	@Autowired
	private SessionFactory sessionFactory;
	
	private Session getCurrentSession(){
		return sessionFactory.openSession();
	}
	
	public void insert(){
		Session session = getCurrentSession();
		Transaction transaction = session.getTransaction();
		transaction.begin();
		try {
			MyDomain domain = new MyDomain();
			domain.setId("4");
			domain.setName("robbie");
			session.save(domain);
		} catch (Exception e) {
			transaction.rollback();
			System.out.println(e);
		}
		transaction.commit();
	}

}

 通过注入的方式,把SessionFactory装配进来,调用API进行使用,类级别的注解@Repository有两个作用,第一个作用是作为Spring的组件使用,会被自动检测到容器当中,第二个是如果配置了spring全局异常处理,那么在标注了该注解的类中的方法都会捕获sql异常,并统一转换成与持久化方案无关的spring数据访问异常(运行期异常),使得DAO和持久化选择方式脱离,程序更容易管理,并减少代码量。

Spring统一持久层异常的配置:

 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

 如果是hibernate4还需要加入以下配置(在JTA事务中):

<bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/>

 

 

 

Spring集成JPA:

 JPA的实体管理工厂有两个:

LocalEntityManagerFactoryBean:是应用程序管理类型的工厂,一般会在一个独立的应用程序中使用

Local,由用户程序直接请求工厂,创建实体管理器,需要手动打开或关闭事务,单独进行配置

LocalContainerManagerFactoryBean:是容器管理类型的工厂,用户程序不会直接跟此工厂打交道,而是通过容器进行注入,创建实体管理器,事务受容器管理,在spring中进行配置

 

应用程序管理类型的工厂配置:

创建persistence.xml,这个文件必须位于类路径的META-INF目录下

 

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
	<persistence-unit name="unit1">
		<class>org.test.Bean1</class>
		<class>org.test.Bean2</class>
		<properties>
			<property name="toplink.jdbc.driver" value="org.hsqldb.jdbcDriver"></property>
			<property name="toplink.jdbc.url" value="jdbc:hsqldb:hsql://localhost/test"></property>
			<property name="toplink.jdbc.user">root</property>
			<property name="toplink.jdbc.password">root</property>
		</properties>
	</persistence-unit>
</persistence>
 增加spring的配置:

 

 

<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="unit1"></property>
</bean>
 目前为止JPA的配置没有完成,是因为没有配置实现,但是把相关的JPA实现配置信息全部放在persistent.xml上会显得非常的臃肿和不好管理,所以通常情况下在web项目都没有采用这种方式的配置。

 

 

在容器管理的实体管理器工厂:

 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="jpaVendorAdapter" ref="jpaVendorAdapter"></property>
</bean>

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
	<property name="database" value="MYSQL"></property>
	<property name="showSql" value="true"></property>
	<property name="generateDdl" value="true"></property>
	<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"></property>
</bean>
 JPA的厂商适配器:
EclipseLinkJpaVendorAdapter
HibernateJpaVendorAdapter
OpenJapVendorAdaptor
ToplinkJpaVendorAdaptor

 

从JNDI获取实体管理器工厂:

 

<jee:jndi-lookup id="emf" jndi-name="persistence/unit1" />
 

 

编写基于JPA的DAO:

@PersistenceContext
private EntityManager em;

 需要用到em的地方通过此种方法进行注入即可。

 

目前为止,与持久化框架的集成都是采用传统的XML配置,回顾基于JAVA的@Configuration配置,也可以完成,并且更加灵活,至于项目中该采用何种配置方法由用户自己决定。

 

分享到:
评论

相关推荐

    Spring持久化模板总结

    在Spring框架中,持久化是将应用程序数据存储到数据库的关键环节。Spring提供了多种持久化模板,如JdbcTemplate和HibernateTemplate,以简化数据库操作并减少代码中的样板代码。这两个模板都是Spring JDBC模块的一...

    spring3.0,ssh

    在SSH集成中,Hibernate负责数据持久化,将Java对象转换成数据库中的记录,反之亦然。Hibernate 3.x是与Spring 3.0常搭配使用的版本,它支持JPA(Java Persistence API),并且具有出色的性能和灵活性。 描述中的...

    T1 spring-IOCjQueryt1.Jbpm设计t2.流程持久化t3整合spring

    总结来说,这个主题涵盖了Spring的IOC、jQuery的前端增强、Jbpm的流程设计与持久化,以及两者之间的整合技术。学习并掌握这些知识点,对于构建高效、可扩展的企业级应用至关重要。在实践中,理解并运用这些技术,...

    从入门到高级实战-深度探索SpringSecurity安全框架视频.zip

    13.RememberMe 持久化令牌方案 14.RememberMe 二次校验 15.Spring Security+MyBatis 做登录 16.AuthenticationProvider 介绍 17.自定义 AuthenticationProvider 18.WebAuthenticationDetails 介绍 ....................

    Manning.Spring.in.Action.5th.Edition

    6. Spring Data:Spring Data框架提供了一种统一的访问数据库的方式,支持多种持久化技术,如JPA、JDBC和NoSQL数据库。它简化了DAO(Data Access Object)层的编写,提供了强大的查询构造器和Repository抽象。 7. ...

    spring整合持久化框架的jar包

    spring整合持久化框架的jar包,有需要的可以下载一下看看,谢谢

    Spring Security 3多用户登录实现之九 基于持久化存储的自动登录

    在“Spring Security 3多用户登录实现之九 基于持久化存储的自动登录”这一主题中,我们将探讨如何利用Spring Security来实现多用户登录系统,并通过持久化存储来支持用户的自动登录功能。在这个过程中,我们会涉及...

    rabbitmq + spring boot demo 消息确认、持久化、备用交换机、死信交换机等代码

    本教程将详细介绍如何在Spring Boot应用中结合RabbitMQ实现消息确认、消息持久化、备用交换机以及死信交换机等功能。 首先,让我们理解这些概念: 1. **消息确认**:在RabbitMQ中,消息确认(Message ...

    16.spring与springmvc常见面试题.docx

    tracing, profiling and monitoring 记录跟踪优化、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务。原理:AOP 是面向切面编程,是...

    Java进阶教程数据层全栈方案SpringData高级应用视频教程

    4.SpringData Redis的序列化器 5.SpringData Redis运行原理分析 6.SpringData Redis常见操作 第七章 Repository和Template的选用 第八章 SpringData ElasticSearch 1.SpringData ElasticSearch简介 2.ElasticSearch...

    Spring定时调度——将调度信息持久化到数据库中

    本篇文章将探讨如何在Spring中实现定时调度,并将调度信息持久化到数据库中,这在实际业务场景中非常重要,因为能够确保任务的稳定性和可管理性。 首先,我们需要理解Spring的定时任务调度机制。Spring提供了`@...

    spring的quartz定时任务相关(持久化任务)

    ### Spring中的Quartz定时任务与持久化管理 #### 一、Spring与Quartz简介 Spring框架作为Java领域中广泛使用的轻量级应用框架之一,它提供了丰富的功能支持,包括依赖注入、面向切面编程以及MVC框架等。而Quartz是...

    官方原版源码 spring-5.2.8.RELEASE.zip

    这些接口和抽象层使开发者能够与各种数据库和持久化技术进行交互,同时保持松耦合。 3. **Web**:包含Web-MVC、Web-Servlet、Web-Struts等,用于构建Web应用程序。Spring MVC是Spring提供的一个强大且灵活的Web MVC...

    spring4.1核心包

    6. spring-core-4.1.1.RELEASE.jar spring核心包 7. spring-expression-4.1.1.RELEASE.jar spring表达语言 SpEL以"#{...}"进行标识。 8. spring-instrument-4.1.1.RELEASE.jar Spring对服务器的代理接口 9.spring-...

    JavaEE高级工程师I培训——框架核心技术Struts.Hibernate.Spring

    Hibernate负责数据库操作,实现数据持久化;Spring作为整体的容器,管理和协调其他两个框架,提供事务管理等企业级服务。这样的组合可以构建出松耦合、易于维护的系统,大大提高了开发效率。 在"JavaEE高级工程师I...

    03.spring概述_spring_

    3. **Spring Data**:简化了数据访问,支持多种持久化技术,如JPA、MongoDB、Cassandra等。 总之,Spring 框架以其强大的功能、灵活的设计和广泛的社区支持,成为了Java开发者首选的开发工具,为构建高效、可扩展的...

    Struts.2.Hibernate.Spring整合开发技术详解.rar

    Hibernate作为数据持久化工具,其SessionFactory通常由Spring管理,以便在需要时为Service层提供Session实例。 SSH整合开发的优势在于,它可以提供一个完整的解决方案,涵盖了从用户界面到数据库的整个应用架构。...

    springblade.zip

    SpringBlade是一个基于Spring Boot开发的现代化企业级应用框架,其2.7商业版提供了全套的jar包,旨在简化企业级开发工作,提高开发效率。本文将深入探讨SpringBlade框架的核心特性、主要组件以及如何在项目中进行...

    WebWork.Spring.Hibernate整合开发网络书城全系列视屏4

    5. **数据持久化**:通过实例展示如何通过Hibernate将Java对象持久化到数据库中,包括对象的保存、查找、修改和删除。 6. **错误和异常处理**:讨论WebWork如何与Spring协同工作,进行统一的错误和异常处理,提供...

    spring集成activemq演示queue和topic 持久化

    在本示例中,我们将深入探讨如何将Spring框架与ActiveMQ集成,以便实现消息队列(Queue)和主题(Topic)的功能,并确保消息的持久化。ActiveMQ是Apache软件基金会开发的一个开源消息中间件,它支持多种消息协议,如...

Global site tag (gtag.js) - Google Analytics