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");