spring boot + mybatis詳細使用(六)——關聯查詢的寫法。

1. 一對一關聯查詢:vue

表A字段:id,name,b1
表B字段:id,name,xx

· 首先使用自動生成工具生成A.java(entity)和AMapper.java以及AMapper.xml。java

· 由於是關聯查詢,因此咱們須要本身定義一個entity,取名爲AB.java,放在A.java同級目錄下。sql

· 在AMapper.xml加入如下代碼:mybatis

<resultMap id="ABResultMap" type="com.xxx.model.AB"> <!-- type指的是最後結果對應的entity位置 -->
    <id column="id" jdbcType="INTEGER" property="trainId" />
    <result column="name" jdbcType="VARCHAR" property="title" />
    <association column="b1" property="b1" javaType="com.xxx.model.B">  <!-- type關聯表對應的entity的位置 -->
    	<id column="id" jdbcType="INTEGER" property="id" />
	    <result column="name" jdbcType="VARCHAR" property="name" />
	    <result column="xxx" jdbcType="VARCHAR" property="xxx" />
    </association>
  </resultMap>
<select id="findOneByPrimaryKey" parameterType="java.lang.Integer" resultMap="ABResultMap">
  	select 
  	  a.id as id, a.name as name, b1.id, b1.name, b1.xxx
  	from
  	  tran_A a
  	left join
  	  b b1
  	on 
  	  a.b1 = b1.id
  	where 
  	  a.id = #{id, jdbcType=INTEGER}
  </select>

· 在AMapper.java中加入:app

public A findOneByPrimaryKey(Integer id);

簡單的關聯查詢搞定。工具

-----------------------------------------------------------------------------------------------------------------------spa

· 一張表多字段對應同一張表,關聯查詢時,不能簡單的使用上述方法,不然查出來的結果會有問題:code

好比:
A:id,name,b1,b2。  (這裏的b1與b2對應的數據不同,假設對應的數據是:b1(1,b1,xx1),b2(2,b2,xx2))
B: id,name,xxx。

若是採用1的寫法,寫兩次association,同時sql能正確查出數據。
但最後的結果是: A(1,a1,b1(1,b1,xx1),b2(1,b1,xx1))

所以,咱們使用第二種關聯查詢的方法,嵌套查詢。xml

修改一下代碼blog

<resultMap id="ABResultMap" type="com.xxx.model.AB"> <!-- type指的是最後結果對應的entity位置 -->
    <id column="id" jdbcType="INTEGER" property="trainId" />
    <result column="name" jdbcType="VARCHAR" property="title" />
    <association column="b1" property="b1" javaType="com.xxx.model.B" select="com.xxx.mapper.BMapper.selectByPrimaryKey">  <!-- type關聯表對應的entity的位置,若是這裏查詢的是全部數據,且咱們對應的select的那個查詢自己就能夠執行的話,association 裏面關於字段的屬性徹底能夠省略!!! -->
    	<id column="id" jdbcType="INTEGER" property="id" />
	    <result column="name" jdbcType="VARCHAR" property="name" />
	    <result column="xxx" jdbcType="VARCHAR" property="xxx" />
    </association>
    <association column="b2" property="b2" javaType="com.xxx.model.B" select="com.xxx.mapper.BMapper.selectByPrimaryKey">  <!-- type關聯表對應的entity的位置 -->
    	<id column="id" jdbcType="INTEGER" property="id" />
	    <result column="name" jdbcType="VARCHAR" property="name" />
	    <result column="xxx" jdbcType="VARCHAR" property="xxx" />
    </association>
  </resultMap>

這裏的select=""後面的內容有多種寫法,若是sql語句就在本Mapper.xml裏面,那麼直接寫sql的id名就能夠。若是在其餘mapper.xml文件,那麼這裏須要訪問sql文對應接口Mapper.java的java方法,就好比這裏的寫法。

<select id="findOneByPrimaryKey" resultMap="ABResultMap">
        select * from A where id=#{id}
  </select>

其餘代碼與1同樣。完成!

解釋一下,association標籤內的字段實際上是能夠省略的,他會默認拿到select裏面的字段,再次property指的是查詢結果存檔的model的字段的名字,column指的是當前表與另外一個表關聯的表字段!

對於多條件的關聯查詢,咱們只須要修改上面的 column 屬性便可

column="{prop1=col1, prop2=col2}"

這裏的意思解釋一下  prop一、prop2是查詢語句中的條件的字段名。col一、col2是字段名。

例子:

<resultMap id="blogResult" type="Blog">

  <association property="author" column="{id=author_id,likename=author_name}" javaType="Author" select="selectAuthor"/>

</resultMap>


<select id="selectBlog" resultMap="blogResult" parameterType="java.lang.String">

  SELECT author_id,author_name FROM BLOG WHERE ID = #{id} 

</select>


<select id="selectAuthor" resultType="Author" parameterType="java.util.HashMap">

  SELECT * FROM AUTHOR WHERE 1=1

  <if test="id != null and id != '' ">

         and ID = #{id} 

  </if>

  <if test="likename != null and likename != '' ">

         and name like CONCAT('%',#{likename},'%')

  </if>

</select>

注意必定要保證你column裏面定義的名字必定要對應好。

-----------------------------------------------------------------------------------------------------------------------

2. 一對多查詢:(這裏寫一個自關聯查詢)

<resultMap id="TreeResultMap" type="com.xxx.mybatis.model.MstMenuTree">
    <id column="menu_id" jdbcType="INTEGER" property="menuId" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="pid" jdbcType="INTEGER" property="pid" />
    <result column="type" jdbcType="CHAR" property="type" />
    <result column="vue_link" jdbcType="VARCHAR" property="vueLink" />
    <result column="z_index" jdbcType="CHAR" property="zIndex" />
    <result column="descpt" jdbcType="VARCHAR" property="descpt" />
    <result column="code" jdbcType="VARCHAR" property="code" />
    <result column="icon" jdbcType="VARCHAR" property="icon" />
    <result column="path" jdbcType="VARCHAR" property="path" />
    <result column="enable_flag" jdbcType="CHAR" property="enableFlag" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    <collection column="{pid=menu_id, roleId=role_id}" property="children" ofType="com.cjsz.management.mybatis.model.MstMenuTree" select="com.xxx.mybatis.mapper.MstMenuMapper.findMenuTree">
    </collection>
  </resultMap>


<!--=Start findMenuTree 根據角色id查詢對應的菜單,並以樹形結構的數據返回-->
  <select id="findMenuTree" resultMap="TreeResultMap">
    select
      m.menu_id as menu_id,
      m.name as name,
      m.pid as pid,
      m.type as type,
      m.vue_link as vue_link,
	  m.z_index as z_index,
	  m.descpt as descpt,
	  m.code as code,
	  m.icon as icon,
	  m.path as path,
	  m.enable_flag as enable_flag,
	  m.create_time as create_time,
	  m.update_time as update_time,
	  p.role_id as role_id
    from mst_menu m
    LEFT JOIN tran_permission p ON p.menu_id=m.menu_id
    WHERE p.role_id=#{roleId}
      AND m.pid=#{pid}
      AND m.enable_flag='0'
      AND m.type='0'
  </select>
  <!--=End findMenuTree 根據角色id查詢對應的菜單,並以樹形結構的數據返回-->

這裏再也不寫單字段的關聯查詢,與association用法基本同樣,惟一的區別是一個使用javaType一個使用ofType

相關文章
相關標籤/搜索