MySQL战士database_Spring中的数据库操作 使用JDBC模板

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

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

public class JdbcRantDao implements RantDao {

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

}

该DAO实现类需要配置如下:

注入模板属性

做好如上配置后,就可以在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唯一不同的地方是,在给问号赋值的时候,是按照名字对应的。在使用前需做如下配置:

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

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 matches = getSimpleJdbcTemplate().query(

MOTORIST_BY_ID_SELECT,

new ParameterizedRowMapper() {

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属性。

另外,在配置文件中需要定义如下内容:

从定义中可看出,与不使用支持类是有相同的定义方式。但是如果我们的DAO实现类继承了JdbcDaoSupport 父类。则其配置可以省略掉jdbcTemplate内容的定义,直接做如下配置:

省略的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());

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-04-16 10:33

浏览 5659

评论

1 楼

wesker0918

2010-07-08

谢谢 学习了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值