`

spring jdbc 之二

阅读更多
spring jdbcTemplate 提供了很多查询和更新功能,但是如果我们需要高层次的抽象spring还有个RDBMS其中包括了SqlQuery,MappingSqlQuery,SqlUpdate等
我们首先来看下一个简单的查询简单例子
public class BokkQuery extends MappingSqlQuery<VersionInfo>
{
    public BokkQuery(DataSource dataSource)
    {
        super(dataSource, "select * from t_soft_version t where t.id=?");
        //设置参数
        super.declareParameter(new SqlParameter("id", Types.INTEGER));
        compile();
    }
  
    @Override
    protected VersionInfo mapRow(ResultSet rs, int i) throws SQLException
    {
        VersionInfo versionInfo = new VersionInfo();
        versionInfo.setId(rs.getInt("id"));
        versionInfo.setVersion_name(rs.getString("version_name"));
        return versionInfo;
    }
}

public static void main(String[] args)
{
    DataSource dataSource = (DataSource) cxf.getBean("dataSource");
    BokkTest test = new BokkTest();
    test.listbook(dataSource);
}

public void listbook(DataSource dataSource)
    {
        BokkQuery bokkQuery = new BokkQuery(dataSource);
        List<VersionInfo> list = bokkQuery.execute(new Object[]{11111});
        for (VersionInfo versionInfo : list)
        {
            System.out.println("versionname:" + versionInfo.getVersion_name());
        }

     }


首先我们看下RdbmsOperation下其类的结构图:



下面我们从declareParameter入手分下一下该功能是如何实现的,其具体的实现在MappingQuery的基类RdbmsOperation的源码可以看到
RdbmsOperation源码如下:
public abstract class RdbmsOperation
    implements InitializingBean
{

    public void declareParameter(SqlParameter param)
        throws InvalidDataAccessApiUsageException
    {
        //声明参数只能在compile之前,否则声明是无效的,并会抛出异常
        if(isCompiled())
        {
            throw new InvalidDataAccessApiUsageException("Cannot add parameters once the query is compiled");
        } else
        {
            //把参数添加到一个LinkedList集合的属性中,供compile方法使用
            declaredParameters.add(param);
            return;
        }
    }

   //我们看到了compile
    public final void compile()
        throws InvalidDataAccessApiUsageException
    {
        if(!isCompiled())
        {
            if(getSql() == null)
                throw new InvalidDataAccessApiUsageException("Property 'sql' is required");
            try
            {
                //调用了afterPropertesSet方法
                jdbcTemplate.afterPropertiesSet();
            }
            catch(IllegalArgumentException ex)
            {
                throw new InvalidDataAccessApiUsageException(ex.getMessage());
            }
            //调用compileInternal完成具体的compile过程,并设置compiled标志位
            compileInternal();
            compiled = true;
            if(logger.isDebugEnabled())
                logger.debug((new StringBuilder("RdbmsOperation with SQL [")).append(getSql()).append("] compiled").toString());
        }
    }

    public void afterPropertiesSet()
    {
        compile();
    }
}

compileInternal方法在sqlOperation里完成,在compileInternal中生成一个PreparedStatementCreatorFactory作为Statement的工厂,这个工厂负责生成参数的Statement,其源码如下:

protected final void compileInternal()
    {
        preparedStatementFactory = new PreparedStatementCreatorFactory(getSql(), getDeclaredParameters());
        preparedStatementFactory.setResultSetType(getResultSetType());
        preparedStatementFactory.setUpdatableResults(isUpdatableResults());
        preparedStatementFactory.setReturnGeneratedKeys(isReturnGeneratedKeys());
        if(getGeneratedKeysColumnNames() != null)
            preparedStatementFactory.setGeneratedKeysColumnNames(getGeneratedKeysColumnNames());
        preparedStatementFactory.setNativeJdbcExtractor(getJdbcTemplate().getNativeJdbcExtractor());
        onCompileInternal();
    }


在完成compile之后,对MappingSqlQuery的准备工作就基本完成,在执行查询时,实际执行的是SqlQuery的executeByNameParam方法,这个方法需要完成的工作包括配置sql语句,配置数据记录对象转换RowMapper,然后使用JdbcTemplate来完成数据的查询,并启动数据记录到java数据对象的转换,其源码如下:

  public List executeByNamedParam(Map paramMap, Map context)
        throws DataAccessException
    {
        validateNamedParameters(paramMap);
        //需要执行sql语句
        org.springframework.jdbc.core.namedparam.ParsedSql parsedSql = getParsedSql();
        MapSqlParameterSource paramSource = new MapSqlParameterSource(paramMap);
        String sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, paramSource);
        //配置好SQL语句需要的Paramters即rowMapper,这个Rowmapper完成数据记录对象的转换
        Object params[] = NamedParameterUtils.buildValueArray(parsedSql, paramSource, getDeclaredParameters());
        RowMapper rowMapper = new RowMapper(params, context);
        //转换成Rowmapper调用的是jdbcTemplate中的模板方法
        return getJdbcTemplate().query(newPreparedStatementCreator(sqlToUse, params), rowMapper);
    }
分享到:
评论

相关推荐

    spring_JDBC整合包

    Spring JDBC是Spring框架的一个重要模块,它简化了Java数据库连接(JDBC)的使用,提供了更高级别的抽象,使得数据库操作更加简洁、易管理和模块化。这个"spring_JDBC整合包"显然包含了进行Spring JDBC开发所需的...

    Spring JDBC与事务管理

    javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...

    Spring JDBC常用Jar包

    2. **spring-tx-3.2.3.RELEASE.jar**: Spring的事务管理模块,提供了编程式和声明式事务管理支持。在Spring JDBC中,事务管理是关键功能,它确保了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。通过这...

    spring jdbc.zip

    2. spring-beans-5.1.10.RELEASE.jar:包含了Bean工厂和Bean定义的解析,是Spring IoC容器的基础。 3. spring-jdbc-5.1.10.RELEASE.jar:Spring JDBC模块,包含JdbcTemplate和其他数据库相关工具。 4. spring-tx-...

    spring jdbc示例代码

    2. **SqlSessionFactoryBean**和**DataSource**:在Spring配置文件中,我们需要设置DataSource来管理数据库连接,SqlSessionFactoryBean用于创建SqlSession,它是MyBatis的基础,但在Spring JDBC中我们通常直接使用...

    SpringJDBC.rar_SpringJDBC_spring jdbc

    通过这个SpringJDBC.rar的案例,初学者可以学习到如何配置DataSource,如何创建JdbcTemplate实例,以及如何编写和执行SQL语句。同时,实践中还可以了解到如何将Spring JDBC整合到Spring Boot项目中,以及如何处理...

    springjdbc.zip_SpringJDBC_spring jdbc_spring 增删改查_springjdbc xml

    这个`springjdbc.zip`压缩包很可能包含了示例代码和配置文件,用于演示如何使用Spring JDBC来执行基本的数据库操作,如增、删、改、查。 1. **Spring JDBC模块**:Spring JDBC模块主要由`org.springframework.jdbc`...

    spring对jdbc的支持jar包

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

    spring-jdbc jar包.rar

    《Spring JDBC:构建高效数据访问层》 Spring JDBC是Spring框架的一个重要组成部分,它提供了一种简化传统JDBC编程的抽象层,使得开发者能够更轻松、更安全地处理数据库交互。"spring-jdbc jar包"包含了Spring框架...

    spring4 、 springmvc4.2、springjdbc

    2. 配置Spring:创建Spring的配置文件,如`applicationContext.xml`,配置Bean、数据源和事务管理器等。 3. 配置Spring MVC:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析...

    spring jdbc相关包版本5.1.3

    2. **spring-context-5.1.3.RELEASE.jar**:扩展了`spring-core`,提供了环境感知能力,如bean的生命周期管理,事件发布,国际化,资源访问,以及与第三方框架的集成,如数据访问和事务管理。 3. **spring-beans-...

    SpringMVC+SpringJDBC

    SpringMVC和SpringJDBC是Java开发中两个重要的框架,它们分别是Spring框架在Web层和数据访问层的应用。本文将详细介绍这两个组件的核心概念、工作原理以及如何整合使用,旨在帮助开发者更好地理解和应用。 **...

    spring JDbc

    2. **异常处理**:Spring JDBC将数据库抛出的原生异常转换为更有意义的`DataAccessException`子类,使得异常处理更加简单。例如,`EmptyResultDataAccessException`用于表示预期查询结果不存在,而`...

    Spring JDBC应用实例讲解

    Spring JDBC是Spring框架中的一个核心模块,主要用于简化Java数据库编程。在本文中,我们将深入探讨Spring JDBC的应用实例,了解如何利用它来实现高效且灵活的数据访问。首先,我们需要理解Spring JDBC是如何通过...

    Spring Jdbc的jar包

    Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一种抽象层,使得开发者可以更轻松地处理数据库操作。Spring JDBC的主要目标是简化数据访问,减少直接使用JDBC时的繁琐工作,如手动管理...

    spring JDBC所需jar包

    2. spring-jdbc.jar:这个库提供了Spring对JDBC的支持,包括DataSource的管理、事务处理、JdbcTemplate等工具类。 3. spring-tx.jar:事务管理模块,支持声明式和编程式事务管理,对于数据库操作的事务控制至关重要...

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

    这个“SpringJDBC.rar”压缩包文件可能包含了关于如何在Spring框架中集成和使用JDBC的相关示例和教程。下面将详细解释Spring JDBC的核心概念、功能以及使用方法。 首先,Spring JDBC的核心目标是简化传统的JDBC编程...

    最简单的用户登录与注册系统 spring mvc spring jdbc

    2. **Spring JDBC**:Spring JDBC抽象了JDBC,提供了一个模板类JdbcTemplate,用于执行SQL查询和更新。理解如何配置DataSource,以及如何使用JdbcTemplate进行增删改查操作是关键。 3. **用户登录**:登录功能通常...

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

    《Java开发中的SpringMVC + Spring + SpringJDBC整合详解》 在Java开发领域,Spring框架因其强大的功能和灵活性而备受推崇。SpringMVC、Spring和SpringJDBC是Spring框架中的核心组件,它们的整合使用可以构建出高效...

    Spring事务管理和SpringJDBC思维导图

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

Global site tag (gtag.js) - Google Analytics