Java 值在到达时更改。|可赎回声明

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

我在DAO类和StoredProcedure中遇到了一个奇怪的问题,我使用了一个
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而不是第二个参数a
3
中的
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回答中的评论。