4
回答
Spring+jdbc在插入数据的时候报错
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

各位帮帮忙,谢谢!!!用了springmvc+spring+jdbc

这是异常信息:log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into X_upfile(id,fileInfo,fileName,upFileDate,fileType,user_id)values(?,?,?,?,?,?)]; Invalid argument value: java.sql.SQLException; nested exception is java.sql.SQLException: Invalid argument value: java.sql.SQLException
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:106)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:607)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:792)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:850)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:858)
at com.yu.dao.impl.FileInfoDaoImpl.save(FileInfoDaoImpl.java:58)
at com.yu.Test.main(Test.java:31)
Caused by: java.sql.SQLException: Invalid argument value: java.sql.SQLException
at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:2348)
at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:1127)
at org.apache.commons.dbcp.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:166)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:346)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:217)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:145)
at org.springframework.jdbc.core.ArgPreparedStatementSetter.setValues(ArgPreparedStatementSetter.java:51)
at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:796)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:591)
... 5 more


这是DaoImpl:

/**
     * 数据源
     */
@SuppressWarnings("unused")
private DataSource dataSource;

    /**
     * spring提供的jdbc操作辅助类
     */
private JdbcTemplate jdbcTemplate;

/**设置数据源*/ 
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

public void save(FileINfoEntity entity) {
String sql = "insert into X_upfile(id,fileInfo,fileName,upFileDate,fileType,user_id)"
+ "values(?,?,?,?,?,?)";
jdbcTemplate.update(sql, new Object[] { 
entity.getId(),entity.getFileInfo(),
entity.getFileName(),entity.getUpFileDate(), 
entity.getFileType(),entity.getUser_id(),new int[]{
java.sql.Types.VARCHAR,java.sql.Types.VARCHAR,
java.sql.Types.VARCHAR,java.sql.Types.VARCHAR,
java.sql.Types.VARCHAR,java.sql.Types.VARCHAR
}});
}
这是我的Spring配置文件:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 读取jdbc.properties配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 连接池启动时的初始值 -->
<property name="initialSize" value="${initialSize}" />
<!-- 连接池的最大值 -->
<property name="maxActive" value="${maxActive}" />
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="${maxIdle}" />
<!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
<property name="minIdle" value="${minIdle}" />
</bean>

<!--
采用注解方式来配置事务。针对数据源的事务管理器
,把我们定义的数据源注入到DataSourceTransactionManager类的属性dataSource中
-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<!--
引入命名空间: 1.xmlns:tx="http://www.springframework.org/schema/tx
2.http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
采用@Transaction注解方式使用事务管理器
-->
<tx:annotation-driven transaction-manager="txManager" />

<!--配置控制器的映射-->
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="uploadFile.do">uploadFileAction</prop>
</props>
</property>
</bean>

<!-- 文件Dao -->
<bean id="fileInfoDao" class="com.yu.dao.impl.FileInfoDaoImpl">
<!-- 向属性dataSource注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>

<!--配置视图-->
<!-- 视图扩展名解析器 对模型视图名称的解析,即在模型视图名称添加前后缀-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<!-- <property name="prefix" value=""/> -->
<property name="suffix" value=".jsp" />
</bean>


<!--
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
-->
<!-- one of the properties available; the maximum file size in bytes -->
<!--  <property name="maxUploadSize" value="10000000" />10M -->
<!-- </bean>-->


<!-- 上传文件服务 -->
<bean id="uploadFileAction" class="com.yu.service.UploadFileServiceAction">
<property name="commandClass" value="com.yu.entity.FileINfoEntity">
</property>
</bean>




</beans>

举报
springsky
发帖于5年前 4回/3K+阅
共有4个答案 最后回答: 5年前
String sql = "insert into X_upfile(id,fileInfo,fileName,upFileDate,fileType,user_id)"

+ "values(?,?,?,?,?,?)";

LZ的这个ID应该是主键吧,如果是的话,就不需要再写上去了。

--- 共有 3 条评论 ---
evang回复 @xinyu_huang : 错误信息跟上面的一样? 5年前 回复
springsky你好,我把这个Id改为了逐渐自增之后又出现了这个问题。。。 5年前 回复
springsky呵呵,谢谢你,我成功了,果然Id是主键,这下学习了 5年前 回复

com.yu.dao.impl.FileInfoDaoImpl.save(FileInfoDaoImpl.java:58)

看一下58行定位在哪里?

我建议你这样排查一下,手工写一条正确的insert sql,就是将?代替成常量值,然后测试一下,如果成功的话,问题可能会出现在你的转型问题上。另外你要保证你接收的6个参数都有正确的值

--- 共有 4 条评论 ---
springsky回复 @恺哥 : 嗯,麻烦你了,谢谢 5年前 回复
恺哥回复 @xinyu_huang : 我建议你按照我的方法调试一下,手工构建一个sql,看看ok不,ok的话,证明配置没有问题。从异常信息上看,应该是参数转型那块有问题,就是你的那个int[]数组。你可以将这个数组去掉试试 5年前 回复
springsky我试了试控制台上面的那天insert语句放在Mysql里面没有问题 5年前 回复
springsky58行定位在这:save这个方法的这个地方jdbcTemplate.update() 朋友我的Spring的配置文件有没有问题?谢谢! 5年前 回复

引用来自“evang”的答案

String sql = "insert into X_upfile(id,fileInfo,fileName,upFileDate,fileType,user_id)"

+ "values(?,?,?,?,?,?)";

LZ的这个ID应该是主键吧,如果是的话,就不需要再写上去了。

呵呵,非常感谢 Id是主键,要去掉才OK
顶部