Hibernate、SpringJDBC中在注解模式下获取数据库连接

一、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名称相同;
如果需要连接多个数据库,那么需要在.xml中配置相应的数据源( sessionFactory1sessionFactory2........)然后分别继承分别引入数据源,然后在根据项目需要调用不同数据库即可:
 
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中配置:
<bean id=" 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;
}
}

同样如果想在项目中引入多个数据库,那也要配置多个数据源(dataSource1、dataSource2.....)多个 sessionFactory(sessionFactory1、sessionFactory2)然后bean相应的 HibernateTemplate ( h ibernateTemplate1h 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.hibernateTemplate1hibernateTemplate1;
}

public HibernateTemplate getHibernateTemplate2() {
return hibernateTemplate2;
}

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

}


二、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);  
}
}
如果我们用setJdbcTemplate引入数据源的话,需要在.xml中配置:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>

2、 直接注解实例化JdbcTemplate:
如果我们不继承JdbcDaoSupport类,我们只需在项目中实例化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 jdbcTemplate
2 ;
}

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值