1. 程式人生 > >mybatis實現多表一對一,一對多,多對多關聯查詢

mybatis實現多表一對一,一對多,多對多關聯查詢

轉自:https://blog.csdn.net/m0_37787069/article/details/79247321

1、一對一
關鍵字:association
作用:針對pojo物件屬性的對映
      property:pojo的屬性名
      javaType:pojo類名
(1) 巢狀結果: 使用巢狀結果對映來處理重複的聯合結果的子集

<resultMap type="com.gec.domain.Person" id="basePersonResultMap">
      <id column="id" property="personId"/>
      <result column="name" property="name"/>
      <result column="sex" property="sex"/>
      <result column="age" property="age"/>
    
      <association property="card" javaType="com.gec.domain.Card">
          <!-- 1、構造器注入
        <constructor>
              <idArg column="id" javaType="int"/>
              <arg column="code" javaType="string"/>
          </constructor> 
        -->
        <!-- 2、setter注入 -->
          <result column="id" property="cardId"/>
          <result column="code" property="code"/>
      </association>
 </resultMap>
  <select id="queryUserList" resultMap="basePersonResultMap">
      select p.id as personId,p.name,p.sex,p.age,c.*
      from tbl_person p,tbl_card c where p.card_id=c.id;
  </select> 

(2) 巢狀查詢:

通過執行另外一個SQL對映語句來返回預期的複雜型別
    column="引入執行另外定製sql方法的引數值(外來鍵)"
    select="執行定製sql方法名"
PersonMapper2.xml

<resultMap type="com.gec.domain.Person" id="basePersonResultMap">
      <id column="id" property="personId"/>
      <result column="name" property="name"/>
      <result column="sex" property="sex"/>
      <result column="age" property="age"/>
      <association property="card" 
          javaType="com.gec.domain.Card"
          column="card_id" 
          select="com.gec.mapper.CardMapper.queryCardById">
      </association>
</resultMap>
<select id="queryUserList" resultMap="basePersonResultMap">
    select * from tbl_person;
</select>
CardMapper.xml
<resultMap type="com.gec.domain.Card" id="baseCardResultMap">
      <id column="card_id" property="cardId"/>
      <result column="code" property="code"/>
</resultMap>
<select id="queryCardById" resultMap="baseCardResultMap">
      select c.id as card_id,c.code from tbl_card c 
    where c.id=#{id};
</select>
<resultMap type="com.gec.domain.Card" id="queryCardResultMap" extends="baseCardResultMap">
    <association property="person" javaType="com.gec.domain.Person">
          <id column="card_id" property="personId"/>
          <result column="name" property="name"/>
          <result column="sex" property="sex"/>
          <result column="age" property="age"/>
      </association>
</resultMap>
<select id="queryCardList" resultMap="queryCardResultMap">
    SELECT c.id AS card_id, c.code, p.* 
      FROM tbl_card c,tbl_person p WHERE c.id=p.card_id;
</select>
2 、一對多 mybatis如何實現一對多的實現?(學生與班級) (1) 巢狀結果: ClazzMapper.xml <resultMap type="com.gec.domain.Clazz" id="baseClazzResultMap">     <id column="id" property="clazzId"/>     <result column="clazz_name" property="clazzName"/>     <result column="code" property="code"/> </resultMap> <resultMap type="com.gec.domain.Clazz" id="queryClazzList2ResultMap" extends="baseClazzResultMap">     <collection property="studentList" javaType="ArrayList" ofType="com.gec.domain.Student">         <id column="stu_id" property="studentId"/>         <result column="name" property="name"/>         <result column="sex" property="sex"/>         <result column="age" property="age"/>     </collection> </resultMap> <select id="queryClazzList2" resultMap="queryClazzList2ResultMap">     SELECT c.*, s.id AS stu_id,s.name,s.sex,s.age     FROM tbl_clazz c LEFT JOIN tbl_student s     ON c.id=s.clazz_id; </select> StudentMapper.xml<resultMap type="com.gec.domain.Student" id="baseStudentResultMap">     <id column="id" property="studentId"/>     <result column="name" property="name"/>     <result column="sex" property="sex"/>     <result column="age" property="age"/> </resultMap>  <resultMap type="com.gec.domain.Student" id="queryStudentListResultMap" extends="baseStudentResultMap">     <association property="clazz" javaType="com.gec.domain.Clazz">         <id column="cls_id" property="clazzId"/>         <result column="clazz_name" property="clazzName"/>         <result column="code" property="code"/>     </association> </resultMap>  <select id="queryStudentList" resultMap="queryStudentListResultMap">     SELECT s.*,c.id AS cls_id,c.clazz_name,c.code     FROM tbl_student s,tbl_clazz c WHERE s.clazz_id=c.id; </select>
(2) 巢狀查詢: ClazzMapper.xml<resultMap type="com.gec.domain.Clazz" id="baseClazzResultMap">     <id column="id" property="clazzId"/>     <result column="clazz_name" property="clazzName"/>     <result column="code" property="code"/> </resultMap> <resultMap type="com.gec.domain.Clazz" id="queryClazzListResultMap" extends="baseClazzResultMap">     <collection property="studentList" javaType="ArrayList"          column="id" ofType="com.gec.domain.Student"          select="com.gec.mapper.StudentMapper.queryStudentByClazzId"     >     </collection> </resultMap> <select id="queryClazzList" resultMap="queryClazzListResultMap">     select * from tbl_clazz; </select> StudentMapper.xml <resultMap type="com.gec.domain.Student" id="baseStudentResultMap">     <id column="id" property="studentId"/>     <result column="name" property="name"/>     <result column="sex" property="sex"/>     <result column="age" property="age"/> </resultMap>  <resultMap type="com.gec.domain.Student" id="queryStudentListResultMap" extends="baseStudentResultMap">     <association property="clazz" javaType="com.gec.domain.Clazz">         <id column="cls_id" property="clazzId"/>         <result column="clazz_name" property="clazzName"/>         <result column="code" property="code"/>     </association> </resultMap>  <select id="queryStudentList" resultMap="queryStudentListResultMap">     SELECT s.*,c.id AS cls_id,c.clazz_name,c.code     FROM tbl_student s,tbl_clazz c WHERE s.clazz_id=c.id; </select> <!-- 根據班級的id,獲取學生列表 --> <select id="queryStudentByClazzId" resultMap="baseStudentResultMap">       select * from tbl_student where clazz_id=#{id};         </select> 3、多對多 商品表、訂單表之間就是以多對多關聯 商品與訂單的關係表 描述多對多的資料表實現 (1)商品pojo: Article.javapublic class Article implements Serializable {     private Integer articleId;     private String name;     private Double price;     private String remark;     private List<Order> orders;     省略setter/gettera方法 } (2)商品表對映: ArticleMapper.xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" > <mapper namespace="com.gec.mapper.ArticleMapper">     <resultMap type="article" id="baseArticleResultMap">         <id column="id" property="articleId"/>         <result column="NAME" property="name"/>         <result column="price" property="price"/>         <result column="remark" property="remark"/>     </resultMap>     <resultMap type="article" id="findArtcleByIdResultMap" extends="baseArticleResultMap">         <collection property="orders" javaType="ArrayList"             ofType="com.gec.domain.Article" column="id"             select="com.gec.mapper.OrderMapper.findOrderByArticleId"         >         </collection>     </resultMap>     <!-- 根據訂單id查詢商品 -->     <select id="findArtcleByOrderId" resultMap="baseArticleResultMap">         select * from tb_article  where id          in (select article_id from tb_item where order_id=#{id})      </select>     <select id="findArtcleById" resultMap="findArtcleByIdResultMap">         select * from tb_article  where id=#{id}     </select> </mapper> (3)訂單pojo: Order.java public class Order {     private Integer orderid;     private String code;     private Double total;     private List<Article> articles;     省略setter/getter方法 } (4)訂單表對映: OrderMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" > <mapper namespace="com.gec.mapper.OrderMapper">     <resultMap type="order" id="baseOrderResultMap">         <id column="orderId" property="orderid"/>         <result column="CODE" property="code"/>         <result column="total" property="total"/>     </resultMap>     <resultMap type="order" id="queryOrderByUserIdRsultMap" extends="baseOrderResultMap">         <collection property="articles" javaType="ArrayList"             ofType="article" column="orderId"             select="com.gec.mapper.ArticleMapper.findArtcleByOrderId">         </collection>     </resultMap>     <!-- 根據商品id查詢訂單 -->     <select id="findOrderByArticleId" resultMap="baseOrderResultMap">         select * from tb_order  where id          in (select order_id from tb_item where article_id=#{id})      </select> </mapper>