1

Springを使用JdbcTemplateしてSQL挿入ステートメントを実行します。挿入したいフィールドはですNUMBER。値は次のとおり-0.11111111です。タイプのfloat。ただし、DBに挿入した後、取得した値には乱数が埋め込まれます-0.1111111119389534

直接JDBCを使用する場合、値はパディングされた数値なしでそのまま挿入されることに注意してください。

INSERTステートメントのパラメーターを設定するためにBeanPropertySqlParameterSourceとを使用しますが、どちらも同じ結果になります。MapSqlParameterSourceコードは次のようになります。

BeanPropertySqlParameterSource params = new BeanPropertySqlParameterSource(stat);
int n = jt.update(query, params);

ここで、jtはのインスタントですSimpleJdbcTemplate

DBはOracleです。

ありがとうございました。

4

1 に答える 1

2

Java のfloatデータ型の場合、Spring JDBC は直接 JDBC とは異なる動作をします。

Oracle 型と float 型の -0.11111111 をINSERT INTO table (field) VALUES (-0.11111111)持つSQL ステートメントを検討してください。fieldNUMBER

ダイレクト JDBC では、field-0.11111111 などの値がそのまま返されます。

しかし、Spring JDBC を使用すると ( を使用すると、数字JdbcTemplate.update()でパディングされた値field、つまり -0.1111111119389534.

Java type ではそのような違いはありませんdouble。挿入された値は数字で埋められません。

Java datatypeBigDecimalを使用すると、DB に挿入される値も数字でパディングされます。つまり、-0.1111111099999999990428634077943570446223 であり、これはダイレクト JDBC と Spring JDBC の両方で一貫しています。

floatJava がドキュメントで「通貨などの正確な値に (Float) データ型を使用してはならない」と述べているため、結果は理解できます。したがって、ダイレクト JDBC と Spring JDBC では動作が異なりますが、それが間違っているとは言えません。

についてBigDecimalは、http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29を参照してください。

于 2011-02-22T04:15:46.447 に答える