一、數據庫表結構
假設我們有兩個表:users
?和?orders
,users
?表存儲用戶信息,orders
?表存儲訂單信息,一個用戶可以有多個訂單,通過?user_id
?關聯兩個表。
users
?表
字段名 | 數據類型 | 描述 |
---|---|---|
user_id | INT | 用戶 ID,主鍵 |
name | VARCHAR | 用戶姓名 |
email | VARCHAR | 用戶郵箱 |
orders
?表
字段名 | 數據類型 | 描述 |
---|---|---|
order_id | INT | 訂單 ID,主鍵 |
order_date | DATE | 訂單日期 |
user_id | INT | 用戶 ID,外鍵,關聯?users ?表的?user_id |
二、多表聯查類型及對應的 MyBatis 和 DAO 代碼
1. 內連接(INNER JOIN):
內連接只返回兩個表中匹配的行。
MyBatis Mapper XML 文件(UserOrderMapper.xml
)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.dao.UserOrderDao"><select id="getUserOrdersInnerJoin" resultType="java.util.Map">SELECT users.user_id, users.name, orders.order_id, orders.order_dateFROM usersINNER JOIN orders ON users.user_id = orders.user_id;</select>
</mapper>
DAO 接口(UserOrderDao.java
)
package com.example.dao;import java.util.List;
import java.util.Map;public interface UserOrderDao {List<Map<String, Object>> getUserOrdersInnerJoin();
}
2. 左連接(LEFT JOIN)
左連接返回左表中的所有行,以及右表中匹配的行。如果右表中沒有匹配的行,則返回?NULL
。
MyBatis Mapper XML 文件(UserOrderMapper.xml
)
<select id="getUserOrdersLeftJoin" resultType="java.util.Map">SELECT users.user_id, users.name, orders.order_id, orders.order_dateFROM usersLEFT JOIN orders ON users.user_id = orders.user_id;
</select>
DAO 接口(UserOrderDao.java
)
List<Map<String, Object>> getUserOrdersLeftJoin();
3. 右連接(RIGHT JOIN)
右連接返回右表中的所有行,以及左表中匹配的行。如果左表中沒有匹配的行,則返回?NULL
。
MyBatis Mapper XML 文件(UserOrderMapper.xml
)
<select id="getUserOrdersRightJoin" resultType="java.util.Map">SELECT users.user_id, users.name, orders.order_id, orders.order_dateFROM usersRIGHT JOIN orders ON users.user_id = orders.user_id;
</select>
DAO 接口(UserOrderDao.java
)
List<Map<String, Object>> getUserOrdersRightJoin();
代碼解釋
- Mapper XML 文件:定義了 SQL 查詢語句,通過?
select
?標簽指定查詢的 ID 和返回結果類型。 - DAO 接口:定義了調用 SQL 查詢的方法,返回值類型與 Mapper XML 中指定的?
resultType
?相對應。
使用示例
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;
import java.util.List;
import java.util.Map;public class Main {public static void main(String[] args) throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);try (SqlSession session = sqlSessionFactory.openSession()) {UserOrderDao userOrderDao = session.getMapper(UserOrderDao.class);List<Map<String, Object>> userOrders = userOrderDao.getUserOrdersInnerJoin();for (Map<String, Object> order : userOrders) {System.out.println(order);}}}
}