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());
}
…
}
分享到:
相关推荐
在 Spring 中使用 JDBC 模板可以简化数据库操作,减少代码冗余,提高开发效率。使用 JDBC 模板可以使开发者专注于业务逻辑的实现,而不需要考虑底层的数据库操作。 二、JDBC 模板的种类 Spring 提供了三种 JDBC ...
Spring JDBC的`JdbcTemplate`和`NamedParameterJdbcTemplate`类使用了模板方法设计模式,将常见的JDBC操作封装成模板方法,如执行SQL查询、更新等。这降低了代码复杂性,避免了资源泄露,并且提供了异常处理机制。 ...
Spring JDBC是Spring框架的一部分,它提供了一种抽象层,使得我们能够更方便地使用Java数据库连接(JDBC)技术。...正确理解和使用Spring JDBC,可以让我们在开发过程中更加专注于业务逻辑,而不是繁琐的数据库操作。
总之,Spring Framework的JDBC支持为数据库操作提供了强大而灵活的工具,通过其简洁的API和丰富的功能,大大提升了开发效率和代码质量。理解和掌握这些知识点,对于任何使用Spring进行数据库操作的开发者来说都至关...
在Spring框架中,JDBC模板(JdbcTemplate)是Spring对Java数据库连接(JDBC)API的一个强大封装,它简化了数据库操作,使开发者能够更专注于业务逻辑而不是底层的数据库交互细节。今天我们将深入探讨Spring的JDBC...
1. **自动配置**: Spring Boot通过自动配置,可以快速设置数据源和JDBC模板。 2. **Repository接口**: 开发者只需定义Repository接口,Spring会自动提供实现,无需编写繁琐的DAO层代码。 3. **ORM支持**: 尽管不如...
在本资源中,我们主要探讨的是Spring JDBC模块,它简化了Java Database Connectivity (JDBC)的使用,使得在Spring应用程序中进行数据库交互变得更加简单和易于管理。下面将详细阐述Spring JDBC的关键概念、核心组件...
本实例将深入解析如何使用Spring JDBC Template进行数据库操作,并包含详细的测试用例。 首先,我们需要在项目中引入Spring JDBC的相关依赖。在Maven工程中,可以在pom.xml文件中添加如下依赖: ```xml ...
在本篇博文中,我们将深入探讨Spring框架中的一个重要组件——JDBC模板(JdbcTemplate),它为简化Java数据库连接(JDBC)操作提供了便利。通过使用JdbcTemplate,开发者可以避免大量重复且易出错的JDBC代码,从而...
2. **模板模式**:Spring JDBC提供了`JdbcTemplate`类,这是一个用于执行数据库操作的模板类。它简化了错误处理和资源释放的代码,使得开发者能够更加专注于业务逻辑的实现。 3. **自动注入与便利获取**:Spring还...
在这个"spring连接数据库实例"中,我们将深入探讨Spring如何帮助开发者便捷地管理和操作数据库。 首先,让我们来了解Spring中的`DataSource`。`DataSource`是Java中用于存储和管理数据库连接的接口,它位于JDBC API...
在Spring JDBC模板中,`JdbcTemplate`类是最常用的一个,它包含了一系列用于执行SQL查询、更新、调用存储过程的方法。比如,你可以使用`queryForList`来获取查询结果的列表,`update`来执行插入、更新或删除操作。...
这个"Spring_jdbc模板相关jar包"包含了Spring框架中用于与关系型数据库交互的核心库,使得开发者无需直接使用JDBC API,而是通过更高级、更抽象的API来完成数据访问。 首先,Spring JDBC模块包含了一个名为`...
当我们谈论"Spring+JDBC实例"时,通常是指在Spring框架中使用JDBC进行数据访问的方式,这种方式可以利用Spring提供的便利性,同时保留对数据库的直接控制。 在Spring框架中,JDBC操作被封装在`org.springframework....
在本项目中,我们主要利用Spring框架,包括其核心模块Spring、MVC模块Spring MVC以及数据访问/集成模块Spring JDBC,结合MySQL数据库来构建一个基础的登录注册系统。以下是这个项目涉及的关键技术点: 1. **Spring...
本文将深入探讨Spring对JDBC(Java Database Connectivity)的支持,以及如何在实际项目中使用这些功能。 首先,Spring JDBC的核心是`org.springframework.jdbc`包,它提供了一套高级抽象,用于简化数据库操作。在...
Spring JDBC是Spring框架的一部分,它提供了一个更高级别的JDBC抽象层,简化了数据库操作。通过使用Template类(如JdbcTemplate或NamedParameterJdbcTemplate),我们可以避免编写大量的样板代码,比如手动打开和...
3. 集成SpringJDBC:配置数据源,创建JdbcTemplate实例,然后在Service层中使用它进行数据库操作。 4. 连接数据库:设置数据库连接参数,如URL、用户名和密码,以及驱动类。 5. 编写Controller:定义处理HTTP请求...
在项目中使用"spring-jdbc jar包",开发者需要配置DataSource,并根据需求选择使用JdbcTemplate或其他辅助类。在编写SQL时,可以使用预编译的PreparedStatement来防止SQL注入攻击。此外,还可以利用Spring的AOP...
Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一个高级抽象层,简化了数据库操作。...在实际开发中,利用Spring JDBC能有效提升开发效率,同时减少数据库操作中的潜在错误。