Association聯合select使用容易出差問題地方
mapper配置:
- <resultMap type="com.demo.sys.entity.Menu" id="menuMap">
- <id property="id" column="id" />
- <result property="name" column="menu_name" />
- <result property="url" column="url" />
- <result property="active" column="isactive" />
- <result property="createDate" column="createdate" />
- <result property="updateDate" column="updatedate" />
- <result property="bak1" column="bak1" />
- <result property="bak2" column="bak2" />
- <result property="bak3" column="bak3" />
- <result property="locale" column="locale" />
- <result property="orderNum" column="ordernum" />
- <association property="module" column="module_id" resultMap="moduleMap" select="queryModule">
- </association>
- </resultMap>
- <resultMap type="com.demo.sys.entity.Module" id="moduleMap">
- <id property="id" column="id" />
- <result property="name" column="module_name" />
- <result property="remark" column="remark" />
- <result property="createDate" column="createdate" />
- <result property="updateDate" column="updatedate" />
- </resultMap>
- <select id="queryModule" resultMap="moduleMap" >
- select * from sys_module where id =#{id}
- </select>
這種配置導致問題:
Menu.module的屬性很多都是爲null,除了id不爲空。
經過調試發現問題出在:
- <association property="module" column="module_id" resultMap="moduleMap" select="queryModule">
- </association>
去掉resultMap,修改爲:
- <association property="module" column="module_id" select="queryModule">
- </association>
結果Menu.module的屬性可以正確被mybaties設置進去,都有值了。
Association聯合select使用值得注意的細節地方:
這是我使用mybatis的Association聯合select使用存着問題的地方,
- <association property="module" column="module_id" select="queryModule">
- </association>
mybatis會根據類似resultSet.getInt("module_id")的值,壓入到select 爲queryModule 的SQL輸入參數裏面。
- <select id="queryModule" resultMap="moduleMap" >
- select * from sys_module where id =#{id}
- </select>
我以前一直糾結於#{id}是指Menu.id還是module的主鍵或外鍵id屬性。
而select 爲queryModule的SQL輸入參數可以隨便給名稱,只要是輸入參數與壓入進去的值類型相同就行了,可以寫成:
- select * from sys_module where id =#{jjjasdasdid}
不管輸入參數名稱是什麼,mybatis最終會執行:
效果爲:select * from sys_module where id =resultSet.getInt("module_id");