`

spring jdbc 之一

阅读更多
使用过jdbc的我们都知道spring jdbc ,首先我们看下JdbcTemplate 中的execute
在exceute的实现中看到了数据库进行操作的基本过程,比如需要获得数据库Connection,根据应用对数据库操作需要创建数据库的statement,对数据库操作进行回调,处理数据库异常
  最后把数据库的连接关闭,等等,这里展示了使用JDBC完成数据库操作的完整过程,只是在spring中,对这些较为普通的JDBC使用,JdbcTemplate进行了一个封装而已。
     public void execute(final String sql)
        throws DataAccessException
    {
   
        class _cls1ExecuteStatementCallback
            implements StatementCallback, SqlProvider
        {

            public Object doInStatement(Statement stmt)
                throws SQLException
            {
                stmt.execute(sql);
                return null;
            }

            public String getSql()
            {
                return sql;
            }

            final JdbcTemplate this$0;
            private final String val$sql;

            _cls1ExecuteStatementCallback()
            {
                this$0 = JdbcTemplate.this;
                sql = s;
                super();
            }
        }

        execute(((StatementCallback) (new _cls1ExecuteStatementCallback())));
    }


public Object execute(StatementCallback action)
        throws DataAccessException
    {
        Connection con;
        Statement stmt;
        Assert.notNull(action, "Callback object must not be null");
        con = DataSourceUtils.getConnection(getDataSource());
        stmt = null;
        Object obj;
        try
        {
            Connection conToUse = con;
            if(nativeJdbcExtractor != null && nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements())
                conToUse = nativeJdbcExtractor.getNativeConnection(con);
            stmt = conToUse.createStatement();
            applyStatementSettings(stmt);
            Statement stmtToUse = stmt;
            if(nativeJdbcExtractor != null)
                stmtToUse = nativeJdbcExtractor.getNativeStatement(stmt);
            //通过回调函数等到结果
            Object result = action.doInStatement(stmtToUse);
            handleWarnings(stmt);
            obj = result;
        }
        catch(SQLException ex)
        {
            JdbcUtils.closeStatement(stmt);
            stmt = null;
            DataSourceUtils.releaseConnection(con, getDataSource());
            con = null;
            throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
        }
        JdbcUtils.closeStatement(stmt);
        DataSourceUtils.releaseConnection(con, getDataSource());
        return obj;
        Exception exception;
        exception;
        JdbcUtils.closeStatement(stmt);
        DataSourceUtils.releaseConnection(con, getDataSource());
        throw exception;
    }

jdbc的基本原理其中的execute方法,我们在看下jdbcTemplate中的query方法
    public Object query(PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor rse)
        throws DataAccessException
    {
        return execute(psc, new PreparedStatementCallback() {
            public Object doInPreparedStatement(PreparedStatement ps)
                throws SQLException
            {
                ResultSet rs = null;
                Object obj;
                if(pss != null)
                   pss.setValues(ps);
                rs = ps.executeQuery();
                ResultSet rsToUse = rs;
                if(nativeJdbcExtractor != null)
                    rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
                //采用了接口,进行回调
                obj = rse.extractData(rsToUse);
                JdbcUtils.closeResultSet(rs);
                if(pss instanceof ParameterDisposer)
                    ((ParameterDisposer)pss).cleanupParameters();
                return obj;
                Exception exception;
                exception;
                JdbcUtils.closeResultSet(rs);
                if(pss instanceof ParameterDisposer)
                    ((ParameterDisposer)pss).cleanupParameters();
                throw exception;
            }

            final JdbcTemplate this$0;
            private final PreparedStatementSetter val$pss;
            private final ResultSetExtractor val$rse;

           
            {
                this$0 = JdbcTemplate.this;
                pss = preparedstatementsetter;
                rse = resultsetextractor;
                super();
            }
        }
);
    }

在对ResultSet进行回调处理的接口有三个,分别为RowMapper,ResultSetExtrator,RowHandlerCallBack接口
RowMapper接口中包含了一个mapRow方法,需要自己实现同通过转换从而得到自己想要的结果。
// 对resultset中封装一个接口为rowMapping
         List<VersionInfo> list = jdbcTemplate.query(sql, new
         RowMapper<VersionInfo>()
         {
         @Override
         public VersionInfo mapRow(ResultSet rs, int i) throws SQLException
         {
         VersionInfo versionInfo = new VersionInfo();
         versionInfo.setId(rs.getInt("id"));
         versionInfo.setVersionName(rs.getString("version_name"));
         versionInfo.setUploadTime(rs.getLong("upload_time"));
         versionInfo.setActiveState(rs.getString("active_state"));
         versionInfo.setVersionType(rs.getString("version_type"));
         versionInfo.setFilePath(rs.getString("file_path"));
         versionInfo.setReMark(rs.getString("remark"));
         versionInfo.setVersionNumber(rs.getString("version_number"));
         return versionInfo;
         }
         });



ResultSetExtrator接口中包含了extractData方法,该方法需要自己遍历Resultset才能得到想要的结果
  List<VersionInfo> list = (List<VersionInfo>) jdbcTemplate.query(sql,
         new ResultSetExtractor<List<VersionInfo>>()
         {
         @Override
         public List<VersionInfo> extractData(ResultSet rs) throws
         SQLException, DataAccessException
         {
         VersionInfo versionInfo = null;
         List<VersionInfo> list = new ArrayList<VersionInfo>();
         while (rs.next())
         {
         versionInfo = new VersionInfo();
         versionInfo.setId(rs.getInt("id"));
         versionInfo.setVersion_name(rs.getString("version_name"));
         versionInfo.setUpload_time(rs.getLong("upload_time"));
         versionInfo.setActive_state(rs.getString("active_state"));
         versionInfo.setVersion_type(rs.getString("version_type"));
         versionInfo.setFile_path(rs.getString("file_path"));
         versionInfo.setRemark(rs.getString("remark"));
         versionInfo.setVersion_number(rs.getString("version_number"));
         list.add(versionInfo);
         }
         return list;
         }
         });

RowCallbackHandler接口中包含了processRow方法,该方法中没有返回值,但是会自动的循环ResultSet结果集
final List<VersionInfo> list = new ArrayList<VersionInfo>();
        jdbcTemplate.query(sql, new RowCallbackHandler()
        {
            // 会自动循环ResultSet
            @Override
            public void processRow(ResultSet rs) throws SQLException
            {
                VersionInfo versionInfo = new VersionInfo();
                versionInfo.setId(rs.getInt("id"));
                versionInfo.setVersion_name(rs.getString("version_name"));
                versionInfo.setUpload_time(rs.getLong("upload_time"));
                versionInfo.setActive_state(rs.getString("active_state"));
                versionInfo.setVersion_type(rs.getString("version_type"));
                versionInfo.setFile_path(rs.getString("file_path"));
                versionInfo.setRemark(rs.getString("remark"));
                versionInfo.setVersion_number(rs.getString("version_number"));
                list.add(versionInfo);
            }
        });


可能大家会觉得奇怪,在查询方法中只传入的是ResultSetExtractor接口,而RowMapper和RowCallbackHandler接口与ResultSetExtractor没有相互的集成关系,那么jdbcTemlate是怎样做转换的
首先看下RowCallbackHandler接口

  public void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch)
        throws DataAccessException
    {
        query(sql, pss, ((ResultSetExtractor) (new RowCallbackHandlerResultSetExtractor(rch))));
    }


//传入的是RowCallbackHandler接口有一个RowCallbackHandlerResultSetExtractor类进行了转换该类实现了ResultSetExtractor接口

private static class RowCallbackHandlerResultSetExtractor
        implements ResultSetExtractor
    {

        public Object extractData(ResultSet rs)
            throws SQLException
        {
            for(; rs.next(); rch.processRow(rs));
            return null;
        }

        private final RowCallbackHandler rch;

        public RowCallbackHandlerResultSetExtractor(RowCallbackHandler rch)
        {
            this.rch = rch;
        }
    }

同理RowMapper

public class RowMapperResultSetExtractor
    implements ResultSetExtractor
{

    public RowMapperResultSetExtractor(RowMapper rowMapper)
    {
        this(rowMapper, 0);
    }

    public RowMapperResultSetExtractor(RowMapper rowMapper, int rowsExpected)
    {
        Assert.notNull(rowMapper, "RowMapper is required");
        this.rowMapper = rowMapper;
        this.rowsExpected = rowsExpected;
    }

    public List extractData(ResultSet rs)
        throws SQLException
    {
        List results = rowsExpected <= 0 ? ((List) (new ArrayList())) : ((List) (new ArrayList(rowsExpected)));
        int rowNum = 0;
        for(; rs.next(); results.add(rowMapper.mapRow(rs, rowNum++)));
        return results;
    }

    public volatile Object extractData(ResultSet resultset)
        throws SQLException, DataAccessException
    {
        return extractData(resultset);
    }

    private final RowMapper rowMapper;
    private final int rowsExpected;
}
分享到:
评论

相关推荐

    spring jdbc示例代码

    Spring JDBC是Spring框架的一部分,它提供了一种更高级的方式来处理传统的Java JDBC(Java Database Connectivity),以简化数据库操作。本示例代码将展示如何在Spring环境中使用JDBC进行数据的增删改查操作,并对比...

    Spring事务管理和SpringJDBC思维导图

    在IT行业中,Spring框架是Java开发中的核心工具之一,它为构建企业级应用程序提供了全面的解决方案。本话题主要关注Spring的两个重要模块:事务管理和Spring JDBC。这些知识点对于任何使用Spring进行后端开发的...

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

    总之,SpringMVC、Spring和SpringJDBC的整合为Java Web开发提供了一个强大的解决方案,它们的相互配合可以实现灵活的控制流、高效的数据库访问以及整洁的代码结构。理解并熟练掌握这些技术,对于提升Java开发能力...

    SpringJDBC

    Spring JDBC是Spring框架的一个核心模块,它为Java开发者提供了便捷的方式来操作数据库。Spring JDBC通过抽象出数据库连接管理、事务处理以及结果集处理等繁琐工作,使得开发者可以专注于SQL语句和业务逻辑,而不必...

    Spring Data JDBC与JDBC的区别

    集成Spring Data JDBC可以减少代码量,提高可维护性,并且由于Spring的其他模块(如Spring MVC和Spring Security)与之良好集成,可以构建更复杂的Web应用。例如,Spring MVC提供了模型-视图-控制器架构,使业务逻辑...

    spring-jdbc.rar源码 学习分析用

    Spring JDBC的事务管理也是其关键特性之一。在源码中,我们可以看到TransactionManager接口及其实现,如DataSourceTransactionManager,它是Spring对数据库事务进行控制的核心。当开启事务时,Spring会通过保存点或...

    基于SpringJDBC的BaseDAO

    Spring框架提供了多种方式来处理数据库操作,其中Spring JDBC模块是轻量级且功能强大的解决方案之一。本文将详细介绍如何基于Spring JDBC模块创建一个通用的数据访问对象(BaseDAO)类,实现简单的对象关系映射(ORM)...

    spring中jdbc的操作

    在Java世界里,Spring框架是应用最广泛的轻量级开源框架之一,它为开发者提供了许多便利,包括数据库操作。在本资源中,我们主要探讨的是Spring JDBC模块,它简化了Java Database Connectivity (JDBC)的使用,使得在...

    Spring+JDBC实例

    1. **依赖注入**:Spring的核心特性之一是依赖注入(DI),它允许我们通过配置文件或注解来管理对象之间的依赖关系。在使用JdbcTemplate时,我们可以声明一个JdbcTemplate的bean,并在需要的地方通过@Autowired注解...

    SpringJDBC注解事务.zip

    在Spring框架中,事务管理是核心功能之一,它确保了数据的一致性和完整性。本篇文章将深入探讨Spring JDBC如何通过注解来实现事务管理。 1. **Spring JDBC简介** Spring JDBC提供了一个JdbcTemplate类,它封装了...

    spring jdbc 常用jar包

    Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。

    spring+jdbc

    首先,Spring框架的核心之一是依赖注入(Dependency Injection,DI),它允许开发者通过声明式的方式管理对象及其依赖关系,从而降低代码的耦合度。在"spring事物配置"中,Spring提供了声明式事务管理,这使得开发者...

    Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate

    首先,`JdbcTemplate`的核心功能之一是执行SQL查询。你可以使用`query(String sql, RowMapper&lt;T&gt; rowMapper)`方法来执行一个简单的查询,并将结果映射到自定义的对象上。`RowMapper`接口需要你自己实现,用于将结果...

    Spring源代码解析(三):Spring_JDBC.doc

    在Spring框架中,Spring JDBC是核心模块之一,它提供了一种简单且强大的方式来处理数据库交互。本篇文章将深入解析Spring JDBC的实现,特别是JdbcTemplate类。JdbcTemplate是Spring为简化数据库操作而设计的一个模板...

    java开发之SSS整合教程.继SSH,SSM之后,spring全家桶SSS问世,数据库采用SpringJDBC

    SpringJDBC作为Spring框架的一部分,是对Java Database Connectivity (JDBC) API的轻量级封装,旨在简化数据库操作,同时保持了JDBC的灵活性。 SpringJDBC提供了一个模板类`JdbcTemplate`,它消除了大量的样板代码...

    spring整合jdbc的配置

    Spring框架是 Java 企业级应用开发的标准框架之一,它提供了强大的依赖注入和AOP功能,使得开发者可以更方便地进行企业级应用开发。在实际开发中,我们常常需要将Spring与JDBC集成,以便于使用Spring来管理数据库...

    spring+springmvc+springjdbc+redis

    标题中的"spring+springmvc+springjdbc+redis"是一个典型的Java Web开发技术组合,涵盖了Spring框架的核心组件,Spring MVC作为Web层的处理框架,Spring JDBC用于数据库操作,以及Redis作为高速缓存系统。...

    Spring-jdbc jar包

    Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。

    webservice源代码Spring+JDBC

    Spring是Java开发中最广泛使用的轻量级框架之一,它简化了创建和管理Java应用,特别是企业级应用。在Web服务场景中,Spring提供了强大的支持,包括Spring MVC(Model-View-Controller)用于构建Web应用,以及Spring ...

    spring jdbc

    `JdbcTemplate`是Spring JDBC中最核心的类之一,它提供了一系列的方法来执行各种数据库操作,包括查询、更新、插入和删除等。通过使用`JdbcTemplate`,开发者可以避免直接使用`PreparedStatement`和`ResultSet`,这...

Global site tag (gtag.js) - Google Analytics