发新话题
打印

spring和数据库

spring和数据库

spring和数据库
1. 为什么需要dao接口和dao实现,目标是可以变换数据存储技术,
    如想用jdbc,或者jpa,或者,hibernate。实际上,这种变换需求很少,一般在设计时,已经充分认证,定下来后,不会再变了。我认为,这种好处,其实没有多少实际意义,
2. jdbc exception,异常情况有,不能连接数据库,查询语法错误,列或表不存在,违反约束.
3. spring提供标准的一套数据访问异常系统,所有exception,继承自 DataAccessException.
4. DataAccessException是一个免检异常.
5. spring模板类,可以处理事务,管理资源,如数据库连接等,异常处理。
6. spring的模板类有 JdbcTemplate, HibernateTemplate, JpaTemplate 等.
7. 一般地,在spring配置模板类为一个bean,然后,注入到dao.
8. DaoSupport的具体类有 JdbcDaoSupport,HibernateDaoSupport,JpaDaoSupport.
9. DaoSupport只定义了少量的方法。具体DaoSupport可以访问相应的数据访问对象,比如:
   JdbcDaoSupport: getConnection,releaseConnection,getJdbcTemplate
   HibernateDaoSupport: getSession,getSessionFactory,getHibernateTemplate.
10. 不存在统一的 DaoTemplate 接口,所有template互不相关。
   JdbcTemplate: update,query,execute.
   HibernateTemplate: find,get,update,load...
11.由上可知,template管的是具体的crud操作,dao管的是session,connection资源.
12. spring可用的数据源(javax.sql.DataSource),jdbc数据源,jndi数据源,连接池. 它们都是一个javax.sql.DataSource的一个实例,jdbc数据源,spring提供的实现是 DriverManagerDataSource.
13. 使用jdbcTemplate
复制内容到剪贴板
代码:
   <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">   
    <property name="jndiName" value="java:comp/env/jdbc/ymh"/>   
   </bean>  
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <bean id="sampleDao" class="SampleDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>

    public class SampleDaoImpl implement SampeDao
    {
        private JdbcTemplate jdbcTemplate;
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
        {
            this.jdbcTemplate=jdbcTemplate;
        }
    }
14. jdbcTemplate的query(... RowMap map),得到一个bean的列表. 感觉有OR的风格.
15. 可以认为 Template维护了一个javax.sql.DataSource的实例,具体进行crud时,从这个实例中得到connection.
16. 对JdbcDaoSupport设置setDataSource时,将自动创建一个jdbcTemplate实例。
复制内容到剪贴板
代码:
    <!-- SampleData 继承自 JdbcDaoSupport -->
    <bean id="sampleDao" class="SampleDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>
17. 与jdbcTemplate不同,jdbcTemplate只需要配置 dataSource引用,而HibernateTemplate需要配置sessionFactory引用,如下:
复制内容到剪贴板
代码:
    <bean ... class="HibernateTempalte">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean name="sessionFactory" class="LocalSessionFactoryBean">
       dataSource ...
       mappingResources...
       properties...
    </bean>
18. 和LocalSessionFactoryBean一样,可以使用AnnotationSessionFactoryBean来配置持久类,如:
复制内容到剪贴板
代码:
     <bean name="sessionFactory" class="AnnotationSessionFactoryBean">
       <property name="annotatedClasses">
          <List>
              SampleBean
          </List>
       </property>
    ...
    </bean>
19. JpaTemplate需要配置,entityManagerFactory引用.
复制内容到剪贴板
代码:
    <bean class="JpaTemplate">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    <bean name="entityManagerFactory" class="???EntityManagerFactory">
        ...
    </bean>
20. 用于 jdbc的事务类,不叫 JdbcTransactionManager ,而叫 DataSourceTransactionManager,需要配置一个 javax.sql.DataSource的引用。
21. DataSourceTransactionManager,通过 dataSource.getConnection().commit()/rollback()来实现提交和回滚。
22. HibernateTransactionManager需要配置sessionFactory,通过  sessionFactory.getCurrentSession().getTransaction().commit()/rollback()实现事务处理。
23. JpaTransactionManager,需要引用 entityManagerFactory,内部调用啥方法实现事务处理?

TOP

发新话题