前言
考虑到在Select时使用AS和方案一其实没什么差别,在介绍ResultMap之前,顺便带过一下。
方案二-Select .... AS
当我们的数据库列名和对象字段之间不是驼峰式命名的关系,我们可以在Select时使用AS,使得列名和对象名匹配上。
映射文件中是本次会执行的sql,我们会查出id,city_id,city_name,city_en_name。 按照开启的驼峰式命名开关,我们会对应到对象的id,cityId,cityName,cityEnName字段。
<select id="selectCity" resultType="po.CityPO">
select id,city_id,city_name,city_en_name from SU_City where id = #{id}
</select>
不过在这次,我们对PO做了小小的改动,把cityEnName改成了cityEnglishName。
public class CityPO {
Integer id;
Long cityId;
String cityName;
String cityEnglishName; // 由cityEnName改成了cityEnglishName
由于找不到匹配的列,cityEnlishName肯定没法被反射赋值,要为Null了。
CityPO{id=2, cityId=2, cityName='北京', cityEnglishName='null'}
解决办法: 在Select字段的时候使用AS,下面是改动后的映射文件。
<select id="selectCity" resultType="po.CityPO">
select id,
city_id,
city_name,
city_en_name AS cityEnglishName
from SU_City
where id = #{id}
</select>
改动后执行得到的结果如下。
CityPO{id=2, cityId=2, cityName='北京', cityEnglishName='beijing'}
那么我们来看看它是如何生效的,主要的代码在哪里。在昨天我们第一个介绍的函数handleRowValues中传入了参数rsw,它是对ResultSet的一个包装,在这个包装里,完成了具体使用哪个名字作为数据库的列名。
final ResultSetWrapper rsw = new ResultSetWrapper(rs, configuration);
handle