Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > Spring的持久层封装
【标  题】:Spring的持久层封装
【关键字】:Spring
【来  源】:http://blog.csdn.net/sslaowan/archive/2007/02/21/1512380.aspx

Spring的持久层封装

Your Ad Here

 

Spring的持久层封装
(零雨其蒙原创,转载请注明)
一、概述
(一)基本概念
1、数据访问的关键技术
     我们可以将数据访问分为两个部分:一是获得数据源;二是进行数据库操作(增删改查)。
2、获得数据源的几种方法
因为只是为了记录一些关键的东西,以实用为主,因此没有过多的考虑措辞和学术上的严谨。这里指的是在Java中怎么能取得和数据源(DataSource)的联系,方法主要有传统的在程序中硬编码和通过XML注入。Spring提供三种XML注入:(1)使用Spring自带的DriverManagerDataSource;(2)使用DBCP连接池(3)使用Tomcat提供的JNDI。其中(1)可以配合Hibernate、iBatis等ORM一起使用(在XML配置文档中加入相应的配置段)。
(二)框架图

XML注入数据源的三种方式
Spring自带的DriverManagerDataSource
DBCP连接池
Tomcat的JNDI
 
数据库操作的两种方式
SpringJdbcTemplate
使用ORM工具
 

(三)何时使用什么
          现在大多数轻量级开发,都采用Hibernate作为持久层解决方案,因此可以作为首选。
二、详细
(一)数据源注入
1、使用Spring自带的DriverManagerDataSource  
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <!定dataSourceà
   <bean id=dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
      <!—使用SQL Serverà
       <property name=”driverClassName”>
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
       </property>
        <property name=”url”>
          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
       </property>
<property name=”name”>
          <value>admin</value>
       </property>
<property name=”msg”>
          <value>admin</value>
       </property>
    </bean>
 
    <!—设定transactionManagerà
    <bean id=transactionManager
class=org.springframework.jdbc.datasource.DataSourceTransactionManager>
        <property name=dataSource>
            <ref bean=dataSource/>
        </property>
    </bean>
 
   <!—示例中DAO-->
   <bean id=”bookDAO” class=”com.bookDAO”>
        <property name=”dataSource”>
            <ref bean=”dataSource”/>
        </property>
        <property name=”transactionManager”>
            <ref bean=”transactionManager”>
        </property>
   </bean>
</beans>
   红色部分显示了所使用的类,就是用它来处理数据库连接。
2、使用DBCP连接池
    要在Spring中使用DBCP连接池,需要引入spring-framework-2.0-ml\lob\jakarta-commons文件夹中的commons-collections.jar、commons-dbcp.jar和commons-pool.jar。
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <!定dataSourceà
   <bean id=dataSource” class=”org.apache.commons.dbcp.BasicDataSource”>
      <!—使用SQL Serverà
       <property name=”driverClassName”>
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
       </property>
        <property name=”url”>
          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
       </property>
<property name=”name”>
          <value>admin</value>
       </property>
<property name=”msg”>
          <value>admin</value>
       </property>
    </bean>
 
    <!—设定transactionManagerà
    <bean id=transactionManager
class=org.springframework.jdbc.datasource.DataSourceTransactionManager>
        <property name=dataSource>
            <ref bean=dataSource/>
        </property>
    </bean>
 
   <!—示例中DAO-->
   <bean id=”bookDAO” class=”com.bookDAO”>
        <property name=”dataSource”>
            <ref bean=”dataSource”/>
        </property>
        <property name=”transactionManager”>
            <ref bean=”transactionManager”>
        </property>
   </bean>
</beans>
   红色部分为不同之处,可以看出,Spring为各种不同的数据源提供了统一的方式,下面看使用Tomcat提供的JNDI,有了一些不同。
3、使用Tomcat提供的JNDI
分两步,第一步是配置Tomcat的server.xml;第二步是编写Spring的配置文件。
Tomcat的server.xml
<Context path=”/demo” reloadable=”true” docBase=”c: \eclipse\workspace\demo” workDir=” c: \eclipse\workspace\demo\work”>
<Resource name=”jdbc/opendb” auth=”Container” type=”javax.sql.DataSource” factory=”org.apache.tomcat.dbcp.BasicDataSourceFactory” driverClassName=”com.microsoft.jdbc.sqlserver.SQLServerDriver” url=”jdbc:Microsoft:sqlserver://localhost:1433/stdb”
<!—设定用户名-->
name=”admin”
<!—设定密码à
msg=”admin”
<!--设定最大连接数à
maxActive=”10000”
<!--设定最大空闲时间à
maxldle=”10000”
<!--设定最大等待时间à
maxWait=”10000”
removeAbandoned=”true”
removeAbandonedTimeout=”10”
logAbandoned=”true”
/>
</Context>
Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <!定dataSourceà
   <bean id=dataSource” class=”org.springframework.jndi.JndiObjectFactoryBean>
     <property name=”jndiName”>
         <value>jdbc/opendb</value>
     /*以下信息在server.xml中已经配置过了,不需要再配置了
 <!—使用SQL Serverà
       <property name=”driverClassName”>
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
       </property>
        <property name=”url”>
          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
       </property>
<property name=”name”>
          <value>admin</value>
       </property>
<property name=”msg”>
          <value>admin</value>
       </property>*/
    </bean>
 
    <!—设定transactionManagerà
    <bean id=transactionManager
class=org.springframework.jdbc.datasource.DataSourceTransactionManager>
        <property name=dataSource>
            <ref bean=dataSource/>
        </property>
    </bean>
 
   <!—示例中DAO-->
   <bean id=”bookDAO” class=”com.bookDAO”>
        <property name=”dataSource”>
            <ref bean=”dataSource”/>
        </property>
        <property name=”transactionManager”>
            <ref bean=”transactionManager”>
        </property>
   </bean>
</beans>
   红色部分为不同之处,可以看出,使用Tomcat提供的JNDI,有了一些不同。第一方式只是Spring包装了一下Jdbc,跟直接使用Jdbc没什么大的区别;后两种采用了连接池技术,比较好。我们也可以看出,三种方式配置基本相同,而作为使用数据源的类,调用方式相同,都是使用基本的依赖注入的方式。
4、使用Hibernate
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <!定dataSourceà
   <bean id=dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
      <!—使用SQL Serverà
       <property name=”driverClassName”>
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
       </property>
        <property name=”url”>
          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
       </property>
<property name=”name”>
          <value>admin</value>
       </property>
<property name=”msg”>
          <value>admin</value>
       </property>
    </bean>
 //在第一种方法的基础上加上Hibernate的配置段就OK了。
 <!—使用HibernatesessionFactoryà
  <bean id=”sessionFactory” class=”org.springframework.orm.hibernate.LocalSessionFactoryBean”>
       <property name=”dataSource”>
            <ref local=”dataSources”>
       </property>
       <property name=”mappingResources”>
            <list>
                <value>com/demo/bo/Book.hbm.xml</value>
             </list>
       </property>
       <property name=”hibernateProperties”>
            <props>
                 <prop key=”hibernate.dialect”>
                        net.sf.hibernate.dialect.SQLServerDialect
                 </prop>
<prop key=”hibernate.show_sql”>
      true
<prop>
            </props>
        </property>
    </bean>
 
    <!—设定transactionManagerà
    <bean id=transactionManager
class=org.springframework.jdbc.datasource.DataSourceTransactionManager>
        <property name=sessionFactory>
            <ref bean=sessionFactory/>
        </property>
    </bean>
 
   <!—示例中DAO-->
   <bean id=”bookDAO” class=”com.demo.bo.BookDAO”>
        <property name=sessionFactory”>
            <ref bean= sessionFactory”/>
        </property>
        <property name=”transactionManager”>
            <ref bean=”transactionManager”>
        </property>
   </bean>
</beans>
   红色部分显示了不同之处,有三点:1)、加入了<bean id=”sessionFactory”>段,引入Hibernate的sessionFactory;2)事务处理的属性由原来的dataSource变成了sessionFactory;3)DAO引用从原来的dataSource变成了sessionFactory。其实就是说,在原来的datasouce之上加了Hibernate这一层,来处理相应的数据访问问题。因此在Spring中引入ORM是很容易的。
  Book.hbm.xmlBook.java是通过工具互相生成的,在这里不展示代码了,而Book就是一个POJO
4、使用iBatis
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <!定dataSourceà
   <bean id=dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
      <!—使用SQL Serverà
       <property name=”driverClassName”>
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
       </property>
        <property name=”url”>
          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
       </property>
<property name=”name”>
          <value>admin</value>
       </property>
<property name=”msg”>
          <value>admin</value>
       </property>
    </bean>
 //在第一种方法的基础上加上iBatis的配置段就OK了。
 <!—使用iBatis à
  <bean id=”sqlMap” class=”org.springframework.orm.ibatis.SqlMapClientFactoryBean”>
       <property name=”configLocation”>
            <value>WEB/sqlMapConfig.xml</value>
       </property>
    </bean>
    <!—设定transactionManagerà
    <bean id=transactionManager
class=org.springframework.jdbc.datasource.DataSourceTransactionManager>
        <property name=dataSource>
            <ref bean=dataSource/>
        </property>
    </bean>
 
   <!—示例中DAO-->
  <bean id=”bookDAO” class=”com.demo.bo.BookDAO”>
        <property name=dataSource”>
            <ref bean= dataSource”/>
        </property>
        <property name=”transactionManager”>
            <ref bean=”transactionManager”>
        </property>
        <property name=”sqlMap”>
             <ref bean=”sqlMap”/>
        </property>
   </bean>
</beans>
   红色部分显示了不同之处,主要来看一下其与Hibernate的不同之处,1)同样引入iBatis配置段,不过其mappingResources配置信息放在了sqlMapConfig.xml下,该文件放在WEB-INF下,示例代码如下:
<sqlMapConfig>
     <sqlMap resource=”com/demo/bo/Book.xml”>
</sqlMapConfig>
而这其中的Book.xml文件类似于Hibernate中的Book.hbm.xml。
 2)事务处理配置段依然引用的是dataSource,而不是sqlMap。
 3)在DAO配置段,引用dataSource的同时,又加入了sqlMap引用。
 其PO对象——Book.java与Hibernate中相同。
 (二)数据库操作
1、使用JDBCTemplate
 
import javax.sql.DataSource;
import org.springframework.jdbc.core.*;
import org.springframework.transaction.*;
import org.springframework.dao.*;
 
public class bookDAO{
private DataSource dataSource依赖注入dataSource,管理数据库;//
private PlatformTransationManager transactionManager;//依赖注入管理事务
 
public void setDataSource(DataSource dataSource){
    this.dataSource=dataSource;
}
 
     public void setTransactionManager(PlatformTransationManager transactionManager){
         this. transactionManager= transactionManager;
}
 
public int create(String msg){
    JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
    jdbcTemplate.update(“INSERT INFO book VALUES(1,’gf’,’Mastering Spring’)”);
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <!定dataSourceà
   <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>
      <!—使用SQL Serverà
       <property name=”driverClassName”>
          <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
       </property>
        <property name=”url”>
          <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>
       </property>
<property name=”name”>
          <value>admin</value>
       </property>
<property name=”msg”>
          <value>admin</value>
       </property>
    </bean>
 
    <!—设定transactionManagerà
    <bean id=transactionManager
class=org.springframework.jdbc.datasource.DataSourceTransactionManager>
        <property name=dataSource>
            <ref bean=dataSource/>
        </property>
    </bean>
 
   <!—示例中DAO-->
  <bean id=”bookDAO” class=”com.bookDAO”>