spring把数据访问过程中固定与变化的部分明确地划为两类:模板和回调
spring提供了各种数据访问模板,分别适用于不同的持久机制,jdbc,hibernate等,使用数据访问模板只需要把它配置为spring context里的bean
配置数据源
方法1: JNDI
Java Naming and Directory Interfaces,通过名称获取数据源
从jndi中获取数据源
<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/SpitterDS" //制定jndi里的数据源名称 resource-ref="true" />
resource-ref:为true时,jnidi-name会被添加java:comp/env/,从应用程序服务器的JNDI目录里获取数据源。
2. 数据源连接池
如果无法从jndi获得数据源,可以使用数据源连接池,spring没有提供数据源连接池。DBCP有提供。
我们只需要配置 BasicDataSource bean
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:hsql://localhost/spitter/spitter" /> <property name="username" value="sa" /> <property name="password" value="" /> <property name="initialSize" value="5" /> <property name="maxActive" value="10" /> </bean>
3. 基于JDBC驱动的数据源
两种数据源
DriverManagerDataSource—每个连接请求都建立一个连接,没有进行池管理
SingleConnectionDataSource—每次请求返回同一个连接,可以看作只有一个连接的池。不适合多线程
<bean id="dataSource" class="org.springframework.jdbc.datasource. DriverManagerDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:hsql://localhost/spitter/spitter" /> <property name="username" value="sa" /> <property name="password" value="" /> </bean>
使用传统的jdbc代码,直接连接,使用sql插入和查询,代码重复。
使用jdbc模板
三种模板
-
JdbcTemplate—The most basic of Spring’s JDBC templates, this class provides simple access to a database through JDBC and simple indexed-parameter queries.
-
NamedParameterJdbcTemplate—This JDBC template class enables you to per- form queries where values are bound to named parameters in SQL, rather than indexed parameters
-
SimpleJdbcTemplate—This version of the JDBC template takes advantage of
Java 5 features such as autoboxing, generics, and variable parameter lists to sim- plify how a JDBC template is used.
配置template
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> <constructor-arg ref="dataSource" /> </bean>
将template装配到dao
public class JdbcSpitterDAO implements SpitterDAO { ... private SimpleJdbcTemplate jdbcTemplate; public void setJdbcTemplate(SimpleJdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }
public void addSpitter(Spitter spitter) { jdbcTemplate.update(SQL_INSERT_SPITTER,//简化,且exception的处理也被隐藏了
spitter.getUsername(), spitter.getPassword(), spitter.getFullName(), spitter.getEmail(), spitter.isUpdateByEmail());
spitter.setId(queryForIdentity()); }
}
bean id="spitterDao" class="com.habuma.spitter.persistence.SimpleJdbcTemplateSpitterDao"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean>
JPA:
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
基于jpa的程序使用 EntityManagerFactory来获取EnitityManager 的实例,JPA规范定义了两种实体管理器
1 程序管理型:程序直接向实体管理器工厂请求一个实体管理器由程序负责打开,关闭,在事务中控制管理器不适合运行于在Java EE容器的独立程序。通过调用createEntityManagerFactory() method of the PersistenceProvider.
2 容器管理型: 由Java EE容器创建和管理,实体管理器是通过注入或利用JNDI直接获得,这种类型适合希望不考虑persistence.xml的特殊性。
这两个管理器实现同一个 EntityManager接口,区别只在于创建和管理方式。
配置程序管理型的JPA
配置信息来源于persistence.xml,xml定义一个多多个持久单元,对应一个数据源
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="spitterPU"> <class>com.habuma.spitter.domain.Spitter</class> <class>com.habuma.spitter.domain.Spittle</class> <properties> <property name="toplink.jdbc.driver" value="org.hsqldb.jdbcDriver" /> <property name="toplink.jdbc.url" value= "jdbc:hsqldb:hsql://localhost/spitter/spitter" /> <property name="toplink.jdbc.user" value="sa" /> <property name="toplink.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>
spring中定义bean LocalEntityManagerFactoryBean
<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="spitterPU" /> //持久单元的名称 </bean>
配置容器管理型 JPA
<bean id="emf" class= "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> //上面提到的datasource <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> </bean> <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="HSQL" /> // 数据库类型 <property name="showSql" value="true"/> <property name="generateDdl" value="false"/> <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect" /> </bean>
在spring上下文中配置jpaVendorAdapter属性用于设置特定JPA实现的细节,不同的数据库平台不同,包括:EclipseLinkJpaVendorAdapter HibernateJpaVendorAdapter OpenJpaVendorAdapter TopLinkJpaVendorAdapter