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,内部调用啥方法实现事务处理?