繁体   English   中英

在jdbcTemplate.update(String sql,Object [] args,int [] argTypes)和jdbcTemplate.update(String sql,Object [] args)之间进行选择

[英]Choosing between jdbcTemplate.update(String sql,Object[] args,int[] argTypes) and jdbcTemplate.update(String sql,Object[] args)

我正在学习Spring Boot和jdbcTemplate的结合以进行一些基本的操作,并试图更好地理解我应该选择哪种更新方法。

我知道以下两种类方法(改编自本文 )会将相同的记录写入数据库。

范例1:

public class InsertDemo {
private static final String sql =
        "INSERT INTO records (title, " +
        "    release_date, " +
        "    artist_id, " +
        "    label_id, " +
        "    created) " +
        "VALUES (?, ?, ?, ?, ?)";

private DataSource dataSource;

public InsertDemo(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void saveRecord(String title, Date releaseDate,
                       Integer artistId, Integer labelId) {
    JdbcTemplate template = new JdbcTemplate(this.dataSource);

    Object[] params = new Object[] {
            title, releaseDate, artistId, labelId, new Date()
    };
    int[] types = new int[] {
            Types.VARCHAR,
            Types.DATE,
            Types.INTEGER,
            Types.INTEGER,
            Types.DATE
    };

    int row = template.update(sql, params, types);
    System.out.println(row + " row inserted.");
}

范例2:

public class InsertDemo {
private static final String sql =
        "INSERT INTO records (title, " +
        "    release_date, " +
        "    artist_id, " +
        "    label_id, " +
        "    created) " +
        "VALUES (?, ?, ?, ?, ?)";

private DataSource dataSource;

public InsertDemo(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void saveRecord(String title, Date releaseDate,
                       Integer artistId, Integer labelId) {
    JdbcTemplate template = new JdbcTemplate(this.dataSource);

    Object[] params = new Object[] {
            title, releaseDate, artistId, labelId, new Date()
    };

    int row = template.update(sql, params);
    System.out.println(row + " row inserted.");
}

但是我不清楚为什么/应该使用第一个指定参数类型的参数。 我已经阅读了Javadoc,但仍不确定为什么需要指定类型。 我想念什么?

设置参数类型可为基础SQL语句提供正确性和优化(轻微)。 JdbcTemplate内部构建一个PreparedStatement并使用提供的/派生的类型为其设置值)。

在您的示例中,如果不指定Types数组,则将它们设置为SqlTypeValue.TYPE_UNKOWN ,最终将其猜测或解析为;

if (sqlType == SqlTypeValue.TYPE_UNKNOWN || sqlType == Types.OTHER) {
            if (isStringValue(inValue.getClass())) {
                ps.setString(paramIndex, inValue.toString());
            }
            else if (isDateValue(inValue.getClass())) {
                ps.setTimestamp(paramIndex, new java.sql.Timestamp(((java.util.Date) inValue).getTime()));
            }
            else if (inValue instanceof Calendar) {
                Calendar cal = (Calendar) inValue;
                ps.setTimestamp(paramIndex, new java.sql.Timestamp(cal.getTime().getTime()), cal);
            }
            else {
                // Fall back to generic setObject call without SQL type specified.
                ps.setObject(paramIndex, inValue);
            }
        }

看看org.springframework.jdbc.core.StatementCreatorUtils#setValue

因此,设置arg类型是一个好习惯。

没有Type参数:

包含绑定参数args参数的sql SQL绑定到查询(将其保留在PreparedStatement中以猜测相应的SQL类型); 可能还包含SqlParameterValue对象,这些对象不仅指示参数值,还指示SQL类型以及可选的小数位数

使用Type参数:

包含绑定参数args参数的sql SQL绑定到查询的argTypes参数的SQL类型(来自java.sql.Types的常量)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM