mybatis---实现关联表查询

推荐学习博客:

  1、http://www.cnblogs.com/xdp-gacl/p/4264440.html

  2、http://www.cnblogs.com/yaobolove/p/5444046.html

以前觉得hibernate的formula属性配置特别方便,作用就是说白了就是用一个查询语句动态的生成一个类的属性,数据库表又不存在这个属性,例子如下:

<hibernate-mapping>
    <class name="com.bsit.device.hibernate.pojo.User_info" table="user_info"   >
		<id name="userid" type="java.lang.String">
			<column name="USERID" ><comment>用户id</comment></column>
			<generator class="assigned"/>
		</id>
			
		<property name="account" type="java.lang.String">
			<column name="ACCOUNT" ><comment>用户账号</comment></column>
		</property>
					
		<property name="username" type="java.lang.String">
			<column name="USERNAME" ><comment>用户名称</comment></column>
		</property>
					
		<property name="password" type="java.lang.String">
			<column name="PASSWORD" ><comment>密码</comment></column>
		</property>
			
		<property name="org_id" type="java.lang.String">
			<column name="org_id" ><comment>用户所属的组织机构id</comment></column>
		</property>
			
		<property name="org_name" type="java.lang.String" formula="(select o.orgname from org o where o.orgid=org_id )" />
		
    </class>
</hibernate-mapping>

  但本人不太喜欢hibernate,还是感觉直接sql来的爽,所以mybatis成了最爱,但此功能在mybatis中是怎样实现的呢?

<mapper namespace="com.bsit.system.mapper.Sys_userMapper" >

	<resultMap id="resultMap" type="com.bsit.system.model.Sys_user" >
          <id property="id" column="id"/>   
          <result property="username" column="username"/>
          <result property="account" column="account"/>
          <result property="password" column="password"/>
          <result property="role_id" column="role_id"/>
          <association property="role_name" column="role_id" select="getRoleNameByRoleId"/>   
      </resultMap>
    
      <!-- 根据id获取对象 -->
	<select id="getRoleNameByRoleId" parameterType="String" resultType="String">
		select t.r_role_name from sys_role t where t.id = #{id}
	</select>
	
	<!-- 根据id获取对象 -->
	<select id="getSys_userById" parameterType="String" resultMap="resultMap">
		select t.* from sys_user t where t.id = #{id}
	</select>
	
</mapper>

  service调用getSys_userById,返回值再根据关联association调用getRoleNameByRoleId,getRoleNameByRoleId方法中的参数就是association标签中column的值,

如果有多个参数,则可写成:

<association property="role_name" column="{acc=account,pas=password}" select="getRoleNameByRoleId"/>  
<!-- 根据id获取对象 -->
<select id="getRoleNameByRoleId" parameterType="java.util.Map" resultMap="resultMap">
	select t.* from sys_user t where t.account = #{acc} and t.password = #{pas}
</select>

  关联查询传入多值,column当map使用,是键值对形式。在具体查询语句中,直接使用其键就可以取到其值。column中如果有多个参数时,则对应的select标签的parameterType就必须是java.util.Map,或java.util.HashMap。

  如果想要在对象中关联属性,则可参考推荐博客。

原文地址:https://www.cnblogs.com/chenrunlin/p/5446879.html