Dao 的支持类可以有好多,如: JdbcDaoSupport , HibernateDaoSupport ,JdoDaoSupport等,下面对最常用的HibernateDaoSupport与JdbcDaoSupport做一小总结:
一、在Spring框架中实现连接数据库方式:
1、、借助类HibernateDaoSupport的简约化实现:
借助这个类必须需要HIbernate框架,用到HIbernate里提供的HibernateTemplate模板,从而进行增、删、改、查操作。
TestA.java:
public class TestA extends HibernateDaoSupport{
public void test(){
     HibernateTemplate template = this.getHibernateTemplate();
     List list = template.find("from User");
     for(int i=0;i<list.size();i++){
      User u = (User)list.get(i);
      System.out.println(u.getUserid()+" "+u.getEmail());
     }
}

public static void main(String[] args) {
           ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
           TestA t = (TestA)ctx.getBean("testa");
           t.test();
}
}
需要在Spring的配置文件applicationContext.xml中控制反转用到连接数据库中的类是注入SessionsFactory,如下:
applicationContext.xml:
        <bean id="testa" class="com.sun.demo.TestA">
        <property name="sessionFactory">
        <ref bean="mySessionFactory"/>
        </property>
        </bean>
2、、借助类JdbcDaoSupport的简约化实现:
借助这个类不需要HIbernate框架,也不需要有ORM的对象关联映射。但它和HibernateDaoSupport很类似,有JdbcTemplate来实现增、删、改、查操作。
TestA.java:
public class TestA extends JdbcDaoSupport{
    public void test(){
        int n = this.getJdbcTemplate().queryForInt("select max(userid) from User");
        System.out.println(n);
    }
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
TestA ta = (TestA)ctx.getBean("testa");
        ta.test(); 
}

需要在Spring的配置文件applicationContext.xml中控制反转用到连接数据库中的类是注入DataSource,如下:
applicationContext.xml:
        <bean id="testa" class="com.sun.demo.TestA">
        <property name="dataSource">
        <ref bean="myDataSource"/>
        </property>
        </bean>

JdbcDaoSupport是JDBC数据访问对象的超类。它与特定的数据源相关联。Spring Inversion of Control (IOC)容器或BeanFactory负责获得相应数据源的配置详细信息,并将其与JdbcDaoSupport相关联。这个类最重要的功能就是使子类可以使用JdbcTemplate对象。  图2:Spring JDBC框架的主要组件

#p#

JdbcTemplate是Spring JDBC框架中最重要的类。引用文献中的话:“它简化了JDBC的使用,有助于避免常见的错误。它执行核心JDBC工作流,保留应用代码以提供SQL和提取结果。”这个类通过执行下面的样板任务来帮助分离JDBC DAO代码的静态部分:

◆从数据源检索连接。
◆准备合适的声明对象。
◆执行SQL CRUD操作。
◆遍历结果集,然后将结果填入标准的collection对象。
◆处理SQLException异常并将其转换成更加特定于错误的异常层次结构。

应用实例:

1.applicationContext.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="myDataSource"
   class="org.apache.commons.dbcp.BasicDataSource"
   destroy-method="close">
   <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
   <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:lrmora9" />
   <property name="username" value="dmis2006_sj" />
   <property name="password" value="omssj" />
   <property name="maxActive" value="5" />
   <property name="maxIdle" value="3" />
   <property name="minIdle" value="2" />
   <property name="maxWait" value="2" />
   <property name="initialSize" value="1" />
   <property name="removeAbandoned" value="true" />
   <property name="removeAbandonedTimeout" value="180" />
   <property name="logAbandoned" value="true" />
</bean>

<bean id="jdbcDao" class="com.lrm.study.jdbc.SpringJdbcDaoSupportApp">
   <property name="dataSource">
    <ref bean="myDataSource" />
   </property>
</bean>
</beans>

2.测试类:

package com.lrm.study.springJDBCDao;

import java.util.List;
import java.util.Map;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class SpringJdbcDaoSupportApp extends JdbcDaoSupport{
/**
on May 10, 2010 by lrm
*/
public static void main(String[] args) {
   //applicationContext.xml这个文件放到src下,如果报找不到这样的文件,直接拷贝到web-root下的classes下
   ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
   SpringJdbcDaoSupportApp jdbcDao = (SpringJdbcDaoSupportApp) ctx.getBean("jdbcDao");
   String sql = "select t.ftypename from dmis_eqptype t where t.fcategory = '保护'";
   List reList = jdbcDao.queryListBySql(sql);
   if(reList.size()>0){
    for (int i = 0; i < reList.size(); i++) {
     String typename = ((Map)reList.get(i))==null?"":((Map)reList.get(i)).get("ftypename").toString();
     System.out.println(typename);
    }
   }
}

public List queryListBySql(String sql){
   return this.getJdbcTemplate().queryForList(sql);
}

}

注意:这里需求相关的jar包支持,否则会报错.commons-dbcp-1.2.1.jar ;commons-pool-1.2.jar ;commons-collections-3.1.jar; spring-1.2.6.jar; spring-aop.jar;ojdbc14.jar

二、编程式事务管理、声明式事务管理中HibernateDaoSupport与JdbcDaoSupport的应用:
1、编程式事务管理:
1>、JdbcDaoSupport编程式事物管理,必须继承JdbcDaoSupport类,得到JdbcTemplate从而实现事务管理;

TestA.java:
public class TestA extends JdbcDaoSupport{
public void test(){
     PlatformTransactionManager ptm = new DataSourceTransactionManager(this.getDataSource());
     TransactionTemplate tst = new TransactionTemplate(ptm);
     tst.execute(new TransactionCallback(){
   public Object doInTransaction(TransactionStatus status) {
      getJdbcTemplate().update("update User set password='1230' where userid='1001'"); 
      getJdbcTemplate().update("update User set email='liuzheng.666888@163.com' where userid='100000001'");
      getJdbcTemplate().update("update User set phone='phone'");
      return null;
   }
     });
}

public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    TestA t = (TestA)ctx.getBean("testa");
    t.test();
}
}
需要在Spring的配置文件applicationContext.xml中控制反转用到连接数据库中的类是注入DataSource,如下:
applicationContext.xml:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    
    ... ...
    
    <property name="defaultAutoCommit">
    <value>false</value>
    </property>
</bean>
    
        <bean id="testa" class="com.sun.demo.TestA">
        <property name="dataSource">
        <ref bean="myDataSource"/>
        </property>
        </bean>
2>、HibernateDaoSupport编程式事物管理,必须继承HibernateDaoSupport类,得到HibernateTemplate从而实现事务管理;
TestB.java:
public class TestB extends HibernateDaoSupport{
public void test(){
     HibernateTransactionManager hm = new HibernateTransactionManager(this.getSessionFactory());
     TransactionTemplate ttm = new TransactionTemplate(hm);
     ttm.execute(new TransactionCallback(){
   public Object doInTransaction(TransactionStatus status) {
    User u1 = new User();
    u1.setUserid("3001");
    u1.setPassword("3001");
    getHibernateTemplate().save(u1);
    
    User u2 = new User();
    u2.setUserid("3001");
    u2.setPassword("3002");
    getHibernateTemplate().save(u2);
    return null;
   }
     });
}

public static void main(String[] args) {
           ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
           TestB t = (TestB)ctx.getBean("testb");
        t.test();
}
}
需要在Spring的配置文件applicationContext.xml中控制反转用到连接数据库中的类是注入SessionsFactory,如下:
applicationContext.xml:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    
    ... ...
    
    <property name="defaultAutoCommit">
    <value>false</value>
    </property>
</bean>
    
     <bean id="testb" class="com.sun.demo.TestB">
     <property name="sessionFactory">
     <ref bean="mySessionFactory"/>
     </property>
     </bean>
2、声明式事务管理:    
1>、JdbcDaoSupport声明式样事物管理,必须继承JdbcDaoSupport类;
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
         
         ... ....

<property name="defaultAutoCommit">
<value>false</value>
</property>
</bean>

需要在Spring配置文件中配置声明事务处理,用JdbcDaoSupport提供的DataSourceTransactionManager如下:
        <!-- 事务管理配置 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
        <ref bean="myDataSource"/>
        </property>
        </bean>
       
        <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <!-- 事务管理属性 -->
        <property name="transactionAttributes">
           <props>
           <prop key="updateUser">PROPAGATION_REQUIRED</prop>
           </props>
        <!-- 事务管理目标bean -->
        </property>
        <property name="target" ref="userdao"></property>
        </bean>
        
        <bean id="userdao" class="com.sun.demo.UserDao">
        <property name="dataSource">
        <ref bean="myDataSource"/>
        </property>
        </bean>

IUserDao.java://定义接口
public interface IUserDao {
public void updateUser();
}

UserDao.java:
public class UserDao extends JdbcDaoSupport implements IUserDao{
       public void updateUser(){
        this.getJdbcTemplate().update("update User set password='password1' where userid='1001'");
           this.getJdbcTemplate().update("update User set password='password9999999999999999999999999999999' where userid='1002'");
       }
}

TestA.java://调用updateUser()方法
public class{
    
    public void test(){
          ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
       IUserDao u = (IUserDao)ctx.getBean("baseTransactionProxy");
          u.updateUser();
    }

public static void main(String[] args) {
           TestA t = new TestA();
           t.test();
}
}
2>、HibernateDaoSupport声明式事物管理,必须继承HibernateDaoSupport类;
IUserDao.java://定义接口
public interface IUserDao {
public void updateUser();
}
UserDao.java:
public class UserDao extends HibernateDaoSupport implements IUserDao{
       public void updateUser(){
              User u1 = new User();
              u1.setUserid("1001");
              u1.setPassword("5001");
              this.getHibernateTemplate().update(u1);
              
              
              User u2 = new User();
              u2.setUserid("1003");
              u2.setPassword("20015555555555555555555555555555555555555555555");
              this.getHibernateTemplate().update(u2);
       }
}

测试:
public class TestA{
    
    public void test(){
          ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
       IUserDao userdao= (IUserDao)ctx.getBean("userproxy");
          userdao.updateUser();
    }

public static void main(String[] args) {
           TestA t = new TestA();
           t.test();
}

需要在Spring配置文件中配置声明事务处理,用JdbcDaoSupport提供的HibernateTransactionManager如下:
applicationContext.xml:
        <!-- 事务管理配置 -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
        <ref bean="mySessionFactory"/>
        </property>
        </bean>
        
        <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager" ref="transactionManager"/>
        <!-- 事务管理属性 -->
        <property name="transactionAttributes">
           <props>
           <prop key="update*">PROPAGATION_REQUIRED</prop>
           <prop key="save*">PROPAGATION_REQUIRED</prop>
           <prop key="delete*">PROPAGATION_REQUIRED</prop>
           </props>
        <!-- 事务管理目标bean -->       
        </property>
        </bean>
        
        <bean id="userdao" class="com.sun.demo.UserDao">
        <property name="sessionFactory">
        <ref bean="mySessionFactory"/>
        </property>
        </bean>
        
        <bean id="userproxy" parent="baseTransactionProxy">
        <property name="target" ref="userdao"></property>
        </bean>

Spring的JdbcDaoSupport的批量操作

 

由于数据的批量处理(比如往RDBMS插入几万条数据)非常耗资源,因此建议在所有场合能够借助于JDBC完成,而不要去采用Hibernate API。本文主要围绕Spring内置的各类JDBC API抽象支持展开的。

1.1.  JdbcTemplate内置的batchUpdate(final String[] sql)

这一方法适合于小批量数据的CUD(增、更新、删除)操作,而且SQL类型不限。由于其内部使用了Statement语句,所以数据的操作效率一般。

1.2.  JdbcTemplate内置的batchUpdate(String sql, final BatchPreparedStatementSetter pss)

这一方法也仅仅适合于小批量数据的CUD(增、更新、删除)操作,但始终是同一SQL(参数具有多样性)。由于其内部使用了PreparedStatement语句,所以数据的操作效率还是不错的。下面给出了操作示例:

final int[] no = new int[]{7369,7499,7521,7566,7654,7698};

jt.batchUpdate("update emp set sal = ? where empno = ?",

new BatchPreparedStatementSetter(){

public void setValues(PreparedStatement ps, int i)

throws SQLException {

ps.setInt(1, no[i]);

ps.setFloat(2, no[i]);

}

public int getBatchSize() {

return no.length;

}

});

1.3.  BatchSqlUpdate

这一方法适合于各种批量数据的CUD(增、更新、删除)操作,但始终是同一SQL(参数具有多样性)。由于其内部使用了PreparedStatement语句,所以数据的操作效率还是不错的。下面给出了操作示例:

DataSource ds = gbfa.getBean("dataSource");

final int[] no = new int[]{7369,7499,7521,7566,7654,7698};

BatchSqlUpdate bsu = new BatchSqlUpdate(ds, "update emp set sal=? where empno = ?");

bsu.setBatchSize(4);

bsu.setTypes(new int[]{Types.FLOAT, Types.INTEGER});

for(int i = 0; i < no.length; ++i){

log.info(bsu.update(new Object[]{no[i],no[i]})) ;

}

bsu.flush();

同JdbcTemplate内置的batchUpdate(String sql, final BatchPreparedStatementSetter pss)相比,BatchSqlUpdate会自动分批待批量处理的数据。比如,如果需要批量操作10万条数据,则可以控制其batchSize,从而在时间(RDBMS可知性)和空间(内存)上达到平衡。

务必注意,在使用BatchSqlUpdate的最后,不要忘记手工调用其暴露的flush()方法。

HibernateDaoSupport与JdbcDaoSupport的更多相关文章

  1. 使用JDBC批量保存数据(JdbcDaoSupport,JdbcTemplete)

    最近做的一个项目中用到了Hibernate的,然后数据库批量插入数据的时候就使用到了hibernate的批处理,但是效率比较低,看网上说还有一些限制,要禁止二级缓存,还要多一个batch_size的配 ...

  2. HibernateDaoSupport类的使用

    HibernateDaoSupport类的使用 1.        继承了HibernateDaoSupport类的类获取session时,已不可用SessionFactory.OpenSessioo ...

  3. HibernateTemplate和HibernateDaoSupport(spring注入问题)

    HibernateTemplate HibernateTemplate是spring提供的一个就hibernate访问持久层技术而言.支持Dao组件的一个工具.HibernateTemplate提供持 ...

  4. HibernateDaoSupport 源码

    package org.springframework.orm.hibernate3.support; import org.hibernate.HibernateException; import  ...

  5. spring使用JdbcDaoSupport中封装的JdbcTemplate进行query

    1.Dept package cn.hxex.springcore.jdbc; public class Dept { private Integer deptNo; private String d ...

  6. Spring + JdbcTemplate + JdbcDaoSupport examples

    In Spring JDBC development, you can use JdbcTemplate and JdbcDaoSupport classes to simplify the over ...

  7. HibernateDaoSupport的使用

    1.HibernateDaoSupport是有spring提供的一个hibernate模版工具类,或不多说,直接上代码 接口 IGenericDao.java package org.hibernat ...

  8. SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明

    在接触HibernateTemplate之前,我们知道,在对数据库进行CRUD操作之前,需要开启session.transaction等等.在hibernate学习过程中,我们知道了,得到sessio ...

  9. HibernateDaoSupport和HibernateTemplate

    hibernateTemplate的常用方法: Ø  void delete(Object entity):删除指定持久化实例 Ø  deleteAll(Collection entities):删除 ...

随机推荐

  1. Android性能优化之渲染

    Google近期在Udacity上发布了Android性能优化的在线课程,目前有三个篇章,分别从渲染,运算与内存,电量三个方面介绍了如何去优化性能,这些课程是Google之前在Youtube上发布的A ...

  2. BTSync FREE vs BTSync PRO

    Although both BitTorrent Sync 2.0 FREE and PRO ensure high file transfer speed and ultimate security ...

  3. DHT(Distributed Hash Table,分布式哈希表)

    DHT(Distributed Hash Table,分布式哈希表)类似Tracker的根据种子特征码返回种子信息的网络. DHT全称叫分布式哈希表(Distributed Hash Table),是 ...

  4. 使用结构struct作为Dictionary<TKey,TValue>的键

    我们经常用简单数据类型,比如int作为泛型Dictionary<TKey,TValue>的key,但有时候我们希望自定义数据类型作为Dictionary<TKey,TValue> ...

  5. MVC文件上传07-使用客户端jQuery-File-Upload插件和服务端Backload组件裁剪上传图片

    本篇通过在配置文件中设置,对上传图片修剪后保存到指定文件夹. 相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小  MVC文件上传02-使用HttpPostedFileB ...

  6. rman多通道全备份脚本

     run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; ...

  7. velocity.properties配置说明

    1.Runtime  Log runtime.log  =  velocity.log 用以指定 Velocity 运行时日志文件的路劲和日志文件名,如不是全限定的绝对路径,系统会认为想对于 当前目录 ...

  8. ngx_lua实现登录逻辑

    最近在公司做一个简单的portal,本来很简单的,只用ngx_lua就可以实现所有的业务逻辑,不需要upstream上游服务.但被要求接入公司内部的用户校验系统,说白了就是一个登录过程,只允许公司内部 ...

  9. MAC之find与grep

    小白,新手.有错请指出. grep一般是搜指定文件中的内容:而find是搜对应的文件 find:1. 找出当前文件目录及其子目录含有开头a的文件.  “.”是当前目录   “-ls”显示详细信息fin ...

  10. 共享锁&排它锁 || 乐观锁&悲观索

    1.共享锁只用于表级,排他锁用于行级. 2.加了共享锁的对象,可以继续加共享锁,不能再加排他锁.加了排他锁后,不能再加任何锁. 3.比如一个DML操作,就要对受影响的行加排他锁,这样就不允许再加别的锁 ...