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 template简化jdbc数据库操作实例代码,简化操作,包括详细测试例子。
下面小编就为大家带来一篇Spring的连接数据库以及JDBC模板(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
[课堂课件讲解]Java微服务实践-Spring Boot 数据库JDBC.pptx
使用Spring提供的JdbcTemplate模板类实现对数据库的更新和查询操作、使用JdbcTemplate实现具体的DAO类、使用支持具名参数的JDBC模板类对数据库进行操作
1、主要实现使用spring 模板 提高对数据库的检索速度; 2、jdbc的使用及连接池的使用; 3、提供相应的架包!
使用JDBC模板的Spring MVC CRUD这是一个简单的SPRING MVC项目,其中我使用了Spring MVC,JDBC模板进行数据操作,而在数据库方面,我使用了MYSQL数据库。脚步- 1.创建名称为“ usersdb”的MYSQL数据库2.使用以下命令...
Spring的JDBC模板的使用 1、Spring的JDBC的模板 2、将连接池和模板交给Spring管理 3、使用开源的数据库连接池 4、抽取配置到属性文件 5、使用JDBC的模板完成CRUD的操作
Spring Boot和Spring JDBC模板该项目演示了Spring Boot使用JDBC模板与MySQL数据库进行通信。 博客文章: :
Spring-generator 是基于 javafx8 开发的图形界面 Spring 代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将数据库中的表生成为任意风格的 .java 代码文件(比如经典的三层模型)。 Spring-...
数据库模板 受 Spring JDBC 模板启发的 DB 模板。 MYSQL 池 限制 目前它只适用于 MySQL Pool,我们将添加对 Postgres 的支持。
contentManagerSystem,后台管理系统,采用SpringBoot构建整个项目框架,apacheShiro...修改数据库配置文件jdbc.properties中的账号密码. 配置maven命令:spring-boot:run启动项目,访问链接:http://localhost:8080/login.do
这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 (2) spring-beans.jar 这个jar文件是所有应用都要...
spring中使用注解进行分层,使用spring中的jdbc模板来与数据库进行交互
入门级功能:包括属性(配置),JDBC模板(数据库CRUD),JPA(Hibernate数据库CRUD),Mybatis(数据库CRUD),Mybatis(Mybatis数据库CRUD),thymeleaf(模板解析),beetl(模板解析),freemarker (模板解析)...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3 【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3 【第六章】 AOP 之 6.3 基于...
内容: Spring资源管理 Spring表达式语言 定时调度 AOP切面编程-代理功能的加强 Spring与JMS消息组件 Spring与WebService ...JDBC操作模板 Spring事务管理 SpringDataJPA SpringMVC SpringSecurity
- Spring Boot 数据库操作,包括SpringJDBC、JPA、Mybatis注解版 & XML版、MongoDB。其中,每个版本都有其对应的多数据源解决方案。 - springboot-caches - Spring Boot 缓存,包括redis、ehcache、spring-cache...
Spring-generator是基于javafx8开发的图形界面Spring代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将数据库中的表生成为任意风格的.java代码文件。该工具支持所有实现JDBC规范的数据库;默认...