`

Spring3开发实战 之 第四章:对JDBC和ORM的支持

 
阅读更多

简介
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术,如JDBC,Hibernate或者JDO等。它不仅可以让你方便地在这些持久化技术间切换, 而且让你在编码的时候不用考虑处理各种技术中特定的异常。
一致的异常层次
Spring提供了一种方便的方法,把特定于某种技术的异常,如SQLException, 转化为自己的异常,这种异常属于以 DataAccessException 为根的异常层次。这些异常封装了原始异常对象,这样就不会有丢失任何错误信息的风险。
如果使用拦截器方式,你在应用中 就得自己小心处理HibernateException、 JDOException等,最好是委托给 SessionFactoryUtils的 convertHibernateAccessException、 convertJdoAccessException等方法。这些方法可以把相应的异常转 化为与org.springframework.dao中定义的异常层次相兼容的异常。
一致的DAO支持抽象类
为了便于以一种一致的方式使用各种数据访问技术,如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,通过它们你可以 获得与你当前使用的数据访问技术相关的数据源和其他配置信息。
1:JdbcDaoSupport - JDBC数据访问对象的基类。 需要一个DataSource,同时为子类提供 JdbcTemplate。
2:HibernateDaoSupport - Hibernate数据访问对象的基类。 需要一个SessionFactory,同时为子类提供 HibernateTemplate。也可以选择直接通过 提供一个HibernateTemplate来初始化。
3:JdoDaoSupport - JDO数据访问对象的基类。 需要设置一个PersistenceManagerFactory, 同时为子类提供JdoTemplate。
4:JpaDaoSupport - JPA数据访问对象的基类。 需要一个EntityManagerFactory,同时 为子类提供JpaTemplate。
简介
Spring JDBC抽象框架所带来的价值将在以下几个方面得以体现:(注:使用了Spring JDBC抽象框架之后,应用开发人员只需要完成斜体加粗字部分的编码工作。)
1:指定数据库连接参数
2:打开数据库连接
3:声明SQL语句
4:预编译并执行SQL语句
5:遍历查询结果(如果需要的话)
6:处理每一次遍历操作
7:处理抛出的任何异常
8:处理事务
9:关闭数据库连接
Spring将替我们完成所有单调乏味的JDBC底层细节处理工作
Spring JDBC抽象框架由四个包构成:core、 dataSource、object以及support
1:core包由JdbcTemplate类以及相关的回调接口和类组成。
2:datasource包由一些用来简化DataSource访问的工具类,以及各种DataSource接口的简单实现(主要用于单元测试以及在J2EE容器之外使用JDBC)组成。
3:object包由封装了查询、更新以及存储过程的类组成,这些类的对象都是线程安全并且可重复使用的。它们类似于JDO,与JDO的不同之处在于查询结果与数据库是“断开连接”的。它们是在core包的基础上对JDBC更高层次的抽象。
4:support包提供了一些SQLException的转换类以及相关的工具类。
 
在JDBC处理过程中抛出的异常将被转换成org.springframework.dao包中定义的异常。因此使用Spring JDBC进行开发将不需要处理JDBC或者特定的RDBMS才会抛出的异常。所有的异常都是unchecked exception,这样我们就可以对传递到调用者的异常进行有选择的捕获。
JdbcTemplate是core包的核心类。它替我们完成了资源的创建以及释放工作,从而简化了对JDBC的使用。它还可以帮助我们避免一些常见的错误,比如忘记关闭数据库连接。
定义接口如下:

java代码:
  1. public interface Api {  
  2. public boolean create(UserModel um);     
  3. }  
定义实现类如下:

java代码:
  1. public class Impl implements Api{  
  2. private DataSource ds = null;  
  3. public void setDs(DataSource ds){  
  4. this.ds = ds;  
  5. }  
  6. public boolean create(UserModel um) {  
  7. JdbcTemplate jt = new JdbcTemplate(ds);  
  8. jt.execute("insert into tbl_user (uuid,name) values('"+um.getUuid()+"','"+um.getName()+"')");  
  9. return false;  
  10. }  
  11. }  
配置文件

java代码:
  1. <bean name="api" class="cn.javass.Spring3.jdbc.Impl">  
  2. <property name="ds" ref="dataSource"></property>  
  3. </bean>  
  4. <bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  5. <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>  
  6. <property name="url"><value>jdbc:oracle:thin:@localhost:1521:orcl</value></property>  
  7. <property name="username"> <value>test</value> </property>  
  8. <property name="password" value="test"/>  
  9. </bean>  
客户端

java代码:
  1. public static void main(String[] args)throws Exception {  
  2. ApplicationContext context = new ClassPathXmlApplicationContext(  
  3.         new String[] {"applicationContext-jdbc.xml"});  
  4. Api api = (Api)context.getBean("api");  
  5. UserModel um = new UserModel();  
  6. um.setUuid("test1");  
  7. um.setName("test1");  
  8. api.create(um);  
  9. }  
如果是需要向里面传递参数的,就需要回调接口,如下:

java代码:
  1. public boolean create(UserModel um1){  
  2. JdbcTemplate jt = new JdbcTemplate(ds);  
  3. final UserModel um = um1;  
  4. class myCallBack implements PreparedStatementCallback{  
  5. public Object doInPreparedStatement(PreparedStatement pstmt)  
  6. throws SQLException, DataAccessException {  
  7. pstmt.setString(1,um.getUuid());  
  8. pstmt.setString(2,um.getName());  
  9. System.out.println("dddddddd");  
  10. return pstmt.executeUpdate();  
  11. }  
  12. }  
  13. jt.execute("insert into tbl_user (uuid,name) values(?,?)",new myCallBack());  
  14. return false;  
  15. }  
 
NamedParameterJdbcTemplate类在SQL语句中支持使用命名参数,比较适合做查询,如果做更新,同样需要使用回调方法,如下:

java代码:
  1. NamedParameterJdbcTemplate jt = new NamedParameterJdbcTemplate(ds);  
  2. Map paramMap = new HashMap();  
  3. paramMap.put("uuid",um.getUuid());  
  4. List list = jt.queryForList("select * from tbl_user where uuid=:uuid",paramMap);  
  5. Iterator it = list.iterator();  
  6. while(it.hasNext()){  
  7. Map map = (Map)it.next();  
  8. System.out.println("uuid="+map.get("uuid")+",name="+map.get("name"));  
  9. }  
NamedParameterJdbcTemplate类是线程安全的,该类的最佳使用方式不是每次操作的时候实例化一个新的NamedParameterJdbcTemplate,而是针对每个DataSource只配置一个NamedParameterJdbcTemplate实例
NamedParameterJdbcTemplate也可以自己做mapper,如下:

java代码:
  1. NamedParameterJdbcTemplate jt = new NamedParameterJdbcTemplate(ds);  
  2. Map paramMap = new HashMap();  
  3. paramMap.put("uuid",um1.getUuid());  
  4. RowMapper mapper = new RowMapper() {      
  5.       public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  
  6.           UserModel um = new UserModel();  
  7.           um.setName(rs.getString("name"));  
  8.           um.setUuid(rs.getString("uuid"));  
  9.           return um;  
  10.       }  
  11.   };  
  12. List list = jt.query("select * from tbl_user where uuid=:uuid",paramMap,mapper);  
  13. Iterator it = list.iterator();  
  14. while(it.hasNext()){  
  15. UserModel tempUm = (UserModel)it.next();  
  16. System.out.println("uuid="+tempUm.getUuid()+",name="+tempUm.getName());  
  17. }  
SimpleJdbcTemplate类
SimpleJdbcTemplate类是JdbcTemplate类的一个包装器(wrapper),它利用了Java 5的一些语言特性,比如Varargs和Autoboxing。
SQLExceptionTranslator接口
SQLExceptionTranslator是一个接口,如果你需要在 SQLException和org.springframework.dao.DataAccessException之间作转换,那么必须实现该接口。
转换器类的实现可以采用一般通用的做法(比如使用JDBC的SQLState code),如果为了使转换更准确,也可以进行定制(比如使用Oracle的error code)。
SQLErrorCodeSQLExceptionTranslator是SQLExceptionTranslator的默认实现。 该实现使用指定数据库厂商的error code,比采用SQLState更精确。
DataSourceUtils类
DataSourceUtils是一个帮助类提供易用且强大的数据库访问能力,们可以使用该类提供的静态方法从JNDI获取数据库连接以及在必要的时候关闭之。
尤其在使用标准JDBC,但是又想要使用Spring的事务的时候,最好从DataSourceUtils类来获取JDBC的连接。
SmartDataSource接口
SmartDataSource是DataSource 接口的一个扩展,用来提供数据库连接。使用该接口的类在指定的操作之后可以检查是否需要关闭连接。
 
AbstractDataSource类
它实现了DataSource接口的 一些无关痛痒的方法,如果你需要实现自己的DataSource,那么继承 该类是个好主意 。
SingleConnectionDataSource类
是SmartDataSource接口 的一个实现,其内部包装了一个单连接。该连接在使用之后将不会关闭,很显然它不能在多线程 的环境下使用
简介
Spring在资源管理,DAO实现支持以及事务策略等方面提供了与 JDO、JPA、Hibernate、TopLink及iBATIS的集成。以Hibernate为例,Spring通过使用许多IoC的便捷特性对它提供了一流的支持,帮助你处理很多典型的Hibernate整合的问题。所有的这些支持,都遵循Spring通用的事务和DAO异常体系。通常来说有两种不同的整合风格:你可以使用Spring提供的DAO模板,或者直接使用Hibernate/JDO/TopLink等工具的原生API编写DAO。无论采取哪种风格,这些DAO都可以通过IoC进行配置,并参与到Spring的资源和事务管理中去。
使用Spring构建你的O/R Mapping DAO的好处包括:
1:测试简单
2:异常封装
3:通用的资源管理
4:综合的事务管理
5:避免绑定特定技术允许mix-and-match的实现策略
在Spring的application context中创建 SessionFactory ,如下:

java代码:
  1. <bean id="hbConfig"  
  2. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  3. <property name="dataSource"><ref local="dataSource"/></property>  
  4. <property name="mappingResources">  
  5. <list>  
  6. <value>com/lx/Parent.hbm.xml</value>  
  7. </list>  
  8. </property>  
  9. <property name="hibernateProperties">  
  10. <props>  
  11. <prop key="hibernate.dialect">  
  12. org.hibernate.dialect.Oracle9Dialect  
  13. </prop>  
  14. <prop key="hibernate.show_sql">true</prop>  
  15. </props>  
  16. </property>  
  17. </bean>  
定义接口如下:

java代码:
  1. public interface Api {  
  2. public boolean create(UserModel um);  
  3. }  
实现类如下:

java代码:
  1. public class Impl implements Api{  
  2. private SessionFactory sf = null;  
  3. public void setSf(SessionFactory sf){  
  4. this.sf = sf;  
  5. }  
  6. public boolean create(UserModel um){  
  7. HibernateTemplate ht = new HibernateTemplate(sf);  
  8. ht.save(um);  
  9. return false;  
  10. }  
  11. }  
配置文件如下:

java代码:
  1. <bean name="api" class="cn.javass.Spring3.h3.Impl">  
  2. <property name="sf" ref="hbConfig"></property>  
  3. </bean>  
  4. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
  5. <property name="driverClassName">  
  6. <value>oracle.jdbc.driver.OracleDriver</value>  
  7. </property>  
  8. <property name="url">  
  9. <value>jdbc:oracle:thin:@localhost:1521:orcl</value>  
  10. </property>  
  11. <property name="username"> <value>test</value> </property>  
  12. <property name="password" value="test"/>  
  13. </bean>  
配置文件如下:

java代码:
  1. <bean id="hbConfig" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  2. <property name="dataSource"><ref local="dataSource"/></property>  
  3. <property name="mappingResources">  
  4. <list> <value>cn/javass/Spring3/h3/UserModel.hbm.xml</value>  
  5. </list>  
  6. </property>  
  7. <property name="hibernateProperties">  
  8. <props>  
  9. <prop key="hibernate.dialect">  
  10. org.hibernate.dialect.Oracle8iDialect  
  11. </prop>  
  12. <prop key="hibernate.show_sql">true</prop>  
  13. </props>  
  14. </property>  
  15. </bean>  
客户端文件如下:

java代码:
  1. public static void main(String[] args)throws Exception {  
  2. ApplicationContext context = new ClassPathXmlApplicationContext(  
  3.         new String[] {"applicationContext-h3.xml"});  
  4. Api api = (Api)context.getBean("api");  
  5. UserModel um = new UserModel();  
  6. um.setUuid("test1");  
  7. um.setName("test1");  
  8. api.create(um);  
  9. }  
前面的演示是更新操作,那么查询怎么做呢?如下:

java代码:
  1. List<UserModel> list = ht.find("select o from UserModel o");  
要传入参数怎么做呢?如下:

java代码:
  1. Object params[] = new Object[1];  
  2. params[0] = "test1";  
  3. List<UserModel> list = ht.find("select o from UserModel o where o.uuid=?",params);  
要传入命名参数怎么做呢?如下:

java代码:
  1. Object params[] = new Object[1];  
  2. params[0] = "test1";  
  3. String names[] = new String[1];  
  4. names[0] = "uuid";  
  5. List<UserModel> list = ht.findByNamedParam("select o from UserModel o where o.uuid=:uuid",names,params);  
如果需要使用Hibernate的Query接口,该怎么做呢?如下:

java代码:
  1. HibernateCallback hcb =new HibernateCallback(){  
  2. public Object doInHibernate(Session session)throws HibernateException, SQLException {  
  3. Query q = session.createQuery("select o from UserModel o where o.uuid=:uuid");  
  4. q.setString("uuid", um.getUuid());  
  5. return q.list();  
  6. }  
  7. };  
  8. Collection<UserModel> list = (Collection<UserModel>)ht.execute(hcb);  
一个回调实现能够有效地在任何Hibernate数据访问中使用。HibernateTemplate 会确保当前Hibernate的 Session 对象的正确打开和关闭,并直接参与到事务管理中去。 Template实例不仅是线程安全的,同时它也是可重用的。因而他们可以作为外部对象的实例变量而被持有。
实现类改成如下:

java代码:
  1. public class Impl extends HibernateDaoSupport implements Api{  
  2. public Collection testQuery(){  
  3. List<UserModel> list = this.getHibernateTemplate().find("select o from UserModel o");  
  4. for(UserModel tempUm : list){  
  5. System.out.println("uuid=="+tempUm.getUuid()+",name="+tempUm.getName());  
  6. }  
  7. return list;  
  8. }  
  9. }  
配置文件改成如下:

java代码:
  1. <bean name="api" class="cn.javass.Spring3.h3.Impl">  
  2. <property name="sessionFactory" ref="hbConfig"></property>  
  3. </bean>  
要想使用Session怎么办?如下:

java代码:
  1. Session session = getSession(getSessionFactory(), false);  
通常将一个false作为参数(表示是否允许创建)传递到 getSession(..) 方法中进行调用。 此时,整个调用将在同一个事务内完成(它的整个生命周期由事务控制,避免了关闭返回的 Session 的需要)。
 
原创内容 转自请注明【 http://sishuok.com/forum/blogPost/list/0/2544.html#7318】 
视频配套PPT,视频地址【 Spring3开发实战-独家视频课程 】
5
6
分享到:
评论

相关推荐

    Spring+3.x企业应用开发实战光盘源码(全)

     第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。  第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们...

    spring学习笔记 私塾在线

    4. **Spring3开发实战 之 第四章:对JDBC和ORM的支持**: Spring提供了JdbcTemplate和SimpleJdbcInsert等工具类,使得与数据库的交互变得更加便捷。同时,它也支持多种ORM框架,如Hibernate和MyBatis,通过...

    Spring3开发实战

    4. **数据访问/集成(Data Access/Integration)**:Spring提供了对多种数据访问技术的支持,包括JDBC、ORM(Object-Relational Mapping)框架如Hibernate、MyBatis,以及JPA(Java Persistence API)。Spring的事务...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。  第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们...

    Spring 实战 (中文第4版) PDF + source code

    本书全面覆盖了Spring框架的核心概念、关键特性以及在实际开发中的应用,适合Java开发者和对Spring感兴趣的人员阅读。作者Cary Millsap和Craig Walls凭借丰富的经验,将理论与实践相结合,提供了大量实用示例,帮助...

    spring3.x企业应用实战开发-源码

    《Spring 3.x 企业应用实战开发-源码》是一份深入探讨Spring框架在实际企业应用中的实践指南,其中包含了从第二章到第十九章的完整源代码。这份资料是学习和理解Spring 3.x核心特性和实际应用场景的宝贵资源。下面...

    org.springframework.orm.jar.zip

    3. JDBC抽象:Spring提供了JdbcTemplate和NamedParameterJdbcTemplate,它们是对JDBC的简单包装,降低了SQL操作的复杂性,提高了可读性和可维护性。 4. MyBatis集成:对于偏好XML或注解方式配置SQL的开发者,Spring...

    Spring 3.x 企业应用开发实战-源代码

    6. **第7章**:数据访问,涉及到JDBC、Hibernate和MyBatis的集成,以及Spring对ORM的支持。 7. **第8章**:事务管理,讲述了Spring的声明式和编程式事务管理,以及事务的传播行为。 8. **第9章**:Spring与其他...

    Spring in action 第四版与第五版,出版社版本,第四版有中文版本

    第四版(Spring实战)由Craig Walls撰写,它详细介绍了Spring 3.x版本的功能,包括依赖注入、AOP、数据访问、Web开发以及Spring MVC。此版本特别适合初学者,因为它从基础开始,逐步引导读者理解Spring框架的运作...

    Spring.3.x企业应用开发实战(完整版).part2

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring+3.x企业应用开发实战光盘源码(完全版)

    3. **数据访问集成**:Spring提供了对多种数据库访问技术的支持,包括JDBC、ORM(如Hibernate、MyBatis)以及JPA,简化了数据库操作。 4. **MVC框架**:Spring MVC是Spring框架的一部分,用于构建Web应用程序。它...

    Java Web整合开发实战 随盘源代码1-9章

    第4章:可能会讲解MVC设计模式,介绍Spring MVC或Struts2等流行的MVC框架。MVC模式是Java Web开发中常用的设计模式,能有效地分离业务逻辑、视图和控制层,提高代码的可读性和可维护性。 第5章:可能会涉及到数据库...

    spring实战全部源代码.zip

    《Spring实战》第五版的源代码压缩包"spring实战全部源代码.zip"包含了全面的示例项目,旨在帮助读者深入理解和应用Spring框架。这个压缩包中的"spring-in-action-5-samples-master"目录揭示了书中的各个实战案例,...

    Craig Walls 著 张卫滨 翻译 - spring inaction (spring 实战 第四版 )

    4. **数据访问**:Spring提供了对各种数据库的强有力支持,包括JDBC抽象层、ORM集成(如Hibernate和MyBatis),以及对NoSQL数据库如MongoDB的支持。 5. **Java 8支持**:Spring 4.0引入了对Java 8新特性的支持,...

    Spring3.x企业应用开发实战(完整版) part1

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring_3.x企业应用开发实战光盘源码_全

    3. **数据访问增强**:Spring 3.x加强了对各种数据库的支持,包括JDBC、ORM框架如Hibernate和MyBatis的集成,提供了统一的数据访问接口,简化了数据访问层的开发。 4. **MVC框架升级**:Spring MVC在3.x版本中得到...

    Spring_3.x企业应用开发实战 目录

    ### Spring 3.x 企业应用开发实战:关键知识点解析 #### 第1章 Spring概述 - **1.1 认识Spring** - **定义与作用**:Spring 是一个开源的轻量级 Java 开发框架,它主要的目标是解决企业级应用开发中的复杂性问题...

    spring 3.x 企业应用开发实战

    根据提供的标题“Spring 3.x 企业应用开发实战”及描述“Spring 3.x 企业应用开发实战完整电子文档,熟悉Spring就从这里出发”,我们可以深入探讨Spring框架的基础概念、核心功能以及在企业级应用中的具体实践。...

    spring3.x企业应用开发实战依赖类库

    这个"spring3.x企业应用开发实战依赖类库"的资源主要包含了`lib`包,它提供了开发Spring应用程序所需要的各种第三方类库,但请注意,这个包并没有包含Spring框架本身。这意味着你需要确保已经安装并配置了Spring ...

    第一次搭建spring3.x需要的jar和搭建源码

    在搭建Spring 3.x开发环境时,我们首先要理解Spring的核心概念和它在Java应用程序中的作用。Spring是一个开源的Java框架,主要用于简化企业级应用的开发,通过依赖注入(Dependency Injection, DI)和面向切面编程...

Global site tag (gtag.js) - Google Analytics