在spring中使用JDBC

来源:互联网 发布:it helpdesk面试题 编辑:程序博客网 时间:2024/05/18 00:52
持久化技术:hibernate、jpa、jdbc,还有古老的jdbc

应对失控的jdbc代码
如果使用JDBC所提供的直接操作数据库的API,尽管粒度更小,但你必须负责管理与数据访问所有的事情。
举例:
.....
try{
conn=dataSource.getConnection();//获得连接
stmt=conn.prepareStatement(SQL_INSERT_SPITTER);//创建语句
stmt.setString(1,spitter.getUserName());//绑定参数
stmt.setString(2,spitter.getUserPassword);
stmt.setString(3,spitter.getFullName());
stmt.execute();//执行语句
}catch(SQLException e){
do something...//处理异常
}
finanlly{//清理资源
try{
if(stmt!=null){stmt.close();}
if(conn!=null){conn.close();}
}catch(SQLException e){
......//
}
这么复杂的代码仅仅是向数据库插入一个简单的对象。这对JDBC操作来说已经是最简单的了。这些大部分是模板代码,但又是十分重要的。而spring的JDBC框架承担了资源管理和异常处理的工作,从而简化了JDBC代码,让我们可以只需编写从数据库读写数据的必需代码。

使用JDBC模板
spring提供了3个模板类供使用
JdbcTemplate
NamedparameterJdbcTemplate 可以将查询值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数
SimpleJdbcTemplate 利用泛型、自动装箱、可变参数列表等Java5的特性简化jdbc模板的使用

使用SimpleJdbcTemplate访问数据源
只需要设置DataSource就能够让SimpleTemplate正常工作。如:
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleTemplate">
<constructor-arg ref="dataSource" />
</bean>
这样就可以把这个模板类装配到任意dao中了。

jdbcTemplate的一个应用示例:
jdbcTemplate.queryForObject(String sql,ParameterizedRowMapper<Object> rowMapper,String id)
第二个用来从ResultSet提取值并构建域对象。
其主要方法是:
public Object mapRow(ResultSet rs,int rowNum){
Object.setUserName(rs.getString(1));
...
}
最后一个为可变参数列表,绑定到要查询的索引参数值。

使用命名参数
sql查询语句的定义可为:String sql="insert into spitter(userName,password,fullName)"+ "values(:userName,:password,:fullName)"
从spring2.5开始,NamedParameterJdbcTemplate的命名参数功能合并到了simpleJdbcTemplate中。我们以此举例:
addSpitter(Spitter spitter){
Map<String,Object> params=new Map<String,Object>();
params.put("userName",spitter.getUserName());//绑定参数
params.put("password",spitter.getPassword());
params.put("fullName",spitter.getFullName());

jdbcTemplate.update(sql,params);//执行数据插入

}
可以看出,这里的代码都关注于向数据库插入Spitter对象。这使得核心代码不会被资源管理或异常处理这样的代码填满。

使用spring的JDBC dao支持类
每一个jdbc的dao类都需要一个SimpleJdbcTemplate,若有非常多dao类,则需要的SimpleJdbcTemplate将非常之多。一种可行的解决方法是为所有dao创建一个通用父类,父类中有SimpleJdbcTemplate属性,子类继承之后就可以使用。spring提供了这样的基类,主要有三种:JdbcDaoSupport、SimpleJdbcDaoSupport、NamedParameterjdbcDaoSupport,对应不同的spring jdbc模板。使用时要继承这些父类。
举个栗子:
public class jdbcspitterdao extends SimpleDaoSupport implememts SpitterDao{
...
}

public void addSpitter(Spitter spitter){
getSimpleTemplate().update(sql,String args);
...
}
在spring装配Dao类时,可以直接将一个SimpleTemplate Bean类装配到它的jdbcTemplate属性中。
<bean id="spitterdao" class="..">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>

也可以直接跳过jdbctemplate直接配置数据源,
<bean id="spitterdao" class="..">
<property name="datasource" ref="datasource" />
</bean>

当spitterdao直接配置DataSource属性,它就会自动在内部创建一个SimpleJdbcTemplate实例。

JDBC是访问关系型数据库的最基本方式。spring的JDBC模板能够把我们从处理样式代码中解救出来,我们只要关心实际的数据查询和更新即可。
0 0
原创粉丝点击