• 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。

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

  • 相关阅读:
    Mysql源码学习——Connection Manager
    MySQL源码学习——MDL字典锁
    Mysql源码学习——用户认证原理与实现
    Mysql源码学习——Thread Manager
    你真的了解如何登录MySQL么?
    CSDN密码库窥视各大数据库性能
    Mysql源码学习——没那么简单的Hash
    How to use NoSQL in MySQL
    Oracle的聚簇也Hold不住了
    Python 错误解决方法
  • 原文地址:https://www.cnblogs.com/chenrunlin/p/5446879.html
Copyright © 2020-2023  润新知