[转帖]   Spring 持久化_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3235 | 回复: 0   主题: [转帖]   Spring 持久化        下一篇 
funny
注册用户
等级:中校
经验:1529
发帖:111
精华:4
注册:2013-3-13
状态:离线
发送短消息息给funny 加好友    发送短消息息给funny 发消息
发表于: IP:您无权察看 2013-3-13 16:33:10 | [全部帖] [楼主帖] 楼主

spring持久化可以从几个方面来看:

1.对异常的处理
      spring中提供了DataAccessException,这个异常类是对现有多数据库抛出异常的封装,并可以对不同数据库抛出异常的状态码进行解释。因此,在业务层中方法声明throws DataAccessException,可以不必担心抛出我们没有捕获到的数据库操作异常,把精力放在“业务异常”上面。

2.模板类
      spring设计为了更好的管理异常、事务,避免业务方法中重复的try/catch块,设计出模板类,最重要的两个为JdbcTemplate,HibernateTemplate,spring的模板类都是线程安全的,由ThreadLocal进行资源管理。

      使用JdbcTemplate,HibernateTemplate必须注入DateSource,SesssionFactory,通过构造方法注入。例:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-org><ref bean="dataSource"/></constructor-arg>
</bean>


       HibernateTemplate配置与上相同,配置sessionFactory.把配置好的jdbcTemplate,hibernateTemplate注入到我们的DAO或业务类中,即可使用。但是通常我们有很多的DAO类或业务类,这样做的话我们每个类都要注入一次,解决这样的问题,我们可以把模板类放到父���中,子类调用即可。

       这一切,spring已经都想到了,spring提供了JdbcDaoSupport,HibernateDaoSupport类,这两个类都是abstract class,不能实例化,我们的业务类继承这两个类,通过getJdbcTemplate(),getHibernateTemplate()方法即可得到对应的模板类。当然,我们首先要将模板类注入到这两个XXXDaoSupport类中。

<bean id = "jdbcDaoSupport" class=" org.springframework.jdbc.core.support.JdbcDaoSupport">
<property name="jdbcTemplate"><ref bean = "jdbcTemplate"/></property>
</bean>


     JdbcTemplate类用法:

getJdbcTemplate().query("select * from news",new RowCallBackHandler(){
public void processRow(ResultSet rs ){....}
}
getJdbcTemplate().update(".....");
getJdbcTemplate().update("update news set title=? where id=?",new PreparedStatementSetter(){
      public void setValue(PreparedStatement pstmt) throws SQLException{
            pstmt.setString("dd");
            pstmt.setInt(2);
      }
}
getHibernateTemplate().execute(new HibernateCallback(){
      public Object doInHibernate)(Session s) throws HibernateException {
            ......
      }
}


  HibernateTemplate用法:

getHibernateTemplate().execute(new HibernateCallback(){
      public Object doInHibernate(Session s) throws SQLException {
            return s.find("...");
      }
}


    在开发中直接使用这些模板,代码看起来可能不是很直观,本身这些模板只是为我们省了一些异常处理等代码,只是对原有hibernate session,jdbc connection,datasource的一个封装。所以,在实际开发中,为了灵活的使用模板,并充分发挥原有session等功能,还要封装一个BaseDao类,把常用CRUD、分页等操作封装供子类DAO调用。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论