5.3 mybatis之autoMappingUnknownColumnBehavior作用


autoMappingUnknownColumnBehavior是< settings >配置下的属性,该属性是指定发现自动映射目标未知列(或未知属性类型)的行为。就是说当数据库中的字段找不到映射java对象的属性或者与java对象对应属性的类型不匹配时会产生什么样的行为。

autoMappingUnknownColumnBehavior属性可以指定当映射失败时会产生三种行为,默认情况配置的是NONE

  • NONE: 不做任何反应;
  • WARNING: 输出警告日志(‘org.apache.ibatis.session.AutoMappingUnknownColumnBehavior’ 的日志等级必须设置为 WARN);
  • FAILING: 映射失败 (抛出 SqlSessionException)。

下面分别看下三种情况

1. NONE

假设java类User中只有id和name两个属性,而对应数据库表user有三个字段,分别为ID、NAME、AGE,库表和java对象不能完全匹配,看下会发生什么

public class User  {
    private int id;
    private String name;
 } 

user表
在这里插入图片描述
在mybatis配置文件配置autoMappingUnknownColumnBehavior的值为NONE

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>
</settings>

下面为mapper文件中对应的SQL

<select id="selectOne" parameterType="int" resultType="com.lzj.bean.User">
    select * from user where id=#{id}
</select>

执行这个SQL,输出结果如下所示,输出的id=2,name=‘xiaoli’,库表中的AGE字段没有对应的映射属性,丢弃掉了,程序也不会报错。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 1713847712.
==>  Preparing: select * from user where id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age
<==        Row: 2, xiaoli, 26
<==      Total: 1
输出结果:User{id=2, name='xiaoli'}

2. WARNING

下面看下第二种情况,当autoMappingUnknownColumnBehavior取值WARNING时,修改mybatis的 < settings >配置如下所示

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
</settings>

重新执行上面的SQL,输出结果如下所示,发现也能正常输出User{id=2, name=‘xiaoli’},库表user的AGE列没有找到对应的java对象user的属性,丢弃掉了,程序也没有报错,但在自动映射后打印出了下面一条警告“Unknown column is detected on ‘com.lzj.dao.UserDao.selectOne’ auto-mapping. Mapping parameters are [columnName=age,propertyName=age,propertyType=null]”。所以当autoMappingUnknownColumnBehavior取值WARNING时,也不会报错但会打印出警告(设置的日志级别一定要小于等于warn)。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 2070438137.
==>  Preparing: select * from user where id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age
<==        Row: 2, xiaoli, 26
Unknown column is detected on 'com.lzj.dao.UserDao.selectOne' auto-mapping. Mapping parameters are [columnName=age,propertyName=age,propertyType=null]
<==      Total: 1
输出结果:User{id=2, name='xiaoli'}

3. FAILING

下面看下最后一种,当autoMappingUnknownColumnBehavior取值FAILING时,看下如果没有完全映射上会发生情况
修改mybatis配置文件如下所示

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="autoMappingUnknownColumnBehavior" value="FAILING"/>
</settings>

然后重新执行上面的SQL,输出结果如下所示,程序直接抛异常了,说明当库表中列不能映射到java对象中属性上,程序抛异常处理。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 1617550648.
==>  Preparing: select * from user where id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age
<==        Row: 2, xiaoli, 26
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.session.SqlSessionException: Unknown column is detected on 'com.lzj.dao.UserDao.selectOne' auto-mapping. Mapping parameters are [columnName=age,propertyName=age,propertyType=null]
### The error may exist in mapper/UserMapper.xml
### The error may involve com.lzj.dao.UserDao.selectOne
### The error occurred while handling results
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值