【问题标题】:Setting SQL statement parameter value: column index 1, parameter value [name], value class [java.lang.String], SQL type unknown设置SQL语句参数值:列索引1,参数值[name],值类[java.lang.String],SQL类型未知
【发布时间】:2018-03-07 07:16:01
【问题描述】:

我正在使用 NamedParameterJdbcTemplate 将参数传递给 Query。但是我正在获取跟踪详细信息作为警告并且没有显示参数绑定。主要问题是它显示了正在执行的 sql,但我希望参数也是它的一部分,但只有?(问号)出现。在警告绑定发生并且执行之后很好,但绑定在日志中不可见。请帮我检查一下。

列索引1,参数值[mike],值类 [java.lang.String],SQL 类型未知 列索引 2,参数值 [1],值类[java.lang.Integer],SQL类型未知

存储库:

@Repository
public class DataRepository {
    private static Logger log = LoggerFactory.getLogger(DataRepository.class);

    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;

    public Data findDataObjet() throws Exception {

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("id1", "mike");
        parameters.put("id2", new Long(1));

        String sqlString = "select * from table1 where id1 = ":id1" and id2 = :id2";

        Data extObj = jdbcTemplate.query(sqlString, parameters, (rs) -> {
            if (rs != null && rs.next()) {
                Data innerObj = new Data();
                innerObj.setName(rs.getString("name"));             
                return innerObj;
            } else {
                log.info("No records found:"+rs);
                return null;
            }
        });

        return extObj;

    }
}

application.properties:

spring.datasource.url=url
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

spring.datasource.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=2

logback-spring.xml:

<springProfile name="dev">
        <logger name="org.springframework.jdbc.core.JdbcTemplate">
            <level value="trace" />
        </logger>
        <logger name="org.springframework.jdbc.core.StatementCreatorUtils">
            <level value="trace" />
        </logger>
        <appender name="dailyRollingFileAppender"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${logsPath}TSYS2DM%d{MMddyyyy}.log
                </FileNamePattern>
                <maxHistory>4</maxHistory>
            </rollingPolicy>

            <encoder>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
                    %logger{35}-%msg %n</Pattern>
            </encoder>

        </appender>
        <root level="INFO">
            <appender-ref ref="dailyRollingFileAppender" />
        </root>
    </springProfile>

日志跟踪:

2018-03-07 12:19:42.888 DEBUG 30224 --- [resources/input] o.s.jdbc.core.JdbcTemplate               : Executing prepared SQL query
2018-03-07 12:19:42.889 DEBUG 30224 --- [resources/input] o.s.jdbc.core.JdbcTemplate               : Executing prepared SQL statement [ select * from table1 where id1 = "?" and id2 = ?;]
2018-03-07 12:19:43.132 TRACE 30224 --- [resources/input] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 1, parameter value [mike], value class [java.lang.String], SQL type unknown
2018-03-07 12:19:43.132 TRACE 30224 --- [resources/input] o.s.jdbc.core.StatementCreatorUtils      : Setting SQL statement parameter value: column index 2, parameter value [1], value class [java.lang.Integer], SQL type unknown
2018-03-07 12:19:43.439  INFO 30224 --- [resources/input] c.t.f.c.t.t.db.TRMAccountDataRepository  : found record with cnsmr_id:1234

【问题讨论】:

  • 参数绑定显示:Setting SQL statement parameter value: column index 1, parameter value [mike], value class [java.lang.String], SQL type unknown。执行准备好的语句不包括用值替换 SQL 中的命名参数。它包括向驱动程序传递带有参数占位符的查询,并为所有参数设置值。你所看到的一切都很正常。
  • @Chids 根据链接,这是正常的,未知可以忽略,因为它即将到来超过 5 年,并且 api 正在像这样工作。
  • @JBNizet 感谢您的回复。
  • @sunleo,是的,行为没有改变。对此没有任何改进

标签: java spring log4j spring-jdbc


【解决方案1】:

使用Wrapper类SqlParameterValue,通知会消失:

    Map<String, Object> parameters = new HashMap<>();
    parameters.put("id1", new SqlParameterValue(Types.VARCHAR,"mike"));
    parameters.put("id2", new SqlParameterValue(Types.BIGINT,new Long(1)));

在日志文件中,您将看到 SQL 类型 91... 而不是 SQL 类型未知

【讨论】:

  • SqlParameterValue 来自哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多