一、Hibernate下数据库连接:


1、继承HibernateDaoSupport超类:


HibernateDaoSupport类并不是一个 Hiberbate操作的模板类,它的出现是为了提供对 DAO 的支持。用



户 DAO 类只要继承这个类就可以方便地得到 HibernateTemplate类的实例;所以我们继承了此类之后只要引入数据源即可,首先配置数据库连接源:




<!--用apache的dbcp建立数据库连接池-->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     <!-- 用户名-->  
           <property name="user" value="${username}"/>  
           <!-- 用户密码-->  
           <property name="password" value="${password}"/>  
           <property name="driverClass" value="${driver}"/>  
           <property name="jdbcUrl" value="${url}"/>  
   
            <!--连接池中保留的最大连接数。默认值: 15 -->   
           <property name="maxPoolSize" value="20"/>  
           <!-- 连接池中保留的最小连接数,默认为:3-->  
           <property name="minPoolSize" value="10"/>  
           <!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3-->  
           <property name="initialPoolSize" value="15"/>  
   
           <!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 -->   
           <property name="checkoutTimeout" value="3000"/>  
             
           <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->   
           <property name="acquireIncrement" value="2"/>  
   
          <!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次-->   
           <property name="acquireRetryAttempts" value="0"/>  
   
           <!--重新尝试的时间间隔,默认为:1000毫秒-->   
           <property name="acquireRetryDelay" value="1000" />  
   
           <!--关闭连接时,是否提交未提交的事务,默认为false,即关闭连接,回滚未提交的事务 -->   
           <property name="autoCommitOnClose">
<value>false</value>
 </property>  
   
           <!--如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: false-->   
           <property name="breakAfterAcquireFailure">
           <value>false</value>
           </property>  
   
           <!--每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->   
           <property name="idleConnectionTestPeriod"><value>60</value></property>  
           <!--c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0-->   
           <property name="maxStatements"><value>100</value></property>  
      </bean>




<!--定义Hibernate的SessionFactory-->
      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          <!--依赖注入数据源-->
          <property name="dataSource">
              <ref bean="dataSource" />
          </property>
          <property name="hibernateProperties">
              <props>
                  <prop key="hibernate.dialect">
                      org.hibernate.dialect.OracleDialect
                  </prop>
                  <prop key="hibernate.show_sql">false</prop>
                  <prop key="hibernate.use_outer_join">true</prop>
              </props>
          </property>
          <property name="mappingDirectoryLocations">
<list>
<value>classpath:/com/success/jjyl/demo/</value>
<value>classpath:/com/success/po</value>
</list>
</property>
      </bean>


然后:


方法一:



我们查看HibernateDaoSupport源码便可发现,其中的setSessionFactory(SessionFactory sessionFactory)是final的,所以我们没法直接继承,写法改写如下:



public class BaseDAOImpl extends HibernateDaoSupport implements IBaseDAO { 
 
@Resource 
 
public void setSessionFactory0(SessionFactory sessionFactory){   
 
super.setSessionFactory(sessionFactory);   
 
} 
 

   } 
 
 
 
setSessionFactory0(SessionFactory sessionFactory)中的变量名与配置中的 
  sessionFactory名称相同; 
 
 
 
sessionFactory1、 
  sessionFactory2........)然后分别继承分别引入数据源,然后在根据项目需要调用不同数据库即可: 
 
 
  
  public class BaseDAOImpl extends HibernateDaoSupport implements IBaseDAO { 
  
 
  @Resource 
  
 
  public void setSessionFactory1(SessionFactory sessionFactory1){   
  
 
  super.setSessionFactory(sessionFactory1);   
  
 
  } 
  

    } 
  
 
  
 
   
 
  
public class BaseDAOImpl extends HibernateDaoSupport implements IBaseDAO { 
   
 
   @Resource 
   
 
   public void setSessionFactory2(SessionFactory sessionFactory2){   
   
 
   super.setSessionFactory(sessionFactory2);   
   
 
   } 
   
     }

当然源码中也有setHibernateTemplate(HibernateTemplate hibernateTemplate)方法可以实现数据库连接,但同样的也是final修饰,所以我们可以用同样的方法:



public class BaseDAOImpl1 extends JdbcDaoSupport implements IBaseDAO{ 
    
 
   
 
    @Resource 
    
 
    public void setHibernateTemplate0(HibernateTemplate hibernateTemplate){   
    
 
    super. 
    setHibernateTemplate0( 
    hibernateTemplate);   
    
 
    } 
     
   

     }

如果我们用

setHibernateTemplate引入数据源的话,需要在.xml中配置:


hibernateTemplate" class="org.springframework.orm.hibernate2. 
   HibernateTemplate"> 
   
<property name=" 
   sessionFactory"><ref bean=" 
   sessionFactory"/></property> 
   
 </bean>





2、直接注解实例化HibernateTemplate类:


HibernateDaoSupport类,我们只需在项目中实例化HibernateTemplate对象也可以:



首先在.xml中bean  JdbcTemplate:

<bean id=" 
  hibernateTemplate 
  " class="org.springframework.orm.hibernate2. 
  HibernateTemplate 
  "> 
  
 
  <property name=" 
  sessionFactory 
  "><ref bean=" 
  sessionFactory 
  "/></property> 
  
</bean>


然后:



public class BaseDAOImpl implements IBaseDAO { 
  
 
  
public static Logger logger = Logger.getLogger(Reflection.getCallerClass(1)); 
  
@Autowired 
  
public 
  HibernateTemplate  
  hibernateTemplate; 
  
 
  
public 
  HibernateTemplate get 
  HibernateTemplate() { 
  
return 
  hibernateTemplate; 
  
} 
  

public void set 
  HibernateTemplate( 
  HibernateTemplate h 
  ibernateTemplate) { 
  
this. 
  h 
  ibernateTemplate= 
  h 
  ibernateTemplate; 
  
} 
   
 

   }




sessionFactory(sessionFactory1、sessionFactory2)然后bean相应的 
  HibernateTemplate ( 
  h 
  ibernateTemplate1、 
  h 
  ibernateTemplate2)



然后在项目中依赖注入即可:



public class BaseDAOImpl implements IBaseDAO { 
   
 
   
public static Logger logger = Logger.getLogger(Reflection.getCallerClass(1)); 
   
@Resource(name=" 
   hibernateTemplate1") 
   
 
   public  
   HibernateTemplate  
    
   hibernateTemplate1 
   ; 
  
 
   
 
  
@Resource(name=" 
   hibernateTemplate2 
   ") 
   
public HibernateTemplate hibernateTemplate2; 
  
 
   
public HibernateTemplate getHibernateTemplate1() {
return hibernateTemplate1;
}

public void setHibernateTemplate(HibernateTemplate hibernateTemplate1) {
this.hibernateTemplate1= hibernateTemplate1;
} 
  

 
  
public HibernateTemplate getHibernateTemplate2() {
return hibernateTemplate2;
}

public void setHibernateTemplate(HibernateTemplate hibernateTemplate2) {
this.hibernateTemplate2= hibernateTemplate2;
} 
  

    }



二、SpringJDBC下数据库连接:


1、继承JdbcDaoSupport超类:



JdbcDaoSupport 类并不是一个 JDBC 操作的模板类,它的出现是为了提供对 DAO 的支持。用



户 DAO 类只要继承这个类就可以方便地得到 JdbcTemplate 类的实例;所以我们继承了此类之后只要引入数据源即可,首先配置数据库连接源:





<!--用apache的dbcp建立数据库连接池--> 
  
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
  
     
   <!-- 用户名-->   
  
           <property name="user" value="${username}"/>   
  
           <!-- 用户密码-->   
  
           <property name="password" value="${password}"/>   
  
           <property name="driverClass" value="${driver}"/>   
  
           <property name="jdbcUrl" value="${url}"/>   
  
    
  
            <!--连接池中保留的最大连接数。默认值: 15 -->    
  
           <property name="maxPoolSize" value="20"/>   
  
           <!-- 连接池中保留的最小连接数,默认为:3-->   
  
           <property name="minPoolSize" value="10"/>   
  
           <!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3-->   
  
           <property name="initialPoolSize" value="15"/>   
  
    
  
           <!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 -->    
  
           <property name="checkoutTimeout" value="3000"/>   
  
              
  
           <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->    
  
           <property name="acquireIncrement" value="2"/>   
  
    
  
          <!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次-->    
  
           <property name="acquireRetryAttempts" value="0"/>   
  
    
  
           <!--重新尝试的时间间隔,默认为:1000毫秒-->    
  
           <property name="acquireRetryDelay" value="1000" />   
  
    
  
           <!--关闭连接时,是否提交未提交的事务,默认为false,即关闭连接,回滚未提交的事务 -->    
  
           <property name="autoCommitOnClose"> 
  
<value>false</value> 
  
 </property>   
  
    
  
           <!--如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: false-->    
  
           <property name="breakAfterAcquireFailure"> 
  
           
  <value>false</value> 
  
           </property>   
  
    
  
           <!--每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->    
  
           <property name="idleConnectionTestPeriod"><value>60</value></property>   
  
           <!--c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0-->    
  
           <property name="maxStatements"><value>100</value></property>   
  
      </bean>

方法一:



我们查看JdbcDaoSupport源码便可发现,其中的setDataSource(DataSource dataSource)是final的,所以我们没法直接继承,写法改写如下:





public class BaseDAOImpl extends JdbcDaoSupport implements IBaseDAO{ 
  
 
 
 
  @Resource 
  
 
  public void setDataSource0(DataSource dataSource){   
  
 
  super.setDataSource(dataSource);   
  
 
  } 
   
 

   }


其中setDataSource0(DataSource dataSource)中的变量名与配置中的数据源名称相同;



如果需要连接多个数据库,那么需要在.xml中配置相应的数据源(dataSource1、dataSource2........)然后分别继承分别引入数据源,然后在根据项目需要调用不同数据库即可:



public class BaseDAOImpl1 extends JdbcDaoSupport implements IBaseDAO{ 
   
 
  
 
   @Resource 
   
 
   public void setDataSource1(DataSource dataSource1){   
   
 
   super.setDataSource(dataSource1);   
   
 
   } 
    
  

    } 
  
 
  

     public class BaseDAOImpl2 extends JdbcDaoSupport implements IBaseDAO{ 
    
 
   
 
    @Resource 
    
 
    public void setDataSource2(DataSource dataSource2){   
    
 
    super.setDataSource(dataSource2);   
    
 
    } 
     
   

     }



当然源码中也有setJdbcTemplate(JdbcTemplate jdbcTemplate)方法可以实现数据库连接,但同样的也是final修饰,所以我们可以用同样的方法:



public class BaseDAOImpl1 extends JdbcDaoSupport implements IBaseDAO{ 
    
 
   
 
    @Resource 
    
 
    public void setJdbcTemplate0(JdbcTemplate jdbcTemplate){   
    
 
    super.setDataSource(jdbcTemplate);   
    
 
    } 
     
   

     } 
   
 
  

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


2、 直接注解实例化JdbcTemplate:


首先在.xml中bean  JdbcTemplate:


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



然后:


public class BaseDAOImpl implements IBaseDAO { 
 
 
 
public static Logger logger = Logger.getLogger(Reflection.getCallerClass(1)); 
 
@Autowired 
 
public JdbcTemplate jdbcTemplate; 
 
 
 
public JdbcTemplate getJdbcTemplate() { 
 
return jdbcTemplate; 
 
} 
 


public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
 
this.jdbcTemplate = jdbcTemplate; 
 
} 
  

  }


同样如果想在项目中引入多个数据库,那也要配置多个数据源(dataSource1、dataSource2.....)然后bean相应的JdbcTemplate(jdbcTemplate1、jdbcTemplate2)


然后在项目中依赖注入即可:


public class BaseDAOImpl implements IBaseDAO { 
  
 
  
public static Logger logger = Logger.getLogger(Reflection.getCallerClass(1)); 
  
@Resource(name="jdbcTemplate1") 
  
public JdbcTemplate jdbcTemplate1; 
   
 
@Resource(name="jdbcTemplate2") 
  
public JdbcTemplate jdbcTemplate2; 
  
 
 
  
public JdbcTemplate getJdbcTemplate1() { 
  
return jdbcTemplate1; 
  
} 
  

public void setJdbcTemplate1(JdbcTemplate jdbcTemplate1) { 
  
this.jdbcTemplate1 = jdbcTemplate1; 
  
} 
   
 
 
  
 
 
public JdbcTemplate getJdbcTemplate2 
  () {
return jdbcTemplate2 
  ;
}

public void setJdbcTemplate2 
  (JdbcTemplate jdbcTemplate2 
  ) {
this.jdbcTemplate2 
   = jdbcTemplate2 
  ;
} 
 

   }