`
liukai
  • 浏览: 706357 次
  • 性别: 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  
谢谢 学习了

相关推荐

    在Spring中使用JDBC和JDBC模板的讲解

    在 Spring 中使用 JDBC 模板可以简化数据库操作,减少代码冗余,提高开发效率。使用 JDBC 模板可以使开发者专注于业务逻辑的实现,而不需要考虑底层的数据库操作。 二、JDBC 模板的种类 Spring 提供了三种 JDBC ...

    spring连接数据库aop-jdbc

    Spring JDBC的`JdbcTemplate`和`NamedParameterJdbcTemplate`类使用了模板方法设计模式,将常见的JDBC操作封装成模板方法,如执行SQL查询、更新等。这降低了代码复杂性,避免了资源泄露,并且提供了异常处理机制。 ...

    SpringJDBC.rar_jdbc spring_spring jd_spring jdbc_spring使用JDBC进行数

    Spring JDBC是Spring框架的一部分,它提供了一种抽象层,使得我们能够更方便地使用Java数据库连接(JDBC)技术。...正确理解和使用Spring JDBC,可以让我们在开发过程中更加专注于业务逻辑,而不是繁琐的数据库操作。

    Spring Framework 开发参考手册,数据库系统的JDBC驱动程序

    总之,Spring Framework的JDBC支持为数据库操作提供了强大而灵活的工具,通过其简洁的API和丰富的功能,大大提升了开发效率和代码质量。理解和掌握这些知识点,对于任何使用Spring进行数据库操作的开发者来说都至关...

    day39-Spring 18-Spring的JDBC模板:查询的操作

    在Spring框架中,JDBC模板(JdbcTemplate)是Spring对Java数据库连接(JDBC)API的一个强大封装,它简化了数据库操作,使开发者能够更专注于业务逻辑而不是底层的数据库交互细节。今天我们将深入探讨Spring的JDBC...

    Spring Data JDBC与JDBC的区别

    1. **自动配置**: Spring Boot通过自动配置,可以快速设置数据源和JDBC模板。 2. **Repository接口**: 开发者只需定义Repository接口,Spring会自动提供实现,无需编写繁琐的DAO层代码。 3. **ORM支持**: 尽管不如...

    spring中jdbc的操作

    在本资源中,我们主要探讨的是Spring JDBC模块,它简化了Java Database Connectivity (JDBC)的使用,使得在Spring应用程序中进行数据库交互变得更加简单和易于管理。下面将详细阐述Spring JDBC的关键概念、核心组件...

    使用spring jdbc template简化jdbc数据库操作实例代码

    本实例将深入解析如何使用Spring JDBC Template进行数据库操作,并包含详细的测试用例。 首先,我们需要在项目中引入Spring JDBC的相关依赖。在Maven工程中,可以在pom.xml文件中添加如下依赖: ```xml ...

    day39-Spring 17-Spring的JDBC模板:完成增删改的操作

    在本篇博文中,我们将深入探讨Spring框架中的一个重要组件——JDBC模板(JdbcTemplate),它为简化Java数据库连接(JDBC)操作提供了便利。通过使用JdbcTemplate,开发者可以避免大量重复且易出错的JDBC代码,从而...

    spring和数据库层的结合

    2. **模板模式**:Spring JDBC提供了`JdbcTemplate`类,这是一个用于执行数据库操作的模板类。它简化了错误处理和资源释放的代码,使得开发者能够更加专注于业务逻辑的实现。 3. **自动注入与便利获取**:Spring还...

    spring连接数据库实例

    在这个"spring连接数据库实例"中,我们将深入探讨Spring如何帮助开发者便捷地管理和操作数据库。 首先,让我们来了解Spring中的`DataSource`。`DataSource`是Java中用于存储和管理数据库连接的接口,它位于JDBC API...

    Spring_jdbc模板相关jar包(连接文件版本:5.1.47)

    在Spring JDBC模板中,`JdbcTemplate`类是最常用的一个,它包含了一系列用于执行SQL查询、更新、调用存储过程的方法。比如,你可以使用`queryForList`来获取查询结果的列表,`update`来执行插入、更新或删除操作。...

    Spring_jdbc模板相关jar包

    这个"Spring_jdbc模板相关jar包"包含了Spring框架中用于与关系型数据库交互的核心库,使得开发者无需直接使用JDBC API,而是通过更高级、更抽象的API来完成数据访问。 首先,Spring JDBC模块包含了一个名为`...

    Spring+JDBC实例

    当我们谈论"Spring+JDBC实例"时,通常是指在Spring框架中使用JDBC进行数据访问的方式,这种方式可以利用Spring提供的便利性,同时保留对数据库的直接控制。 在Spring框架中,JDBC操作被封装在`org.springframework....

    Spring+Spring MVC+Spring JDBC+MySql实现简单登录注册

    在本项目中,我们主要利用Spring框架,包括其核心模块Spring、MVC模块Spring MVC以及数据访问/集成模块Spring JDBC,结合MySQL数据库来构建一个基础的登录注册系统。以下是这个项目涉及的关键技术点: 1. **Spring...

    spring对jdbc的支持jar包

    本文将深入探讨Spring对JDBC(Java Database Connectivity)的支持,以及如何在实际项目中使用这些功能。 首先,Spring JDBC的核心是`org.springframework.jdbc`包,它提供了一套高级抽象,用于简化数据库操作。在...

    Spring mvc + Spring + Spring jdbc 整合 demo

    Spring JDBC是Spring框架的一部分,它提供了一个更高级别的JDBC抽象层,简化了数据库操作。通过使用Template类(如JdbcTemplate或NamedParameterJdbcTemplate),我们可以避免编写大量的样板代码,比如手动打开和...

    java开发之SpringMVC + Spring + SpringJDBC整合.zip

    3. 集成SpringJDBC:配置数据源,创建JdbcTemplate实例,然后在Service层中使用它进行数据库操作。 4. 连接数据库:设置数据库连接参数,如URL、用户名和密码,以及驱动类。 5. 编写Controller:定义处理HTTP请求...

    spring-jdbc jar包.rar

    在项目中使用"spring-jdbc jar包",开发者需要配置DataSource,并根据需求选择使用JdbcTemplate或其他辅助类。在编写SQL时,可以使用预编译的PreparedStatement来防止SQL注入攻击。此外,还可以利用Spring的AOP...

    spring JDbc

    Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一个高级抽象层,简化了数据库操作。...在实际开发中,利用Spring JDBC能有效提升开发效率,同时减少数据库操作中的潜在错误。

Global site tag (gtag.js) - Google Analytics