mybatis的高级映射(包括 resultmap标签,column属性传多个参数,select子查询自身)
重点看代码里的注释的解释
resultmap子查询时,传多个参数时的格式:column="{自定义参数名=字段名,…}"
对方用#{参数名}接受参数值,且 parameterType=…HashMap -->
@Results对应/标签
@Result对应标签
@Many对应子标签
select是其属性
@Select对应标签
调用者的sql:
<mapper namespace="cn.cong.ssm.mapper.UsersMapper">
<resultMap type="users" id="map01">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<!-- 传多个参数时的格式:column="{自定义参数名=字段名,....}"
对方用#{参数名}接受参数值,且 parameterType=...HashMap -->
<!-- property="menus"是指 该集合元素在Javabean对象中的Java属性名称-->
<!-- ofType="menu" 是该集合元素 的泛型类型,即menu是pojo类得类名-->
<collection property="menus" column="{uid=id,pid=pid}" ofType="menu" select="cn.cong.ssm.mapper.MenuMapper.selByPid" >
</collection>
</resultMap>
<!-- 因为resultmap的子查询需要传递参数pid,,
而下面的sql语句又查不到有关pid的字段,所以自己加了个pid的常数列,传一个为0的pid -->
<select id="selByUsers" parameterType="users" resultMap="map01">
select *,0 pid
from users
where username=#{username} and password=#{password}
</select>
</mapper>
被 子查询的sql
同时这个select 还自己调用自己 进行子查询
<mapper namespace="cn.cong.ssm.mapper.MenuMapper">
<resultMap type="Menu" id="selByPidMap">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="pid" column="pid"/>
<collection property="children" select="selByPid" column="{pid=id,uid=uid}"></collection>
</resultMap>
<!-- #{uid} uid 这句话 是为了这个sql自己调用自己进行子查询的时候方便传递参数
因为menu表中没有uid的信息,查不到的,所以指定 -->
<select id="selByPid" parameterType="java.util.HashMap" resultMap="selByPidMap">
select *,#{uid} uid
from menu
where id in (select mid from user_menu where uid=#{uid}) and pid=#{pid}
</select>
为方便理解这个自己调用自己的子查询,附上简单的 menu对应的表:
使用注解的写法:
对应的users的sql映射写法:
public interface UsersMapper {
//
// @Results(value={
// @Result(id=true,column="id",property="id"),
// @Result(column="username",property="username"),
// @Result(column="password",property="password"),
// @Result(property="menu",many=@Many(select="cn.cong.mapper.MenuMapper.selByPid"),column="{uid=id,pid=pid}")
// })
//如果需要传递多个参数 column="{"key"=列名,"key"=列名}" key自定义
//另一个查询中获取传递过来的参数 #{key}
//另一个查询public void select(Map<String,Object> map);
//@Select("select *,0 pid from users where username=#{username} and password=#{password}")
Users selByUsers(Users users);
}
对应的menu的sql映射写法:
public interface MenuMapper {
// @Results(value={
// @Result(id=true,property="id",column="id"),
// @Result(property="name",column="name"),
// @Result(property="pid",column="pid"),
// @Result(property="children",many=@Many(select="selByPid"),column="{uid=uid,pid=id}"),
// })
// @Select("select *,#{uid} uid from menu where id in (select mid from user_menu where uid=#{uid}) and pid=#{pid}")
List<Menu> selByPid(Map<String,Object> map);
}