在JBuilder 中创建Spring的MVC Web应用+UserLogin+DAO

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Spring的MVCWeb应用中的持久层技术1、常规的JDBC编程实现(1)比较糟糕的设计方案:业务层组件与数据访问组件混合在一起我们在常规的编程实现中,经常会在业务类中既写业务逻辑处理,同时又写与底层存储媒介交互代码,使业务类变得复杂,且不便于维护。(2)将数据访问从业务处理类中分离中,形成DAO组件因此我们用DAO模式将业务逻辑与底层存储媒介交互分离,DAO的英文全称为DataAccessObject。DAO充当业务层与持久层的交互入口。2、Spring中的DAO程序的代码----进一步对JDBC作了简化(1)下面为Spring中的DAO程序的代码示例。(2)Spring对持久层的支持技术:提供一个JdbcTemplate类来实现JDBC的数据库访问,并简化其编程实现。3、利用Spring的JdbcTemplate类来实现JDBC的数据库访问(1)常规的JDBC的访问代码所存在的问题JDBC提供了还算不错的数据库抽象,但是需要用痛苦的API。这些问题包括:由于JDBC是一个非常基础的数据存取API,并且它封装了对关系型数据库的访问但是我们应该承认的是,JDBC仍然属于层次较低的API,所以在使用的时候,我们不得不编写大量的代码,来完成一件简单的工作。需要冗长的错误处理代码来确保ResultSets,Statements以及(最重要的)Connections在使用后关闭这意味着对JDBC的正确使用可以快速地导致大量的代码量。它还是一个常见的错误来源。Connectionleak可以在有负载的情况下快速宕掉应用程序。JDBC不提供异常的层次SQLException相对来说不能说明任何问题,JDBC不提供异常的层次,而是用抛出SQLException来响应所有的错误。找出到底哪里出错了——例如,问题是死锁还是无效的SQL?——要去检查SQLState或错误代码。这意味着这些值在数据库之间是变化的。(2)作为对比,首先让我们来看一段传统的JDBC代码:Connectionconn=null;Statementstmt=null;try{conn=dataSource.getConnection();stmt=con.createStatement();stmt.executeUpdate(UPDATEuserInfoSETage=18WHEREid='erica');}catch(SQLExceptione){}finally{if(stmt!=null){try{stmt.close();}catch(SQLExceptionex){logger.warn(ExceptioninclosingJDBCStatement,ex);}}if(conn!=null){try{conn.close();}catch(SQLExceptionex){logger.warn(ExceptioninclosingJDBCConnection,ex);}}}类似上面的代码非常常见。主要的问题体现在下面几点:为了执行一个SQL语句,我们必须编写这么多行的代码,而其中很多行的代码与应用逻辑并无关因为,我们必须自己获得Connection与Statement对象、执行SQL、捕捉异常、关闭相关的资源),并且,这样的代码还会在系统其他地方(也许是每个需要数据库访问的地方)重复出现。对于重复性的劳动,我们应该使其自动化如何使其自动化呢?我们应该知道,在一般的JDBC查询功能实现中除了SQL语句的不同以及记录集的处理不同以外,大部分的查询代码都没有太大的差别,所以我们的目标就是抽取共同的部分,而把特定的部分留给开发人员自己。于是,大家开始寻找一些设计模式以改进如此的设计,Template模式的应用是其中一种典型的改进方案。(3)利用Spring中的JdbcTemplate类来进行数据库访问Spring的JDBC封装,很大一部分就是借助Template模式实现,它提供了一个优秀的JDBC模板库,借助这个工具,我们可以简单有效的对传统的JDBC编码方式加以改进。下面是借助SpringJDBCTemplate修改过的代码,这段代码完成了与上面代码相同的功能。JdbcTemplatejdbcTemplate=newJdbcTemplate(dataSource);jdbcTemplate.update(UPDATEuserSETage=10WHEREid='erica');可以看到,两行代码完成了上面需要多行代码实现的功能。所有冗余的代码都通过合理的抽象汇集到了JdbcTemplate中。(4)两者的主要不同点Spring提供了一个JDBC抽象框架,我们可以利用它。直接使用JDBC和使用Spring的JDBC框架之间最大的区别是:我们不必关心数据库连接的打开和关闭、或者其它的任何语句,Spring的框架会帮我们进行这些处理另一个好处是我们不用捕获任何异常除非我们需要。Spring会把所有SQLException包装在从DataAccessException中继承的不检测的异常层次中。当然,如果需要,我们也可以捕获这个异常,但由于大多数数据库异常是无法恢复的,所以我们可能就会让异常传到更高的层次中去。4、Spring中的DAO组件的技术体现:对JDBC抽象和数据存储异常分层Spring用两种方法来解决常规的JDBC的访问代码中所出现的问题,在实践中,我们发现所有这些都确实有助于生产力的提高和更少的bug。我们常常厌恶编写JDBC代码;现在我们能够集中精力于所要执行的SQL,而不是烦杂的JDBC资源管理。(1)提供相应的API把冗长乏味和容易出错的异常处理从程序代码移到框架之中。框架处理所有的异常处理;程序代码能够集中精力于编写恰当的SQL和提取结果上。Spring所提供的JDBC抽象框架由四个不同的包组成:核心包:包含JdbcTemplate,这个类是一个基础类之一,并由Spring框架的JDBC支持提供并使用。数据源包:它是实现单元测试数据库存取代码的重要的一部分,其中的DriverManagerDataSource能够以一种类似于我们已经习惯于JDBC中的用法-----只要创建一个新的DriverManagerDataSource并且调用setter方法来设置DriverClassName,Url,Username和Password。对象包:其中所包含的各个类,用于描述RDBMS查询、更改和存储过程为线程安全的、可重用的对象。支持包:我们可以从这里找到SQLException翻译功能和一些工具类。(2)为我们所要处理SQLException程序代码提供有意义的异常层次当Spring第一次从数据源取得一个连接时它检查元数据以确定数据库。它使用这些信息把SQLException映射为自己从org.springframework.dao.DataAccessException派生下来的类层次中正确的异常。因而我们的代码可以与有意义的异常打交道,并且不需要为私有的SQLState或者错误码担心------把冗长并且易出错误的异常处理从应用程序代码移到由框架来实现。框架负责所有的异常处理;应用程序代码则能够专注于使用适当的SQL提取结果。Spring提供了一个重要的异常类层次,以便于我们的应用程序代码中可以使用恰当的SQLException子类。借助于一个抽象异常层,我们成功地实现了数据库独立性而不必改变异常处理。例如,如果我们把我们的数据库从PostgreSQL改变为Oracle,那么我们不必把异常处理从OracleDataException改变到PostgresDataException-----Spring能够捕获应用程序服务器特定的异常并抛出一个Spring数据异常。我们的DAO不必绑定到JDBC当处理异常时,Spring检查来自一个数据库连接的元数据可用性以决定数据库产品。它使用这种知识来把SQLException映射到其自己异常层次中的具体的异常上。因此,我们不需要担心专门性的SQL状态或错误代码问题;Spring的数据存取异常不是JDBC特定的,因此我们的DAO不必绑定到JDBC(由于其可能抛出的异常)。Spring的数据访问异常不是JDBC特有的,因而我们的DAO并不一定会因为它们可能抛出的异常而绑死在JDBC上。5、Spring提供了两层次的JDBCAPI(1)首先体现在org.springframework.jdbc.core包中使用回调机制移动控制权——并且因而把错误处理和连接获取和释放——从程序的代码移到了框架之中。这是一种不同的InversionofControl,但是和用于配置管理的几乎有同等重要的意义。Spring使用类似的回调机制关注其他包含特殊获取和清理资源步骤的API,例如JDO(获取和释放是由PersistenceManager完成的),事务管理(使用JTA)和JNDI。Spring中完成这些回调的类被称作template。例如,Spring的JdbcTemplate对象能够用于执行SQL查询并且在如下的列表中保存结果:JdbcTemplatetemplate=newJdbcTemplate(dataSource);finalListnames=newLinkedList();template.query(SELECTUSER.NAMEFROMUSER,newRowCallbackHandler(){publicvoidprocessRow(ResultSetrs)throwsSQLException{names.add(rs.getString(1));}});注意回调中的程序代码是能够自由抛出SQLException的:Spring将会捕捉到这些异常并且用自己的类层次重新抛出。程序的开发者可以选择哪个异常,如果有的话,被捕捉然后处理。JdbcTemplate提供许多支持不同情景包括preparedstatements和批量更新的方法。Spring的JDBC抽象有比起标准JDBC来说性能损失非常小,甚至在当应用中需要的结果集数量很大的时候。(2)其次是org.springframework.jdbc.object包中是对JDBC的更高层次的抽象这是建立在核心的JDBC回调功能基础之上的,但是提供了一个能够对RDBMS操作——无论是查询,更新或者是存储过程的更通用的数据访问——使用Java对象来建模的API。MappingSqlQuery类一个用于返回User对象的查询对象的示例代码:classUserQueryextendsMappingSqlQuery{publicUserQuery(DataSourcedatasource){super(datasource,SELECT*FROMPUB_USER_ADDRESSWHEREUSER_ID=?);declareParameter(newSqlParameter(Types.NUMERIC));compile();}//MaparesultsetrowtoaJavaobject(下面的mapRow方法是重写的)protectedObjectmapRow(ResultSetrs,intrownum)throwsSQLException{Useruser=newUser();user.setId(rs.getLong(USER_ID));user.setForename(rs.getString(FORENAME));returnuser;}publicUserfindUser(longid){//Usesuperclassconveniencemethodtoprovidestrongtypingreturn(User)findObject(id);}}6、JdbcTemplate类的编程和应用(1)org.springframework.jdbc.core.JdbcTemplate类(2)主要的作用这是在JDBC核心包中最重要的类,它

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功