Spring : 征服数据库(一)
严格的说,这里征服的是关系型数据库;之后笔者会以MongoDB为例,给出非关系型数据库的解决方案,敬请期待。
获取连接,操作,关闭,不知所云的异常...是的,你受够了。在使用纯JDBC时你访问数据库时写的80%的代码是重复的,对此,Spring给的方案是 模板 + 回调。模板就是访问数据库时的固定操作;回调是变化的部分。
针对不同的持久化平台,你可选的模板是不同的;如果使用的是JDBC,可以选择JdbcTemplate,如果使用特定的ORM框架,可以选择HibernateTemplate或SqlMapClientTemplate等。
选择哪个JDBC模板是需要权衡的,因为随着Spring的更新,其API的变化导致选择的考虑不同。比如,在Spring2.5时,NamedParameterJdbcTemplate的功能并入到SimpleJdbcTemplate,我们一般选择SimpleJdbcTemplate;但是Spring 3.1之后,SimpleJdbcTemplate被废弃了,官方的解释是:since
Spring 3.1 in favor of JdbcTemplate
and NamedParameterJdbcTemplate
.
The JdbcTemplate and NamedParameterJdbcTemplate now provide all the functionality of the SimpleJdbcTemplate. 也就是官方推荐我们使用JdbcTemplate和NamedParameterJdbcTemplate了,因为它们有SimpleJdbcTemplate的所有功能了。
关于各种模板的API太多,没什么可说,必要时查API即可。
在程序开发过程时就使用MySql等显得有点臃肿,你想着,“我就像看看这个数据访问是否能成功,还得配置个MySQL,太麻烦了”,确实是。Spring针对此问题给我们提供了嵌入式Java 数据库引擎,并原生支持 HSQL,H2和Derby三种。
我们来看它如果配置数据源的,
<jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:schema.sql"/> <jdbc:script location="classpath:test-data.sql"/> </jdbc:embedded-database>
默认是启用HSQL数据库,你也可以设置type属性来自定义,如
<jdbc:embeded-database id="dataSouce" type="H2" >
下面的两行分别是设置了创建模式的脚本和原始数据的脚本,文件放在类加载路径下,文件名不重要。但要注意顺序,即先有模式后有数据。
当然,要正常使用H2,你需要把H2的驱动Jar放在Build Path下,如果你使用的是Maven,只需添加依赖:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.181</version> </dependency>
使用Spring时,一个头痛的问题是XML配置文件很繁琐,虽然现在可以做到“自动装配和自动检测”,但还是推荐把不同用途的bean分开放置。比如这里的数据源,是数据相关的,可以分开放。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script location="classpath:schema.sql" /> <jdbc:script location="classpath:data.sql" /> </jdbc:embedded-database> </beans>
把上面的文件放在dataSourc-context.xml文件内(在类加载路径,文件名不重要),最后只需在主XML里import进来就可以了。
<import resource="classpath:dataSource-context.xml"/>
主XML就可以使用它来装配模板了,
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg ref="dataSource" /> </bean>
在自定义的Dao里面注入这个jdbcTemplate就可以访问数据库了。
另外,Spring基于模板和回调,提供了 Dao支持类,可以将自己的Dao继承它,所以整个访问数据库的过程如下:
官方对JdbcDaoSupport的说法是:
Convenient super class for JDBC-based data access objects. Requires a DataSource to be set, providings a JdbcTemplate based on it to subclasses through the getJdbcTemplate() method。
是的,它有很多子类,对应不同的模板。
你可以在想,使用它的好处是什么呢?
之前我们每个Dao都得有个JdbcTemplate对象,并有对应的setter方法。如果有很多Dao,重复相同的代码有点不必要。如果继承了JdbcDaoSupport的某一个子类,你可以直接使用 getJdbcTemplate()。
如何使用呢?
1, 让你的Dao继承JdbcDaoSupport的某一个子类
2, 参数注入datasource,(该属性是jdbcDaoSupport的,name是datasoruce)
3, 代码里可以使用getJdbcTemplate()获取模板。
但是,随着代码规模的增大,使用JDBC的方式还是有点难以维护,这时一般选用ORM框架应对这一挑战。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。