懵逼时候的致命伤害
先扯一下今天我在公司懵逼时候被一个说出来想碰死的很小很小的错误,就是使用mybatis框架查询一条记录,而且是根据唯一字段查询,这特么够简单了吧,凭我手速5分钟不到解决问题,但是在哪个不知名的阴沟里翻船了,整整用debug来来回回测了30分钟,别说我菜,这纯属是对框架的基础知识掌握不太好导致的,这里特意记录一下,也是为你们好,瞜一眼是福啊!
表结构:
实体类:
private String id; //主键 private String ownerName; //现机动车所有人 private Integer plateType; //号牌种类 private String licensePlate; //车牌号 private String vin; //VIN码 private String carColor; //车身颜色 private String model; //车辆品牌(车型) @DateTimeFormat(pattern="yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date registretionTime; //初次登记时间 private String registrationAddress; //登记住所详细地址 private String mobile; //车主联系电话 private String engineNumber; //发动机号码 private String ownerImgUrl; //车主信息图片 private Integer carStatus; //机动车状态 private Integer useType; //使用性质 private Integer mortgagerStatus; //抵押状态
翻船后的代码现场:
根据唯一字段查询某条记录:
OwnerInfo owner = ownerInfoService.selectOwnerInfoByVIN(ownerInfo.getVin());
1 <select id="selectOwnerInfoByVIN" parameterType="java.lang.String" resultType="com.tgsit.cjd.model.OwnerInfo"> 2 SELECT * 6 FROM cgs_owner_info 7 <where> 8 <if test="vin != null and vin !=''"> 9 vin=#{vin,jdbcType=VARCHAR} 10 </if> 11 </where> 12 </select>
这时候你debug调试查看查询结果中的属性值,有的属性值是映射成功的,有的是映射不成功的,为什么?因为查询后的字段名称有的跟实体类中的属性名称不一致,没有映射成功导致的。
解决手段,再说一次狠简单:
<select id="selectOwnerInfoByVIN" parameterType="java.lang.String" resultType="com.tgsit.cjd.model.OwnerInfo"> SELECT id,owner_name ownerName,plate_type plateType,license_plate licensePlate,vin,car_color carColor,model, registration_time registretionTime,registration_address registrationAddress, mobile,engine_number engineNumber,owner_img_url ownerImgUrl, car_status carStatus,use_type useType,mortgager_status mortgagerStatus FROM cgs_owner_info <where> <if test="vin != null and vin !=''"> vin=#{vin,jdbcType=VARCHAR} </if> </where> </select>
就是把查询到的字段想要映射到实体类中,则必须给查询后的字段起别名,保证与实体类中的属性名一致即可。