mybatis的高级映射 (resultmap标签,column属性传多个参数,,select子查询自身)

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对应的表:
 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);
    }
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 MyBatis 中,可以通过 `association` 标签将两个表或实体类关联起来。当查询结果包含两个或多个表的数据时,可以使用 `association` 标签将这些数据关联起来。 如果你想在 `association` 中递多个参数,可以使用 `parameterType` 属性指定一个自定义的参数类型,然后在 SQL 语句中使用 `${property.field1}, ${property.field2}, ...` 的方式引用这些参数。 举个例,假设我们有两个实体类 `Order` 和 `User`,它们之间存在一对多的关系,一个用户可以有多个订单。我们可以通过以下方式配置 `resultMap`: ```xml <resultMap id="orderResultMap" type="Order"> <id property="id" column="order_id" /> <result property="orderNo" column="order_no" /> <result property="userId" column="user_id" /> <association property="user" javaType="User" resultMap="userResultMap"> <id property="id" column="user_id" /> <result property="username" column="username" /> <result property="email" column="email" /> </association> </resultMap> <resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="username" /> <result property="email" column="email" /> </resultMap> ``` 在 SQL 语句中,我们可以使用 `${param.field1}, ${param.field2}, ...` 的方式引用这些参数,如下所示: ```xml <select id="getOrderByUserId" resultMap="orderResultMap"> SELECT o.order_id, o.order_no, o.user_id, u.username, u.email FROM orders o LEFT JOIN users u ON o.user_id = u.user_id WHERE o.user_id = #{userId} </select> ``` 在 Java 代码中,我们可以通过 `Map` 或自定义类型的方式递多个参数,例如: ```java public interface OrderMapper { List<Order> getOrderByUserId(Map<String, Object> params); List<Order> getOrderByUserId(OrderQuery query); } public class OrderQuery { private Long userId; private String field1; private String field2; // getter/setter 略 } ``` 使用 `Map` 参数的话,可以将多个参数打包成一个 `Map`,然后将该 `Map` 入 SQL 语句。使用自定义类型的方式参数的话,需要在 `parameterType` 属性中指定该类型,例如: ```xml <select id="getOrderByUserId" resultMap="orderResultMap" parameterType="com.example.OrderQuery"> SELECT o.order_id, o.order_no, o.user_id, u.username, u.email FROM orders o LEFT JOIN users u ON o.user_id = u.user_id WHERE o.user_id = #{userId} AND o.field1 = #{field1} AND o.field2 = #{field2} </select> ``` ### 回答2: Mybatis中的ResultMap Association用于处理多个参数的情况。当我们在查询过程中需要用到多个参数时,可以使用ResultMap Association来将多个参数关联起来,以方便我们进行查询操作。 首先,在Mapper.xml文件中定义ResultMap,使用<resultMap>标签来定义关联关系。在<resultMap>标签标签<association>中,我们可以设置关联的多个参数及其对应的属性。 例如,假设我们有两个参数,一个是User对象的id,另一个是Order对象的orderId。那么我们可以使用如下的ResultMap来定义关联关系: <resultMap id="userOrderResultMap" type="User"> <id property="id" column="user_id"/> <association property="order" javaType="Order"> <id property="orderId" column="order_id"/> </association> </resultMap> 在这个ResultMap中,我们将User对象的id属性与"user_id"字段进行了映射,并将Order对象的orderId属性与"order_id"字段进行了映射。通过关联关系,我们可以在查询过程中同时获取到User对象和Order对象的相关属性。 接下来,我们可以在Mapper接口的方法中使用这个ResultMap来进行查询操作。在查询语句中,我们可以使用关联的多个参数,如#{id}和#{orderId}。 例如,假设我们需要根据用户id和订单id查询订单详情,那么可以使用如下的SQL语句: <select id="getUserOrderDetail" resultMap="userOrderResultMap"> SELECT * FROM user u JOIN order o ON u.id = o.user_id WHERE u.id = #{id} AND o.order_id = #{orderId} </select> 这样,当我们调用getUserOrderDetail方法时,将入id和orderId两个参数Mybatis会根据这些参数进行查询,并将查询结果封装成User对象和关联的Order对象返回。 总之,使用MybatisResultMap Association可以方便地处理多个参数的情况,通过定义关联关系,我们可以在查询过程中同时获取到多个参数的相关属性。 ### 回答3: mybatisresultmap association可以用于映射多个参数。 在使用resultmap association时,需要创建一个主resultmap和一个关联的resultmap。主resultmap用于映射主对象的属性,而关联的resultmap用于映射关联对象的属性。 首先,我们需要在主resultmap中定义一个association元素,用于关联对象的映射。在association元素中,我们可以指定一个property属性,用于指定主对象中关联对象的属性名称;同时,我们还需要指定一个javaType属性,用于指定关联对象的类型;此外,我们还可以在association元素中定义id元素和result元素,用于映射关联对象的属性。 接下来,在关联的resultmap中,我们可以定义多个id元素和result元素,用于映射关联对象的属性。在id元素和result元素中,我们需要指定一个column属性,用于指定数据库中的列名;同时,我们还需要指定一个property属性,用于指定关联对象中属性的名称。 最后,在使用resultmap association时,我们需要在主resultmap中调用关联的resultmap。可以通过在主resultmap的id元素和result元素中使用association元素的select属性来关联关联的resultmap。在select属性中,我们可以指定一个SQL语句或者一个已经定义的SQL片段的名称,用于查询关联对象的数据。 总而言之,通过使用resultmap association,我们可以将多个参数关联起来,实现复杂的数据映射

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值