《第16章 Spring的数据访问ppt课件.ppt》由会员分享,可在线阅读,更多相关《第16章 Spring的数据访问ppt课件.ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第16章章 Spring的数据访问的数据访问第十六章第十六章Spring的数据访问的数据访问与与JDBC的整合的整合 nJDBC的重要性的重要性vJDBC通过为操作数据库提供统一接口,使得不同的数据通过为操作数据库提供统一接口,使得不同的数据库具有了统一处理的流程,因此,库具有了统一处理的流程,因此,JDBC在在Java应用开应用开发中占有非常重要的地位,它在很大程度上屏蔽了数据发中占有非常重要的地位,它在很大程度上屏蔽了数据库的不一致性问题。库的不一致性问题。 Spring JDBC简介简介 nSpring JDBC抽象框架主要由以下四个包组成:抽象框架主要由以下四个包组成: 包由包由Jd
2、bcTemplate类以及相关的回调接口和类组成;类以及相关的回调接口和类组成; 包由一些用来简化包由一些用来简化DataSource访问的工具类,以及各种访问的工具类,以及各种DataSource接口的简单实现(主要用于单元测试以及在接口的简单实现(主要用于单元测试以及在J2EE容器容器之外使用之外使用JDBC)组成。)组成。 包由封装了查询、更新以及存储过程的类组成,这些类的对象都是包由封装了查询、更新以及存储过程的类组成,这些类的对象都是线程安全并且可重复使用的。线程安全并且可重复使用的。 包提供了一些包提供了一些SQLException的转换类以及相关的工具类的转换类以及相关的工具类
3、JdbcTemplate类类 nJdbcTemplatev JdbcTemplate是是core包的核心类,它替开发人员完成了资源的创建包的核心类,它替开发人员完成了资源的创建以及释放工作,以及释放工作,JdbcTemplate可以完成可以完成SQL查询、更新以及调用存查询、更新以及调用存储过程,可以对储过程,可以对ResultSet进行遍历并加以提取,还可以捕获进行遍历并加以提取,还可以捕获JDBC异常。异常。 JdbcTemplate类类 n使用使用JdbcTemplate进行编码进行编码v 只需要根据明确定义的一组契约来实现回调接口,只需要根据明确定义的一组契约来实现回调接口,Prepa
4、redStatementCreator回调接口通过给定的回调接口通过给定的Connection创建创建一个一个PreparedStatement,包含,包含SQL和任何相关的参数。和任何相关的参数。CallableStatementCreateor实现同样的处理,只不过其创建的是实现同样的处理,只不过其创建的是CallableStatement,RowCallbackHandler接口则从数据集的每一接口则从数据集的每一行中提取值。行中提取值。NamedParameterJdbcTemplate类类 nNamedParameterJdbcTemplate类类v 增加了在增加了在SQL语句中使用
5、命名参数的支持,在此之前,在传统的语句中使用命名参数的支持,在此之前,在传统的SQL语句中,参数都是用语句中,参数都是用“?”占位符来表示的。占位符来表示的。NamedParameterJdbcTemplate类在内部封装了一个普通的类在内部封装了一个普通的JdbcTemplate,并作为其代理来完成大部分工作。,并作为其代理来完成大部分工作。 String sql = select count(0) from T_ACTOR wherefirst_name = :first_name;NamedParameterJdbcTemplate template =new NamedParamete
6、rJdbcTemplate(this.getDataSource();SqlParameterSource namedParameters =new MapSqlParameterSource(first_name, firstName);return template.queryForInt(sql, namedParameters); SimpleJdbcTemplate类类-1 nSimpleJdbcTemplate类类v JdbcTemplate类的一个包装器(类的一个包装器(wrapper),它利用了),它利用了Java 5的一些语言的一些语言特性,比如:特性,比如:Varargs和
7、和Autoboxing。 public Actor findActor(long id) String sql = select id, first_name, last_name from T_ACTOR where id = ?;RowMapper mapper = new RowMapper() public Object mapRow(ResultSet rs, int rowNum)throws SQLException Actor actor = new Actor();actor.setId(rs.getLong(Long.valueOf(rs.getLong(id);actor
8、.setFirstName(rs.getString(first_name);actor.setLastName(rs.getString(last_name);return actor;JdbcTemplate jdbcTemplate = new JdbcTemplate(this.getDataSource();return (Actor) jdbcTemplate.queryForObject(sql,mapper, new Object Long.valueOf(id);SimpleJdbcTemplate类类-2下面是同一方法的另一种实现,惟一不同之处是使用了下面是同一方法的另一种
9、实现,惟一不同之处是使用了SimpleJdbcTemplate,这样代码显得,这样代码显得更加清晰。更加清晰。/ SimpleJdbcTemplate-style.public Actor findActor(long id) String sql = select id, first_name, last_name from T_ACTOR where id = ?;ParameterizedRowMapper mapper =new ParameterizedRowMapper() / notice the return type with respect to Java 5/ covar
10、iant return typespublic Actor mapRow(ResultSet rs, int rowNum)throws SQLException Actor actor = new Actor();actor.setId(rs.getLong(id);actor.setFirstName(rs.getString(first_name);actor.setLastName(rs.getString(last_name);return actor;/ again, normally this would be dependency injected of course.Simp
11、leJdbcTemplate simpleJdbcTemplate =new SimpleJdbcTemplate(this.getDataSource();return simpleJdbcTemplate.queryForObject(sql, mapper, id);JdbcDaoSupport类类 n使用使用jdbcDaoSupport类类v用户的用户的DAO类只要继承这个类就可以方便地得到类只要继承这个类就可以方便地得到JdbcTemplate类的实例、数据库的连接等资源以便进行类的实例、数据库的连接等资源以便进行数据库的操作。数据库的操作。vSpring的的JDBC框架定义了接口框
12、架定义了接口,开发人员可以通过实现开发人员可以通过实现这个接口来完成查询结果到这个接口来完成查询结果到Java对象的转换。对象的转换。 Spring JDBC数据源包数据源包 -1nSpring也提供了对数据源的支持也提供了对数据源的支持v数据源的实现对象都被放置在了数据源的实现对象都被放置在了Spring JDBC的数据源的数据源包中。包中。v在这一系列的数据源实现中,最常使用的就是前面已经在这一系列的数据源实现中,最常使用的就是前面已经多次使用的多次使用的DriverManagerDataSource。它和以前获取。它和以前获取一个一个JDBC连接的做法没什么两样,需要提供连接的做法没什么
13、两样,需要提供JDBC驱动驱动程序的全限定名、访问数据库的程序的全限定名、访问数据库的URL以及连接数据库的以及连接数据库的用户名和密码。用户名和密码。Spring JDBC数据源包数据源包 -2DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName(oracle.jdbc.driver.OracleDriver);dataSource.setUrl(jdbc:oracle:thin:127.0.0.1:1521:ORCL);dataSource.setUs
14、ername(j2ee);dataSource.setPassword(example);与与Hibernate的整合的整合-1 nSpring使用使用IoC的便捷特性对的便捷特性对Hibernate提供了一流提供了一流的支持,帮助开发人员处理很多典型的的支持,帮助开发人员处理很多典型的Hibernate整合问题。所有的这些支持,都遵循整合问题。所有的这些支持,都遵循Spring通用的通用的事务和事务和DAO异常体系。异常体系。n通常来说有两种不同的整合风格:通常来说有两种不同的整合风格:v开发人员可以使用开发人员可以使用Spring提供的提供的DAO模板,模板,v或者直接使用或者直接使用Hi
15、bernate/JDO/TopLink等工具的原生等工具的原生API编写编写DAO。 无论采取哪种风格,这些无论采取哪种风格,这些DAO都可以通过都可以通过IoC进行配置进行配置,并参与到,并参与到Spring的资源和事务管理中去。的资源和事务管理中去。n利用利用Spring的的IoC容器创建容器创建SessionFactory .Spring允许开发人员在允许开发人员在application context中中以以bean的方式定义诸如的方式定义诸如JDBC DataSource或者或者HibernateSessionFactory 的数据访问资源。由于的数据访问资源。由于SessionFa
16、ctory在整个应用中只需初始化一次,因在整个应用中只需初始化一次,因而可以方便地使用而可以方便地使用Spring的的IoC容器来进行创建和容器来进行创建和管理。管理。 与与Hibernate的整合的整合-2nDAO的开发的开发 Spring提供的提供的DAO(数据访问对象数据访问对象)支持主要的目的是便于以支持主要的目的是便于以标准的方式使用不同的数据访问技术,如标准的方式使用不同的数据访问技术,如JDBC,Hibernate或者或者JDO等。它不仅可以让开发人员方便地在这等。它不仅可以让开发人员方便地在这些持久化技术间切换,而且在编码的时候不用考虑处理各种些持久化技术间切换,而且在编码的时
17、候不用考虑处理各种技术中特定的异常。技术中特定的异常。与与Hibernate的整合的整合-3nDAO的开发的开发 在进行在进行DAO的开发时,与的开发时,与JDBC一样,也有两种方一样,也有两种方式供选择:式供选择:v 一种是直接利用一种是直接利用Hibernate的的API来直接实现,来直接实现,v 另一种方式是在另一种方式是在Spring框架所提供的框架所提供的HibernateDaoSupport类的基础上进行类的基础上进行DAO的开发。的开发。与与Hibernate的整合的整合-3事务控制事务控制 nSpring框架对事务管理提供了统一的抽象,这带来了框架对事务管理提供了统一的抽象,这
18、带来了4种优种优势。势。 为不同的事务为不同的事务API提供一致的编程模型,如提供一致的编程模型,如JTA,JDBC,Hibernate,JPA和和JDD。 支持声明式事务管理。支持声明式事务管理。 提供比大多数事务提供比大多数事务API更简单、更易于使用的编程式事务管理更简单、更易于使用的编程式事务管理API。 整合整合Spring的各种数据访问抽象。的各种数据访问抽象。 事务管理和日志功能一样,属于一种横向的编辑工作,因此在事务管理和日志功能一样,属于一种横向的编辑工作,因此在Spring的的IoC容器的基础上通过容器的基础上通过AOP可以很方便地实现面向可以很方便地实现面向Java方方法
19、的事务管理。法的事务管理。事务管理的框架事务管理的框架 nSpring的事务管理的核心功能框架由以下的事务管理的核心功能框架由以下3部构成。部构成。 1、TransactionDefinition接口接口 定义了事务策略,指定了:定义了事务策略,指定了: 事务隔离事务隔离 事务传播事务传播2、TransactionStatus接口接口 代表了事务的状态信息,接口中定义了获得事务状态的一些方法。代表了事务的状态信息,接口中定义了获得事务状态的一些方法。 3、PlatformTransactionManager接口接口 代表了事务的状态信息,接口中定义了获得事务状态的一些方法。代表了事务的状态信息
20、,接口中定义了获得事务状态的一些方法。 声明式事务管理声明式事务管理 -1nSpring的声明式事务管理的声明式事务管理v通过通过Spring AOP实现的,因为事务方面的代码与实现的,因为事务方面的代码与Spring绑定并以一种样板式风格使用,不过尽管如此,开发人绑定并以一种样板式风格使用,不过尽管如此,开发人员一般并不需要理解员一般并不需要理解AOP概念就可以有效地使用概念就可以有效地使用Spirng的声明式事务管理。的声明式事务管理。配置数据源配置数据源 oracle.jdbc.driver.OracleDriverjdbc:oracle:thin:127.0.0.1:1521:ORCL
21、j2eeexample声明式事务管理声明式事务管理 -2配置事务管理对象配置事务管理对象 声明式事务管理声明式事务管理 -3配置事务策略配置事务策略 声明式事务管理声明式事务管理 -4配置配置AOP 声明式事务管理声明式事务管理 -5 编程式事务管理编程式事务管理 nSpring提供两种方式的编程式事务管理:提供两种方式的编程式事务管理:v使用使用 TransactionTemplatev直接使用一个直接使用一个 PlatformTransactionManager 实现实现 如果选择编程式事务管理,如果选择编程式事务管理,Spring小组推荐开发人员采用第一种方法小组推荐开发人员采用第一种方法(即使用(即使用 TransactionTemplate),而第二种方法则类似使用),而第二种方法则类似使用JTA的的 UserTransaction API(除了异常处理相对简单一些)。(除了异常处理相对简单一些)。