1 minute read

Error setting a property: IllegalArgumentException 的一种可能的原因

ibatis 无法将 null 值赋给 Java 的 int 类型变量而产生的。将 resultMap 映射的 bean 中的 int 类型属性改为 Integer 类型就可以了。

同理,对 longLong 类型也是一样。

也可以考虑对字段设置默认值

<sqlMap> 若是加 namespace 的话,单凭 sql sentence 的 id 是不可能定位到 sql sentence 的

若是多个 sqlmap 中都有一句 <sql id="table">xxx</sql>,那么 id="table" 会被报错 “duplicated id”。加 namespace 可以解决但是又会陷入上述的问题

select count(1) 的 sqlmap 一定要记得指定 resultClassjava.lang.Integer

不然得到的结果会是 null

could not instantiate result class 的一种可能的原因

java.lang.RuntimeException: JavaBeansDataExchange could not instantiate result class.
     Cause: java.lang.InstantiationException: com.bar.foo.po.GlobalData

一个可能的原因是因为 PO 写了带参构造器,然后 ibatis 找不到 无参构造器,无法初始化 PO

update 操作是不会触发 on update

如果字段是 ctime timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,然后你去 update ctime,那 ctime 是你 update 的值呢?还是被 on update CURRENT_TIMESTAMP 了呢?

答案是前者,update 成功~

如果没有找到记录,queryForList 也不会返回 null,而是返回一个空的 list

如何查看 ibatis 执行的 sql?

允许 ConsoleAppender 输出 debug,然后加上下面两行

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

XML 写法为:

<!-- for ibatis debug -->
<appender name="LOG.DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/home/logs/foo/log4d.log" />
    <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern"
              value="%d{yyyy-MM-dd HH:mm:ss} &lt;mailclub&gt; %-5p %C - %m%n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
          <param name="LevelMin" value="DEBUG" />
          <param name=LevelMax" value="FATAL" />
    </filter>
</appender>
<logger name="java.sql.Connection" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="LOG.DEBUG" />
</logger>
<logger name="java.sql.PreparedStatement" additivity="false">
    <level value="DEBUG" />
    <appender-ref ref="LOG.DEBUG" />
</logger>
<!-- for ibatis debug -->

#param#$param$ 的区别

#& 其实与 <c:out> 一样都是输出策略。

简单说就是 #param# 会做类型转换,如果是 int 就直接输入;如果是 String 就输出 ‘xxx’,自动给你加上引号

$param$ 是不会输出引号的,你传的是啥,它按原样输出。所以 $ 方式一般用于传入数据库对象,比如 from $tableName$ where ($condition$)

Categories:

Updated:

Comments