一、基本概念
在開發中,我們常常需要通過多張表中的關聯查詢,獲取相關數據。Mybatis是ORM框架,因此也可以支持關係型資料庫的關聯查詢。Mybatis的關聯查詢主要通過兩種方式實現,一種是使用嵌套查詢,另一種是使用映射關聯查詢。下面我們將分別闡述這兩種方式的實現。
二、嵌套查詢
嵌套查詢是使用多次單表查詢,最後將結果通過代碼組合起來。Mybatis通過resultMap標籤將單表查詢結果映射到一個自定義的java類型中。對於關聯查詢,我們需要定義多個resultMap,將不同的查詢結果映射到不同的java類型中,再通過嵌套組合的方式將它們連接起來。具體實現步驟如下:
1、定義需要連接的結果映射java類型:
<resultMap id="resultMap1" type="com.example.entity.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
</resultMap>
<resultMap id="resultMap2" type="com.example.entity.Order">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="order_name" property="orderName" />
</resultMap>
2、定義查詢語句,並在其中引用上述需要連接的結果映射java類型:
<select id="getUserOrders" resultMap="resultMap1">
select * from user where id = #{id}
<select id="getOrdersByUserId" resultMap="resultMap2">
select * from orders where user_id = #{userId}
</select>
</select>
3、在java代碼中調用上述查詢語句:
User user = sqlSession.selectOne("getUserOrders", 1);
這裡我們首先查詢用戶的信息,然後使用嵌套查詢,查詢該用戶的所有訂單信息。
三、映射關聯查詢
Mybatis的映射關聯查詢可以在一次SQL查詢中獲取所有需要連接的數據。這種查詢方式的好處是可以減少資料庫連接次數,提高查詢效率。下面我們將介紹實現這種查詢方式的兩種方法。
四、一對一查詢
一對一查詢是指查詢出單表中每個記錄所對應的一個記錄。在Mybatis中,通過resultMap標籤將需要連接的多個表或多個查詢結果映射到一個自定義的java類型中。對於一對一查詢,我們只需要在resultMap中使用association標籤定義連接的java類型,即可實現映射關聯查詢。具體實現步驟如下:
1、定義需要連接的結果映射java類型,並使用association標籤定義連接的java類型:
<resultMap id="userMap" type="com.example.entity.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<association property="order" resultMap="orderMap" />
</resultMap>
<resultMap id="orderMap" type="com.example.entity.Order">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="order_name" property="orderName" />
</resultMap>
2、定義查詢語句,並在其中引用上述需要連接的結果映射java類型:
<select id="getUserOrder" resultMap="userMap">
select * from user u
left join orders o on u.id = o.user_id
where u.id = #{id}
</select>
3、在java代碼中調用上述查詢語句:
User user = sqlSession.selectOne("getUserOrder", 1);
這裡我們查詢用戶及其訂單信息,並將查詢結果映射到User類型對象中。
五、一對多查詢
一對多查詢是指查詢出單表中每個記錄所對應的多個記錄。在Mybatis中,通過resultMap標籤將需要連接的多個表或多個查詢結果映射到一個自定義的java類型中。對於一對多查詢,我們只需要在resultMap中使用collection標籤定義連接的java類型列表,即可實現映射關聯查詢。具體實現步驟如下:
1、定義需要連接的結果映射java類型,並使用collection標籤定義連接的java類型列表:
<resultMap id="userMap" type="com.example.entity.User">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<collection property="orders" ofType="com.example.entity.Order"
resultMap="orderMap" />
</resultMap>
<resultMap id="orderMap" type="com.example.entity.Order">
<id column="id" property="id" />
<result column="user_id" property="userId" />
<result column="order_name" property="orderName" />
</resultMap>
2、定義查詢語句,並在其中引用上述需要連接的結果映射java類型:
<select id="getUserOrders" resultMap="userMap">
select * from user u
left join orders o on u.id = o.user_id
where u.id = #{id}
</select>
3、在java代碼中調用上述查詢語句:
User user = sqlSession.selectOne("getUserOrders", 1);
這裡我們查詢用戶及其所有訂單信息,並將查詢結果映射到User類型對象中。
原創文章,作者:XWOXW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332448.html