數據庫和對象的屬性名不一致是很常見的問題,這個時候依從表字段到對象屬性名的按名稱匹配映射已經搞不定這個了,下面是幾種解決方案。
1. 開啟駝峰轉換
如果數據庫中的字段名與對象只是簡單的不一致的話,比如名字是一樣的,只是分隔方式不一樣,在數據庫中使用了下划線分隔,而在對象中使用了駝峰分隔,如果都是這樣子的話倒不是特別麻煩,只需要在mybatis的配置文件中開啟駝峰轉換即可。
<setting name="mapUnderscoreToCamelCase" value="true"/>
2. 在SQL查詢語句中使用別名來適配
還有一種情況就是絕大部分情況下都是可以適配得上的,但是只有幾列適配不上,這個時候定義單獨的ResultMap感覺有點不值當(事實上,從可維護性上來考慮定義ResultMap絕對是首選),所以我們就在查詢數據的時候在SQL語句中使用別名來使數據庫列名能夠適配得上對象的屬性名。
比如在數據庫中用戶名列叫做username,在對象中用戶名叫做name,由於種種原因我們不能去修改這兩個名字了但是還要讓它們能夠對應得起來,下面是一種可能的解決方案:
<select id="loadById" parameterType="string" resultType="user"> SELECT id, username AS name, passwd FROM t_user WHERE id=#{id} </select>
甚至在指定別名的時候還可以在別名中包含點符號來導航,比如使用role.name來指定注入到user對象的role屬性的name屬性中,下面是一個簡單的例子:
<select id="load" parameterType="long" resultType="org.cc11001100.mybatis.domain.User"> SELECT t1.id, username, passwd, t3.id AS 'role.id', t3.name AS 'role.name' FROM t_user AS t1 JOIN t_user_role AS t2 ON t1.id=t2.user_id JOIN t_role AS t3 ON t3.id=t2.role_id WHERE t1.id=#{id}; </select>
3. 自定義ResultMap
最后,實在是不一致得比較離譜,基本上大部分的數據庫字段和對象的名字都是不對應的,這種情況下定義一個ResultMap來解決這個問題絕對是上策。
<select id="loadById" parameterType="string" resultMap="userResultMap"> SELECT * FROM t_user WHERE id=#{id} </select>
然后在resultMap標簽中配置不同字段的映射:
<resultMap id="userMap" type="org.cc11001100.mybatis.domain.User" autoMapping="true"> <id column="id" property="id"/> <result column="username" property="name"/> </resultMap>resultMap標簽有個屬性叫做autoMapping,當指定為true的時候表示沒有手動使用id或者result標簽指定映射的屬性就自動映射,這樣將這個屬性置為true,就可以只指定表字段名稱與對象屬性名不匹配的字段,大大減少了工作量。
.