`
liukai
  • 浏览: 702051 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring中的数据库操作 使用JDBC模板

阅读更多
Spring提供了3个模板类供选择:

■ JdbcTemplate—The most basic of Spring’s JDBC templates, this class provides

simple access to a database through JDBC and simple indexed-parameter

queries.(按照索引参数传递)

■ NamedParameterJdbcTemplate—This JDBC template class enables you to

perform queries where values are bound to named parameters in SQL,

rather than indexed parameters.(按照名字参数传递)

■ SimpleJdbcTemplate—This version of the JDBC template takes advantage

of Java 5 features such as autoboxing, generics, and variable parameter lists

to simplify how a JDBC template is used.(支持Java5特性)




一、JdbcTemplate使用

首先,需要配置如下信息:

<bean id=”jdbcTemplate” class=”org.springframework.jdbc.core.JdbcTemplate”>

<property name=”dataSource” ref=”dataSource” />

</bean>

其中数据源为上一节配置的内容。




另外,为了能够使用该模板,需要将该类型作为DAO实现类的属性,定义如下形式:

public class JdbcRantDao implements RantDao {

…

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

}




该DAO实现类需要配置如下:
<bean id=”rantDao” class=”com.roadrantz.dao.jdbc.JdbcRantDao”>

<property name=”jdbcTemplate” ref=”jdbcTemplate” />

</bean>


注入模板属性




做好如上配置后,就可以在DAO实现类中使用模板。




(1)添加、删除、修改的实现

例如在DAO实现类中定义一个往数据库中添加数据的方法saveMotorist()。内容如下:

private static final String MOTORIST_INSERT =
”insert into motorist (id, email, password, ” +

“firstName, lastName) values (null, ?,?,?,?)”;

public void saveMotorist(Motorist motorist) {

jdbcTemplate.update(MOTORIST_INSERT,

new Object[] { motorist.getEmail(),motorist.getPassword(),

motorist.getFirstName(), motorist.getLastName() });

}


整个saveMotorist方法只需要一个方法调用,看不见Connection对象、Statement对象的创建和销毁,也没有对异常对捕获和处理。这些代码已经被封装到了模板中!

jdbcTemplate.update方法可以完成添加、修改、删除的操作。其中需要两个参数:

第一个参数:待执行的sql语句(包含问号)。

第二个参数:Object对象数组。该数组中的数据应该已索引的方式对应于待赋值的问号!




(2)查询的实现

在DAO类中定义一个查询方法,如下:
private static final String MOTORIST_SELECT =
”select id, email, password, firstName, lastName from motorist”;

private static final String MOTORIST_BY_ID_SELECT =MOTORIST_SELECT + ” where id=?”;

public Motorist getMotoristById(long id) {

List matches = jdbcTemplate.query(MOTORIST_BY_ID_SELECT,

new Object[] { Long.valueOf(id) },

new RowMapper() {

public Object mapRow(ResultSet rs, int rowNum)throws SQLException, DataAccessException {

Motorist motorist = new Motorist();

motorist.setId(rs.getInt(1));

motorist.setEmail(rs.getString(2));

motorist.setPassword(rs.getString(3));

motorist.setFirstName(rs.getString(4));

motorist.setLastName(rs.getString(5));

return motorist;

}

});

return matches.size() > 0 ? (Motorist) matches.get(0) : null;

}





在做查询的时候,由于需要返回查询结果,所有处理的过程相对复杂些。

这个查询过程其实只调用了一个jdbcTemplate.query方法。该方法返回一个List结果,其中包含了符合条件的数据。另外,jdbcTemplate.query方法需要接收3个参数:

第一个参数:待执行的查询SQL语句(带问号)。

第二个参数:Object数组。该数组中的数据应该已索引的方式对应于待赋值的问号。

第三个参数:以匿名内部类的方式实现的RowMapper类型对象。通过其定义的方法mapRow将结果集内容与Motorist 类型做了映射。




二、NamedParameterJdbcTemplate使用

与JdbcTemplate唯一不同的地方是,在给问号赋值的时候,是按照名字对应的。在使用前需做如下配置:

<bean id=”jdbcTemplate”

class=”org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate”>

<property name=”dataSource” ref=”dataSource” />

</bean>





DAO实现类中需要更改为NamedParameterJdbcTemplate,如下:

public class JdbcRantDao implements RantDao {

…

private NamedParameterJdbcTemplate jdbcTemplate;

public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

}

使用NamedParameterJdbcTemplate的方式定义的saveMotorist()方法如下:
private static final String MOTORIST_INSERT =
”insert into motorist (id, email, password, ” +

“firstName, lastName) values 
(null, :email, :password, :firstName, :lastName)”;


public void saveMotorist(Motorist motorist) {

Map parameters = new HashMap();

parameters.put(”email”, motorist.getEmail());

parameters.put(”password”, motorist.getPassword());

parameters.put(”firstName”, motorist.getFirstName());

parameters.put(”lastName”, motorist.getLastName());

jdbcTemplate.update(MOTORIST_INSERT, parameters);

}



最大的变化在于,sql语句中不使用?来最为参数替代符。而是使用:加变量名的方式作为参数替代符。

然后在通过Map将变量名与实际值绑定起来,传递给update方法。

使用这种方式最大的好处就是,如果参数比较多,并且参数位置或顺序可能变化的情况下,使用NamedParameterJdbcTemplate是非常方便的!



三、SimpleJdbcTemplate使用

SimpleJdbcTemplate加入了Java5的特性支持,例如可变参数、自动拆包封包、泛型等支持。

例如,使用SimpleJdbcTemplate实现的saveMotorist()方法如下:
private static final String MOTORIST_INSERT =
”insert into motorist (id, email, password, ” +

“firstName, lastName) values (null, ?,?,?,?)”;

public void saveMotorist(Motorist motorist) {

jdbcTemplate.update(MOTORIST_INSERT,

motorist.getEmail(), motorist.getPassword(),

motorist.getFirstName(), motorist.getLastName());

}


同样是调用update方法,但是该update方法使用了可变参数,这样就不需要Object数组来进行数据封装,所有需要赋值问号的参数将直接作为update参数传递。同样是按照index顺序的!




对于查询方法其用法如下:
public Motorist getMotoristById(long id) {

List<Motorist> matches = getSimpleJdbcTemplate().query(

MOTORIST_BY_ID_SELECT,

new ParameterizedRowMapper<Motorist>() {

public Motorist mapRow(ResultSet rs, int rowNum)throws SQLException {

Motorist motorist = new Motorist();

motorist.setId(rs.getInt(1));

motorist.setEmail(rs.getString(2));

motorist.setPassword(rs.getString(3));

motorist.setFirstName(rs.getString(4));

motorist.setLastName(rs.getString(5));

return motorist;

}

},

id

);

return matches.size() > 0 ? matches.get(0) : null;

}



这里的query的方法使用与JdbcTemplate中的query方法使用是有区别的。

第一:JdbcTemplate中的query方法使用Object数组来传递参数,而SimpleJdbcTemplate中的query方法使用的是可变参数,因为是可变参数,所以需要将可变参数放在参数列表的最后部分。

第二:使用了自动封包机制传递id数据。

第三:进行结果集与对象映射时,使用了ParameterizedRowMapper类型而不是RowMapper类型,其主要区别就是ParameterizedRowMapper类型支持泛型。







四、使用Spring中的JDBC支持类




通过以上的实现,可以使用各种不同的JDBC模板类进行JDBC访问,但是,如果有很多DAO实现类的定义,我们需要定义很多重复的代码部分,如,我们需要在DAO实现类中定义 JdbcTemplate属性,并且定义其get、set方法。另外,需要将其声明在配置文件中。等等。这些部分是重复的。

spring提供了一种简化的实现方式,它定义了JdbcDaoSupport父类(针对于JdbcTemplate方式的实现),在该类中完成了重复的代码,我们定义的DAO实现类只需要继承它既可,关系如下图:


通过这种实现,DAO实现类的定义可以简化如下:
public class JdbcRantDao extends JdbcDaoSupport implements RantDao {

public void saveMotorist(Motorist motorist) {

getJdbcTemplate().update(MOTORIST_INSERT,

new Object[] { motorist.getEmail(), motorist.getPassword(),

motorist.getFirstName(), motorist.getLastName() });

}

 
 

…

}


中间没有任何JdbcTemplate属性的相关定义。而通过调用getJdbcTemplate()方法获得JdbcTemplate属性。




另外,在配置文件中需要定义如下内容:
<bean id=”rantDao” class=”com.roadrantz.dao.jdbc.JdbcRantDao”>

<property name=”jdbcTemplate” ref=”jdbcTemplate” />

</bean>


从定义中可看出,与不使用支持类是有相同的定义方式。但是如果我们的DAO实现类继承了JdbcDaoSupport 父类。则其配置可以省略掉jdbcTemplate内容的定义,直接做如下配置:
<bean id=”rantDao” class=”com.roadrantz.dao.jdbc.JdbcRantDao”>

<property name=”dataSource” ref=”dataSource” />

</bean>


省略的jdbcTemplate定义和声明过程!




在上面的介绍中,Spring提供了三种不同的模板类,如果我们想使用NamedParameterJdbcTemplate或SimpleJdbcTemplate,则需要继承不同的模板支持类型,分别是:

NamedParameterJdbcDaoSupport与SimpleJdbcDaoSupport。其DAO实现类代码应该类似如下:



public class JdbcRantDao extends NamedParameterJdbcDaoSupport

implements RantDao {

public void saveMotorist(Motorist motorist) {

Map parameters = new HashMap();

parameters.put(”email”, motorist.getEmail());

parameters.put(”password”, motorist.getPassword());

parameters.put(”firstName”, motorist.getFirstName());

parameters.put(”lastName”, motorist.getLastName());

getNamedParameterJdbcTemplate().update(MOTORIST_INSERT, parameters);

}

 
 

…

}








public class JdbcRantDao extends SimpleJdbcDaoSupport

implements RantDao {

public void saveMotorist(Motorist motorist) {

getSimpleJdbcTemplate().update(MOTORIST_INSERT,

motorist.getEmail(), motorist.getPassword(),

motorist.getFirstName(), motorist.getLastName());

}

…

}
分享到:
评论
1 楼 wesker0918 2010-07-08  
谢谢 学习了

相关推荐

Global site tag (gtag.js) - Google Analytics