我在春天写一个程序来获取记录总数并插入记录。我的记录总数很好,但是我的插页给了我一个例外。
以下是我的代码
@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个
答案 0 :(得分:1)
您对JdbcTemplate
和NamedParameterJdbcTemplate
感到困惑,请参阅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配置和组件扫描,不建议这样做。