在Eclipse 中创建Spring的MVC Web应用+UserLogin+DAOWord文档格式.docx
- 文档编号:16447719
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:41
- 大小:597.06KB
在Eclipse 中创建Spring的MVC Web应用+UserLogin+DAOWord文档格式.docx
《在Eclipse 中创建Spring的MVC Web应用+UserLogin+DAOWord文档格式.docx》由会员分享,可在线阅读,更多相关《在Eclipse 中创建Spring的MVC Web应用+UserLogin+DAOWord文档格式.docx(41页珍藏版)》请在冰豆网上搜索。
——要去检查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)
stmt.close();
catch(SQLExceptionex)
logger.warn("
ExceptioninclosingJDBCStatement"
ex);
if(conn!
conn.close();
ExceptioninclosingJDBCConnection"
类似上面的代码非常常见。
主要的问题体现在下面几点:
●为了执行一个SQL语句,我们必须编写这么多行的代码,而其中很多行的代码与应用逻辑并无关
因为,我们必须自己获得Connection与Statement对象、执行SQL、捕捉异常、关闭相关的资源),并且,这样的代码还会在系统其他地方(也许是每个需要数据库访问的地方)重复出现。
●对于重复性的劳动,我们应该使其自动化
如何使其自动化呢?
我们应该知道,在一般的JDBC查询功能实现中除了SQL语句的不同以及记录集的处理不同以外,大部分的查询代码都没有太大的差别,所以我们的目标就是抽取共同的部分,而把特定的部分留给开发人员自己。
于是,大家开始寻找一些设计模式以改进如此的设计,Template模式的应用是其中一种典型的改进方案。
(3)利用Spring中的JdbcTemplate类来进行数据库访问
Spring的JDBC封装,很大一部分就是借助Template模式实现,它提供了一个优秀的JDBC模板库,借助这个工具,我们可以简单有效的对传统的JDBC编码方式加以改进。
下面是借助SpringJDBCTemplate修改过的代码,这段代码完成了与上面代码相同的功能。
JdbcTemplatejdbcTemplate=newJdbcTemplate(dataSource);
jdbcTemplate.update("
UPDATEuserSETage=10WHEREid='
可以看到,两行代码完成了上面需要多行代码实现的功能。
所有冗余的代码都通过合理的抽象汇集到了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)
//Usesuperclassconveniencemethodtoprovidestrongtyping
return(User)findObject(id);
}
6、JdbcTemplate类的编程和应用
(1)org.springframework.jdbc.core.JdbcTemplate类
(2)主要的作用
这是在JDBC核心包中最重要的类,它简化了JDBC的使用,因为它处理了资源的建立和释放。
它帮助我们避免一些常见的错误,比如忘记关闭数据库连接等。
它运行核心的JDBC工作流,如Statement的建立和执行,而只需要应用程序代码提供SQL和提取结果,这个类执行SQL检询、更新或者调用存储过程。
模拟结果集的迭代以及提取返回参数值。
它还捕获JDBC的异常并将它们转换成org.springframework.jdbc.core包中定义的通用的、能够提取更多信息的异常系统。
另外,在实际开发中,可以将代码中硬编码的SQL语句作为Bean的一个String类型属性,借助DI机制在配置文件中定义,从而实现SQL的参数化配置。
(3)JdbcTemplate类可以脱离SpringIoC容器来使用(如应用在J2SE应用系统中)
●只需要单独使用spring-dao.jar中的类
Spring的Jdbc封装等功能基本上可以独立于Spring来使用,因为JdbcTemplate类所需要的就是一个DataSource对象(可以通过org.springframework.jdbc.datasource.DriverManagerDataSource类获得),在不使用SpringIoC容器下,我们只需要单独使用spring-dao.jar中的类。
JDBC封装类库可以脱离SpringContext独立使用,也就是说,即使系统并没有采用Spring作为结构性框架,我们也可以单独使用Spring的JDBC部分(spring-dao.jar)来改善我们的代码。
除了JdbcTemplate类之外,Spring还提供了其它的Template类,如对Hibernate、JDO、ibatis等的Template实现。
●DriverManagerDataSource类
DriverManagerDataSource和传统的JDBC访问方式一样地获得JDBC数据库连接,为了能够进行数据库的连接,我们需要指定JDBC驱动程序的类名称、以及其它的与数据库相关的特征信息。
●示例代码
DriverManagerDataSourcedataSource=newDriverManagerDataSource();
dataSource.setDriverClassName(“XXXX”);
dataSource.setUrl((“XXXX”);
dataSource.setUsername(“XXXX”);
dataSource.setPassword(“XXXX”);
JdbcTemplatejdbcTemplate=newJdbcTemplate(dataSource);
7、为JdbcTemplate提供一个DataSource的配置项目
(1)完成对DataSource的依赖和注入
为了能够使用JdbcTemplate类,我们需要为它提供一个DataSource对象,除了可以采用前面的方法直接在代码中以编程的方式来实现以外,我们还可以在Bean的定义配置文件中完成对DataSource的依赖和注入。
这样,只需要将DataSource对象作为我们的DAO类的一个属性,直接注入就可以。
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
!
DOCTYPEbeansPUBLIC"
-//SPRING/DTDBEAN/EN"
"
http:
//www.springframework.org/dtd/spring-beans.dtd"
beans>
<
beanid="
dataSource"
class="
org.springframework.jdbc.datasource.DriverManagerDataSource"
propertyname="
driverClassName"
value>
com.mysql.jdbc.Driver<
/value>
/property>
url"
jdbc:
mysql:
//localhost:
3306/TestDB<
username"
caterpillar<
password"
123456<
/bean>
userDAO"
example.UserDAO"
<
refbean="
/>
/beans>
可以在DAO组件UserDAO中
(2)也可以采用apachedhcp组件提供的DataSource实现
如果要采用apachedhcp组件提供的DataSource实现,则为其配置JDBC驱动、数据库URL、用户名和密码等参数的配置内容应该如下:
mons.dbcp.BasicDataSource"
destroy-method="
close"
com.microsoft.jdbc.sqlserver.SQLServerDriver<
microsoft:
sqlserver:
1433;
DatabaseName=NetBookDB<
sa<
1234<
同时,在WEB-INF/lib目录下,应该包含有apachedhcp组件的DataSource实现类的*.jar文件commons-dbcp.jar、commons-dbcp-1.2.1.jar和commons-collections.jar。
8、org.springframework.jdbc.datasource.DriverManagerDataSource类
(1)继承关系
(2)在应用时所应该注意的问题
DriverManagerDataSource类并没有真正地实现数据库连接池的功能,而是每次调用请求时都产生物理连接。
因此,它一般只适用于测试,并且是独立于J2EE容器的。
9、直接将JdbcTemplate对象作为我们的DAO类的属性
Spring的JdbcTemplate一如其名称所示的,主要是借助于TemplateMethod模式赖实现对JDBC操作的封装。
因此,我们也可以直接将JdbcTemplate在bean定义配置文件中生成,当作为一个bean来注入到我们的DAO中。
(1)DAO的示例代码---该代码与数据库无关
packageexample;
importjavax.sql.DataSource;
importjava.sql.*;
importorg.springframework.jdbc.core.JdbcTemplate;
publicclassUserDAO
privateJdbcTemplatejdbcTemplate;
publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate)
this.jdbcTemplate=jdbcTemplate;
}
publicvoidinsertUser(Useruser)
jdbcTemplate.update("
INSERTINTOUSERVALUES('
+user.getId()+"
'
'
+user.getName()+"
+user.getSex()+"
+user.getAge()+"
)"
publicUserqueryUser(Stringid)
....
(2)bean定义配置文件示例
jdbcTemplate"
c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 在Eclipse 中创建Spring的MVC Web应用+UserLogin+DAO Eclipse 创建 Spring MVC Web 应用 UserLogin DAO
链接地址:https://www.bdocx.com/doc/16447719.html