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