一、数据库表结构
假设我们有两个表: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);}}}
}