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

JDBCTemplate 数据读取机制

阅读更多

文章来源: http://publishblog.blogdriver.com/blog/tb.b?diaryID=1182919

 

JDBCTemplate 数据读取机制

JDBCTemplate 数据读取

一般的读取数据的步骤可以用下图表示:

查看更多精彩图片

 

l 确定需要读取的数据:这一步应该是我们程序员关心的重点。他是我们程序的原始需求。

l 通知数据库我们的需求:

在直接使用 JDBC 程序这一步主要是分成如下几步来完成的。

先注册一个驱动(驱动由不同的厂商或组织实现。对不同的数据库服务器有不同的实现)

典型的注册方法:

Class.forName("my.sql.Driver");

然后通过 DriverManager 来创建一个数据库连接。

接着我们的程序就通过这个数据库连接和数据库服务器交互。我们发送查询请求只是各种交互的一种。而我们的请求的内容是根据我们的需求而确定的(其实就是 Sql 语句需要查询的内容了)。

这部分的工作可分为三部分:

  和数据库服务器建立连接。

  根据需求组织请求内容(确定查询语句)。

  通过连接向数据库服务器发送请求。

在以上的三步中其中第一步和第三步是约定好的。在 JDBC 程序中的典型实现方式为

//第一步

Class.forName("my.sql.Driver");

conn = DriverManager.getConnection(dbUrl);

// 第二步

sql = GenerateSql();

// 第三步

stmt = this.conn.createStatement();

rs = stmt.executeQuery(sql);

在这里我们应该把更多的注意点关注到第二步。

l 等待的过程我们就无能为力。这个牵涉到的东西很多包括网络,驱动的实现以及数据库服务器的性能。

l 组织数据。这应该是我们实现取数据目的的前骤。把关系型数据组织成我们方便使用的类型。如实体对象等。(其实这部分的工作可以用其他的 O/R mapping 框架来实现,但是这个不是今天想讨论的问题)这一部分复杂多样。只能由我们自己来实现。

l 通知数据库服务器请求结束。这一部分的工作应包括清理一些数据库资源,如数据库连接等。虽然很繁琐但是很重要,如果不做的话很有可能造成资源泄漏,在严重的情况下可能引发 OutofMenory 错误,导致系统瘫痪。很多时候我们会忘掉这个步骤。这个部分最好由工具完成。

l 使用是我们目标的一个实现。不多提了。

从上面的分析可以看出有两部分有很大的灵活性。

1. 向数据库服务器发送请求的请求组织部分。说白了也就 sql 语句的写法。

2. 组织数据部分。数据库读出来后把数据组织成我们所需要的格式。

做为一个 Template JDBCTemplate 为我们做好了通用的动作,及除了上述两点外的说有动作。并为上述两点提供了灵活方便的接口。

核心的接口有两个 : PreparedStatementCreator RowCallBackHandler

l PreparedStatementCreator

该接口只有一个方法需要实现。 PreparedStatement createPreparedStatement(Connection con) throws SQLException; 定制我们自己的查询条件。

下面的英文节选自 Expert One ? on ? One J2EE Design and Development 中的描述。

关于这本书和 Spring 框架的关系可以这么理解书是框架的最好说明。或者说框架是书的附带源码。

The PreparedStatementCreator interface must be implemented by application-specific classes to create a java.sql.PreparedStatement , given a java.sql.Connection . This means specifying the SQL and setting bind parameters for an application-specific query or update, which will be run by the JdbcTemplate class. Note that an implementation of this interface doesn't need to worry about obtaining a connection or catching any SQLExceptions that may result from its work. The PreparedStatement it creates will be executed by the JdbcTemplate class. The interface is as follows:

   public interface PreparedStatementCreator {  

     PreparedStatement createPreparedStatement (Connection conn)

       throws SQLException;

   }

The following shows a typical implementation, which uses standard JDBC methods to construct a PreparedStatement with the desired SQL and set bind variable values. Like many implementations of such simple interfaces, this is an anonymous inner class:

   PreparedStatementCreator psc = new PreparedStatementCreator( ) {

 

     public PreparedStatement createPreparedStatement (Connection conn)

         throws SQLException {

       PreparedStatement ps = conn. prepareStatement (

         "SELECT seat_id AS id FROM available_seats WHERE " +

         "performance_id = ? AND price_band_id = ? ");

       ps.setInt( 1, performanceId);

       ps.setInt( 2, seatType);

       return ps;

     }

   };

The PreparedStatementCreatorFactory class is a generic helper that can be used repeatedly to create PreparedStatementCreator objects with different parameter values, based on the same SQL statement and bind variable declarations. This class is largely used by the higher-level, object-abstraction framework described below; application code will normally define PreparedStatementCreator classes as shown above.

 

 

 

 

l          RowCallbackHandler

The RowCallbackHandler interface must be implemented by application-specific classes to extract column values from each row of the ResultSet returned by a query. The JdbcTemplate class handles iteration over the ResultSet . The implementation of this interface may also leave SQLExceptions uncaught: the JdbcTemplate will handle them. The interface is as follows:

   public interface RowCallbackHandler {

     void processRow(ResultSet rs) throws SQLException;

   }

Implementations should know the number of columns and data types to expect in the ResultSet . The following shows a typical implementation, which extracts an int value from each row and adds it to a list defined in the enclosing method:

 

   RowCallbackHandler rch = new RowCallbackHandler() {

     public void processRow(ResultSet rs) throws SQLException {

       int seatId = rs.getInt(1) ;

       list.add(new Integer (seatId) );

     }

   };

The RowCountCallbackHandler class is a convenient framework implementation of this interface that stores metadata about column names and types and counts the rows in the ResultSet . Although it's a concrete class, its main use is as a superclass of application-specific classes.

The ResultReader interface extends RowCallbackHandler to save the retrieved results in a java.util.List :

   public interface ResultReader extends RowCallbackHandler {

     List getResults() ;

   }

The conversion of each row of the ResultSet to an object is likely to vary widely between implementations, so there is no standard implementation of this interface.

到这儿 JDBCTemplate 其实已经建立起了个很完毕的数据库读取机制。下面我们将 JDBCTemplate 是如何实现数据库的读取。我们就来看看如何使用 JDBCTemplate 来实现数据库的查询。

RowCallBackHandler 的使用

public class BookDaoJdbc extends com.jet.springtest.dao.AbstractDaoJdbc   {

public List readAllBook() {

      

              String sql = "SELECT id,name,publisher,isbn FROM spring.book ";

              getJdbcTemplate().query(sql, new RowCallbackHandler (){

                     public void processRow(ResultSet rs) throws SQLException {

                            Book currentBook = new Book();

                            currentBook.setFBookName(rs.getString("name"));

                            currentBook.setFPublisher(rs.getString("publisher"));

                            currentBook.setFIsbn(rs.getString("isbn"));

                            currentBook.setFId(new Integer(rs.getInt("id")));

                            fBooks.add(currentBook);

                     }

              });

}

              return fBooks;

 

 

 

 

}

注意看一下 new RowCallbackHandler() 部分。这部分其实是我们实现了一个 RowCallbackHandler 接口的匿名类。我们必须实现一个 processRow(ResultSet rs) 的方法供 JDBCTemplate 回调。跟踪一下可以发现有如下的调用路径。

 

 

 

说明:这里有两个很有用的技巧。

1   使用接口实现回调的功能。

2   内部类的实用。

问题你一定想问一下我们如何得到数据库连接,打开并关闭呢?这所有的动作都是由 Template execute 中帮我们完成的。通过下面的代码得到证实。

 

我们可以清晰地看到 Template 帮我们做的一切,不用再担心 Connection 没有关闭而导致系统垮掉的可能。

PreparedStatementCreator 的使用

在上面的例子中我们已经看到 RowCallBackHandler 的作用是在数据组织这一块。 PreparedStatementCreator 的作用就是为了“向数据库服务器发送请求的请求组织部分”而服务的了。

 

这里只是简单的演示和解释了一下 JDBCTemplate 中的数据读取的机制。他还提供很多其它的查询和更新的接口。简单的说 JDBCTemplate 可以让你只关注你需要关注的地方。

分享到:
评论

相关推荐

    java基于jdbctemplate数据持久层操作封装

    - 在MySQL环境中,JdbcTemplate可以轻松执行各种SQL操作,如CRUD(创建、读取、更新、删除),同时兼容MySQL特有的语法和特性。 5. **封装实践**: - 开发中,通常会基于JdbcTemplate创建一个DAO(Data Access ...

    jdbctemplatedemo.zip

    对于数据导入,项目可能会包含读取文件(例如CSV或XML)中的数据,然后使用JdbcTemplate批量插入到MySQL数据库。这通常涉及解析文件,创建数据行的列表,然后使用`batchUpdate`方法将这些行作为批处理语句执行。...

    spring-jdbcTemplate实例工程

    4. **适用场景**:适用于简单到中等复杂的数据库操作,如CRUD(创建、读取、更新、删除)操作,但不适合高度复杂的SQL逻辑。 总的来说,Spring JdbcTemplate是Spring框架中处理数据库操作的重要工具,它通过简化...

    Spring JdbcTemplate api

    #### 数据读取与结果处理 使用`JdbcTemplate`读取数据时,可以通过`query`方法结合`RowCallbackHandler`或自定义的`RowMapper`来处理结果集。`RowMapper`接口用于将结果集中的每一行映射为一个对象,通过`...

    lucene+jdbcTemplate封装API+缓存实现索引精确刷新

    在本案例中,开发者可能使用了如Redis或 Ehcache等内存缓存技术,先将数据库查询结果存储在缓存中,然后在索引更新时,先从缓存读取数据,而不是直接从数据库读取。这样既提高了效率,也降低了对数据库的压力。 当...

    Spring JdbcTemplate

    这样,整个应用就可以通过Spring的依赖注入机制来获取并使用JdbcTemplate实例。 例如,一个简单的`applicationContext.xml`配置片段可能如下: ```xml <bean id="jdbcTemplate" class="org.spring...

    springmvc+jdbctemplate+mysql(采用注解方式)

    在SpringMVC和JdbcTemplate的集成中,MySQL作为后端存储数据的地方。通过JDBC驱动,应用程序可以与MySQL交互,执行CRUD(创建、读取、更新、删除)操作。配置数据库连接通常涉及设置URL、用户名、密码等信息。 **...

    图书管理系统( Spring+Spring MVC+JdbcTemplate).rar

    在图书管理系统中,JdbcTemplate被用来处理与数据库的 CRUD(创建、读取、更新、删除)操作,如添加新图书、查询图书信息、更新读者信息等。通过预编译的SQL语句和参数绑定,JdbcTemplate可以有效地防止SQL注入攻击...

    mysql驱动+druid连接池+JdbcTemplate

    它实现了Java Database Connectivity (JDBC) API,允许Java程序通过SQL语句来读取、更新和管理数据库。在Java中,通常使用`com.mysql.jdbc.Driver`类来注册驱动并建立与MySQL服务器的连接。确保正确配置数据库URL、...

    如何避免JDBC引起的内存溢出情况

    Oracle提供了类似的机制,但在默认情况下并不开启游标模式。可以通过设置`oracle.jdbc.fetchDirection=oracle.jdbc.OracleFetchDirection.FETCH_FORWARD`来控制游标的读取方向,并通过`oracle.jdbc.fetchSize`属性来...

    使用Spring进行数据访问

    首先,Spring框架提供了多种数据访问机制,如JDBC(Java Database Connectivity)、ORM(Object-Relational Mapping)框架集成,例如Hibernate和MyBatis,以及对JPA(Java Persistence API)的支持。这些工具使得...

    oracle数据同步

    项目可能利用了Spring的JdbcTemplate或JPA(Java Persistence API)进行数据库交互,实现对Oracle数据库的CRUD(创建、读取、更新、删除)操作。同时,Spring的TaskExecution和TaskScheduling模块可以用来定时执行...

    spring mvc学习+数据分页+数据导入导出

    同样,用户也可以上传Excel文件,应用通过POI读取数据并将其保存到数据库中。 在Spring MVC 3中,数据绑定和验证也是重要的知识点。`@ModelAttribute` 注解用于将请求参数绑定到控制器方法的参数上,而`@Valid` ...

    小码农的代码(三)----------SpringJDBC多数据源应用

    在实际项目中,我们可能需要连接到多个数据库,例如,主数据库用于处理关键业务,而从数据库用于读取历史数据。Spring支持通过`AbstractRoutingDataSource`来实现动态数据源切换。这个抽象类根据一定的规则(如线程...

    spring详解3

    幻读是指一个事务读取了一段时间的数据后,其他事务插入了新数据,导致原事务再次读取时看到“幻影”。 **2.3 Spring事务管理支持** - **编程式事务管理**:通过在代码中显式调用事务管理API,开发者可以精确控制...

    Spring框架的Excel导入导出

    例如,你可以创建一个Service,定义方法来读取Excel数据并将其映射为Java对象,然后将这些对象存储到数据库中。 2. **Excel导入到数据库** 在Spring中,导入Excel数据通常涉及以下步骤: - 使用Apache POI解析...

    spring jdbc

    同时,`JdbcTemplate`的异常处理机制将JDBC的底层异常转换为更易理解和处理的Spring异常。 总结来说,Spring JDBC通过提供一个高层次的抽象,使开发者可以更加专注于业务逻辑,而不是数据库交互的细节。通过配置`...

    Spring-JDBC:Spring with JDBC 操作在MVC中使用JDBCTemplate CRUD应用

    通过这种方式,Spring MVC结合JDBCTemplate提供了一种强大且灵活的机制,使得数据库操作变得简单而高效。它允许开发者以声明式的方式管理数据库交互,同时提供了事务管理和错误处理的便利,降低了出错的可能性。在...

    对费用的管理,通过spring+springMVC+JdbcTemplatel,AdminLTE实现

    用户管理的CRUD(创建、读取、更新、删除)操作是系统后台管理的基础,这些功能可能通过Controller层调用Service层的方法,进一步由JdbcTemplate与数据库交互完成。 “对费用的查询功能”意味着系统有检索费用信息...

Global site tag (gtag.js) - Google Analytics