在 java 中,preparedstatement 没有名为 setreal() 的方法。要设置 real(实数)类型的参数,应使用 setdouble() 或 setfloat() 方法。具体选择取决于数据库列的数据类型精度要求:若为双精度浮点数(如 sql server 的 real 或 float),通常使用 setdouble();若为单精度浮点数(如 mysql 的 real 或 float),可使用 setfloat()。推荐使用 setdouble() 以避免精度丢失,因为大多数 jdbc 驱动会将 real 映射为 double。

如何正确设置 REAL 类型参数
对于大多数关系型数据库,JDBC 驱动将 SQL REAL 类型映射为 Java 的 double 类型。因此,调用 setDouble(int parameterIndex, double x) 是最通用且安全的做法。例如,向一个包含 price REAL 列的表插入数据时,直接传入 double 值即可。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class RealExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "INSERT INTO products (name, price) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "Widget");
pstmt.setDouble(2, 19.95); // 设置 REAL 参数
int rowsAffected = pstmt.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述代码成功插入了价格为 19.95 的记录。注意:setDouble() 适用于几乎所有支持 REAL 的数据库,包括 MySQL、PostgreSQL 和 SQL Server。若数据库明确使用单精度 FLOAT,也可使用 setFloat(),但 setDouble() 更常见且兼容性更好。
立即学习“Java免费学习笔记(深入)”;
不同数据库对 REAL 类型的映射差异
不同数据库对 REAL 的定义略有差异。MySQL 中 REAL 是 FLOAT 的同义词,而 PostgreSQL 中 REAL 是单精度浮点数,SQL Server 中 REAL 也是单精度。尽管存在差异,JDBC 规范建议通过 DatabaseMetaData.getTypeInfo() 查询具体映射,但实践中直接使用 setDouble() 可覆盖绝大多数场景。

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class CheckRealType {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getTypeInfo();
while (rs.next()) {
String typeName = rs.getString("TYPE_NAME");
if ("REAL".equalsIgnoreCase(typeName)) {
System.out.println("Java Type: " + rs.getString("TYPE_NAME") +
" -> " + rs.getInt("PRECISION") +
" digits precision");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行此代码可确认当前数据库中 REAL 类型的精度。例如,MySQL 返回 7 位有效数字,对应单精度浮点数。虽然这证实了 REAL 是单精度,但 setDouble() 仍能正确工作,因为 JDBC 驱动会自动处理转换。若需严格匹配单精度,可使用 setFloat(),但需注意精度损失风险。
当 REAL 参数为 null 时如何处理
若 REAL 字段允许 NULL,需使用 setNull(int parameterIndex, int sqlType) 方法。此时需指定 SQL 类型常量,如 Types.REAL。例如,插入一条价格未知的记录时,调用 pstmt.setNull(2, Types.REAL) 可确保数据库接受 NULL 值而非抛出异常。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Types;
public class NullRealExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "INSERT INTO products (name, price) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "Unknown Item");
pstmt.setNull(2, Types.REAL); // 设置 NULL 值
int rowsAffected = pstmt.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
此代码成功插入了价格为 NULL 的记录。关键点在于使用 Types.REAL 常量,而非其他数值类型。若误用 Types.DOUBLE,某些数据库可能拒绝 NULL 或引发类型不匹配错误。始终根据目标列的实际 SQL 类型选择对应的 Types 常量。


















