最近我在通過在XML文件中自定義SQl的時候,遇到了一個奇怪的問題。
數據庫表(tab_user)結構如下:
實體如下:
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Data
@TableName(value = "tab_user")
public class User implements Serializable {
@TableId(value = "pk_user_id",type = IdType.AUTO)
private Integer userId;
private String userName;
private String userSex;
}
定義的Mapper如下:
<select id="selectAllbySex" resultTyep="cn.entity.User">
SELECT * FROM tab_user ${ew.customSqlSegment}
</select>
使用繼承於BaseMapper<T>
中的方法都是正常的,沒有問題。
但自定義sql查詢回來的其他屬性皆是正常的,唯獨主鍵(與列名不一致)為null。
這個問題非常奇怪但是又非常嚴重,主鍵沒了這可咋整阿!於是轉頭去看控制台產生的打印的sql語句,發現Sql語句里是有userId
這個屬性的。
所以,問題非常明顯出在了查詢結果映射到實體這一環節。
但是,我明明已經為主鍵添加了@TableId
注解,否則繼承於BaseMapper<T>
的方法也不可能正常執行,我百思不得其解。
搜索了好幾個關鍵字也沒找到類似的問題,直到我點開了MybatisPuls
官方的github
地址,發現了這樣一個issue。
地址:https://github.com/baomidou/mybatis-plus/issues/3976
大概看了一下,這位大兄弟和我及其相似的遭遇,不同的是他是非主鍵屬性,我是主鍵屬性,並且他和我都是屬性名與列名不同。
當我看到了這里時,我瞬間豁然開朗....
我靠!!!這不就是我告訴張三他表哥他媽穿紅色衣服,然后我去問張三他媽穿的啥顏色衣服嗎?
於是問題解決了,在不能修改表名的情況下(建議列名和屬性名一致,或者滿足駝峰命名法,如pk_user_id
則為pkUserId
,下划線轉駝峰需要在配置文件中application.properties
添加mybatis.configuration.map-underscore-to-camel-case=true
)
告訴mybatis
映射關系就好。
修改xml的內容如下:
<select id="selectAllbySex" resultMap="userResultMap">
SELECT * FROM tab_user ${ew.customSqlSegment}
</select>
添加映射關系:
<resultMap id="userResultMap" type="cn.entity.User">
<id column="pk_user_id" property="userId"></id>
</resultMap>