无法知道JdbcTemplateSupport

时间:2016-07-20 10:40:34

标签: java spring

我在春天写一个程序来获取记录总数并插入记录。我的记录总数很好,但是我的插页给了我一个例外。

以下是我的代码

@Component
public class DaoImpl extends JdbcDaoSupport {

    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    private JdbcDaoSupport jdbcDaoSupport;


    // getCount of rows

    public int getNumberOfRecords() {
        String sql = "select count(*) from student";
        return this.getJdbcTemplate().queryForObject(sql, Integer.class);
    }

    // insert using named parameters
    public void InsertUsingNamedParameters(StudentBean studentBean) {

        String paramSql = "insert into Student (id, name, age) values (:id, :name,:age)";
        HashMap<String, Object> params = new HashMap<>();
        params.put("id", 10);
        params.put("name", "new userX");
        params.put("age", 35);
        this.getJdbcTemplate().update(paramSql, params);
    }
  }
}

这是我的主要方法。

package org.Main;

import org.Service.DaoImpl;
import org.model.StudentBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainStudent {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        DaoImpl dao = context.getBean("daoImpl", DaoImpl.class);
        dao.InsertUsingNamedParameters(new StudentBean());
        System.out.println(dao.getNumberOfRecords());
      }
    }
}

这是我的 Spring.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd">


    <context:component-scan base-package="org.model, org.Service"></context:component-scan>
    <context:annotation-config />
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
        <property name="url"
            value="My jdbc url"></property>
        <property name="username" value="my user name"></property>
        <property name="password" value="my password"></property>

    </bean>
    <bean id="daoImpl" class="org.Service.DaoImpl">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

最好的部分是当我尝试使用NamedParameterJdbctemplate做同样的事情时,这很好用。

但是在我的xml中我没有

<bean id="daoImpl" class="org.Service.DaoImpl">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

这个bean代码是否导致该错误?

这非常令人困惑。请让我知道我哪里出错了,我该怎么办呢。

以下是我的例外

  

2016年7月20日下午4:04:07   org.springframework.context.support.AbstractApplicationContext   prepareRefresh INFO:刷新   org.springframework.context.support.ClassPathXmlApplicationContext@1c12fb0:   启动日期[Wed Jul 20 16:04:07 IST 2016];上下文层次结构的根   2016年7月20日下午4:04:07   org.springframework.beans.factory.xml.XmlBeanDefinitionReader   loadBeanDefinitions INFO:从类路径加载XML bean定义   资源[spring.xml] 2016年7月20日下午4:04:07   org.springframework.beans.factory.support.DefaultListableBeanFactory   registerBeanDefinition INFO:覆盖bean的bean定义   &#39; daoImpl&#39;使用不同的定义:替换[Generic bean:class   [org.Service.DaoImpl];范围=单;抽象= FALSE;   lazyInit = FALSE; autowireMode = 0; dependencyCheck = 0;   autowireCandidate = TRUE;初级= FALSE; factoryBeanName = NULL;   factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = NULL;   在文件中定义   [C:\ D \ SpringMVC \ SpringDataBases \ bin \ org \ Service \ DaoImpl.class]] with   [Generic bean:class [org.Service.DaoImpl];范围=;抽象= FALSE;   lazyInit = FALSE; autowireMode = 0; dependencyCheck = 0;   autowireCandidate = TRUE;初级= FALSE; factoryBeanName = NULL;   factoryMethodName = NULL; initMethodName = NULL; destroyMethodName = NULL;   在类路径资源[spring.xml]中定义2016年7月20日下午4:04:07   org.springframework.jdbc.datasource.DriverManagerDataSource   setDriverClassName INFO:已加载的JDBC驱动程序:   com.microsoft.sqlserver.jdbc.SQLServerDriver 2016年7月20日下午4:04:08   org.springframework.beans.factory.xml.XmlBeanDefinitionReader   loadBeanDefinitions INFO:从类路径加载XML bean定义   资源[org / springframework / jdbc / support / sql-error-codes.xml] 7月   20,2016 4:04:08 PM   org.springframework.jdbc.support.SQLErrorCodesFactory信息:   加载了SQLErrorCodes:[DB2,Derby,H2,HSQL,Informix,MS-SQL,MySQL,   Oracle,PostgreSQL,Sybase,Hana]线程中的异常&#34; main&#34;   org.springframework.dao.TransientDataAccessResourceException:   PreparedStatementCallback; SQL [插入学生(id,name,age)   values(:id,:name,:age)];指数1超出范围。嵌套   异常是com.microsoft.sqlserver.jdbc.SQLServerException:The   指数1超出范围。在   org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108)     在   org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)     在   org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)     在   org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)     在   org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649)     在   org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:870)     在   org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:931)     在   org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:941)     在org.Service.DaoImpl.InsertUsingNamedParameters(DaoImpl.java:62)     在org.Main.MainStudent.main(MainStudent.java:14)引起:   com.microsoft.sqlserver.jdbc.SQLServerException:索引1不在   范围。在   com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)     在   com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:700)     在   com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObjectNoType(SQLServerPreparedStatement.java:896)     在   com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:921)     在   org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:440)     在   org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235)     在   org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:166)     在   org.springframework.jdbc.core.ArgumentPreparedStatementSetter.doSetValue(ArgumentPreparedStatementSetter.java:66)     在   org.springframework.jdbc.core.ArgumentPreparedStatementSetter.setValues(ArgumentPreparedStatementSetter.java:47)     在   org.springframework.jdbc.core.JdbcTemplate $ 2.doInPreparedStatement(JdbcTemplate.java:875)     在   org.springframework.jdbc.core.JdbcTemplate $ 2.doInPreparedStatement(JdbcTemplate.java:870)     在   org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)     ......还有5个

1 个答案:

答案 0 :(得分:1)

您对JdbcTemplateNamedParameterJdbcTemplate感到困惑,请参阅this

查询"insert into Student (id, name, age) values (:id, :name,:age)";适用于NamedParameterJdbcTemplate,因为它已命名参数而不是'?'占位符。

将您的查询更改为"insert into Student (id, name, age) values (?, ?, ?)";并尝试使用JdbcTemplate#update(String sql, Object... args) throws DataAccessException方法,它应该有效。

只是fyi,你正在混合xml bean配置和组件扫描,不建议这样做。