Java 值在到达时更改。|可赎回声明
我在DAO类和StoredProcedure中遇到了一个奇怪的问题,我使用了一个Java 值在到达时更改。|可赎回声明,java,mysql,jdbc,callable,Java,Mysql,Jdbc,Callable,我在DAO类和StoredProcedure中遇到了一个奇怪的问题,我使用了一个CallableStatement对象,该对象在参数中使用了15个,字段id\u color的值是从HTML表单中正确检索的,甚至在CallableStatementsetter方法中设置了该字段的值,但当它被发送到数据库时,id\u color就被值3覆盖了“上下文”: 我有下面的类DAO.CoverDAO,它处理这个表的CRUD操作 CREATE TABLE `cover_details` ( `refno
CallableStatement
对象,该对象在参数中使用了15个,字段id\u color
的值是从HTML表单中正确检索的,甚至在CallableStatement
setter方法中设置了该字段的值,但当它被发送到数据库时,id\u color
就被值3
覆盖了“上下文”:
我有下面的类DAO.CoverDAO
,它处理这个表的CRUD
操作
CREATE TABLE `cover_details` (
`refno` int(10) unsigned NOT NULL AUTO_INCREMENT,
`shape` tinyint(3) unsigned NOT NULL ,
`id_color` tinyint(3) unsigned NOT NULL ',
`reversefold` bit(1) NOT NULL DEFAULT b'0' ,
`x` decimal(6,3) unsigned NOT NULL ,
`y` decimal(6,3) unsigned NOT NULL DEFAULT '0.000',
`typecut` varchar(10) NOT NULL,
`cornershape` varchar(20) NOT NULL,
`z` decimal(6,3) unsigned DEFAULT '0.000' ,
`othercornerradius` decimal(6,3) unsigned DEFAULT '0.000'',
`skirt` decimal(5,3) unsigned NOT NULL DEFAULT '7.000',
`foamTaper` varchar(3) NOT NULL,
`foamDensity` decimal(2,1) unsigned NOT NULL ,
`straplocation` char(1) NOT NULL ',
`straplength` decimal(6,3) unsigned NOT NULL,
`strapinset` decimal(6,3) unsigned NOT NULL,
`spayear` varchar(20) DEFAULT 'Not Specified',
`spamake` varchar(20) DEFAULT 'Not Specified',
`spabrand` varchar(20) DEFAULT 'Not Specified',
PRIMARY KEY (`refno`)
) ENGINE=MyISAM AUTO_INCREMENT=143 DEFAULT CHARSET=latin1 $$
插入护盖的方式是通过存储过程进行的,存储过程如下所示:
CREATE DEFINER=`root`@`%` PROCEDURE `putCover`(
IN shape TINYINT,
IN color TINYINT,
IN reverse_fold BIT,
IN x DECIMAL(6,3),
IN y DECIMAL(6,3),
IN type_cut VARCHAR(10),
IN corner_shape VARCHAR(10),
IN cutsize DECIMAL(6,3),
IN corner_radius DECIMAL(6,3),
IN skirt DECIMAL(5,3),
IN foam_taper VARCHAR(7),
IN foam_density DECIMAL(2,1),
IN strap_location CHAR(1),
IN strap_length DECIMAL(6,3),
IN strap_inset DECIMAL(6,3)
)
BEGIN
INSERT INTO `dbre`.`cover_details`
(`dbre`.`cover_details`.`shape`,
`dbre`.`cover_details`.`id_color`,
`dbre`.`cover_details`.`reversefold`,
`dbre`.`cover_details`.`x`,
`dbre`.`cover_details`.`y`,
`dbre`.`cover_details`.`typecut`,
`dbre`.`cover_details`.`cornershape`,
`dbre`.`cover_details`.`z`,
`dbre`.`cover_details`.`othercornerradius`,
`dbre`.`cover_details`.`skirt`,
`dbre`.`cover_details`.`foamTaper`,
`dbre`.`cover_details`.`foamDensity`,
`dbre`.`cover_details`.`strapLocation`,
`dbre`.`cover_details`.`strapInset`,
`dbre`.`cover_details`.`strapLength`
)
VALUES
(shape,color,reverse_fold,
x,y,type_cut,corner_shape,
cutsize,corner_radius,skirt,foam_taper,foam_density,
strap_location,strap_inset,strap_length);
END
正如您可以看到的,它基本上只填充每个字段,现在,创建封面的CoverDAO.create(CoverDTO cover)
方法如下所示:
public void create(CoverDTO cover) throws DAOException {
Connection link = null;
CallableStatement query = null;
try {
link = MySQL.getConnection();
link.setAutoCommit(false);
query = link.prepareCall(
"{CALL putCover(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"
);
query.setByte(1,cover.getShape().byteValue());
query.setByte(2,cover.getColor().byteValue());
query.setBoolean(3, cover.getReverseFold());
query.setBigDecimal(4,cover.getX());
query.setBigDecimal(5,cover.getY());
query.setString(6,cover.getTypeCut());
query.setString(7,cover.getCornerShape());
query.setBigDecimal(8, cover.getZ());
query.setBigDecimal(9, cover.getCornerRadius());
query.setBigDecimal(10, cover.getSkirt());
query.setString(11, cover.getFoamTaper());
query.setBigDecimal(12, cover.getFoamDensity());
query.setString(13, cover.getStrapLocation());
query.setBigDecimal(14, cover.getStrapLength());
query.setBigDecimal(15, cover.getStrapInset());
query.executeUpdate();
link.commit();
} catch (SQLException e) {
throw new DAOException(e);
} finally {
close(link, query);
}
}
CoverDTO由accessor方法组成,MySQL对象基本上从池返回连接
以下是具有虚拟但适当数据的pset查询:
putCover(1,10,0,80.0,80.0,'F','Cut',0.0,0,15.0,'4x2',1.5,'A',10.0,5.0)
(删除了一些尾随零)
正如您所看到的,当我写入DB而不是第二个参数a3
中的10
时,一切都很好。我已经做了以下工作:
将id\u color
值跟踪到create方法,仍然被3替换
在DAO创建方法中对值进行硬编码,仍然被3替换
从MySQL Workbench调用该过程,效果很好,因此我假设create方法中出现了问题,非常感谢您的帮助。 存储过程声明中有一个错误:
IN color TINYINT(3)
将其更改为:
IN color TINYINT
希望它能起作用。鉴于atribute定义形状tinyint(3)
和id\u颜色tinyint(3)
,我惊讶地看到过程putCover()
在形状tinyint中分别具有形式参数,在颜色tinyint(3)
。此外,我希望create()
相应地使用setByte()
。您在哪里“在DAO创建方法中硬编码了值”,是否尝试query.setInt(2,10)代码>?应该query.setInt(2,cover.getColor())
是query.setByte(2,cover.getColor())
?它工作过吗?你确定DAO和表定义是一致的吗?@Scrum Meister,是的,我试过了,仍然被3替换。@Tony Ennis:是的,它们是一致的,这意味着过程处理适当的字段。@ShahidAzim:你能详细说明一下吗?“显示宽度不限制可存储在列中的值的范围。”-它不应该起作用,但在这种情况下,它的行为是这样的。最好是等待@Triztian的响应。@ShahidAzim:我试过这样做,但讨厌的3仍然会进入数据库。你也可以包含@trashgod的建议,只需使代码更加一致,这样就更容易调试了。例如,这两行正在更新相同的类型(TINYINT),但使用不同的方法query.setLong(1,cover.getShape());query.setByte(2,cover.getColor().byteValue());我甚至尝试删除byteValue()
方法,并使用包装类(java.lang.Byte
)。我认为可能是这样,但根据规范,一个小的映射到一个整数,见这里,JDBC和MySQL类型使用setByte()
,如上所示?事实上,问题已经解决,请参见ShahidAzim回答中的评论。