mybatisplus自定义sql多表查询
时间: 2025-05-28 17:33:43 浏览: 14
### MyBatisPlus 自定义 SQL 多表联查 示例教程
#### 使用 Wrapper 实现动态条件查询
在 MyBatis Plus 中,`Wrapper` 是用于构建复杂查询条件的重要工具。通过 `${ew.customSqlSegment}` 可以将 `Wrapper` 中设置的查询条件自动转换成 SQL 的 WHERE 子句部分[^1]。
```xml
<select id="selectList" resultType="com.example.entity.User">
SELECT * FROM user ${ew.customSqlSegment}
</select>
```
#### XML 配置中的多表连接查询
对于涉及多个表的数据检索需求,可以在 Mapper 文件中编写相应的 `<select>` 标签来完成跨表查询操作。例如,在 UserMapper.xml 中实现基于用户 ID 列表获取用户的姓名及其所在班级名称:
```xml
<select id="getUsersByIds" resultMap="BaseResultMap">
select u.name as name, g.name as className
from user u
left join grade g on u.id = g.student_id
where 1=1
<if test="userIds.size() != 0">
and u.id in (
<foreach collection="userIds" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
)
</if>
</select>
```
这段代码展示了如何利用 `<if>` 和 `<foreach>` 动态拼接 SQL 条件,并执行左外连接查询两个不同实体之间的关系数据[^2]。
#### 参数化查询增强灵活性
为了使查询更加通用和易于维护,可以通过传递额外的关键字或其他过滤项作为方法参数来进行更复杂的筛选逻辑。比如允许前端传入关键字或注册时间范围等信息参与最终形成的 SQL 查询语句中[^4]。
```java
public interface IUserService {
List<User> getUsersByConditions(@Param("keyWord") String keyWord,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
}
<!-- 对应的XML配置 -->
<select id="getUsersByConditions" parameterType="map" resultType="User">
SELECT *
FROM user u
LEFT JOIN other_table ot ON ...
WHERE 1=1
<if test="keyWord != null and keyWord != ''">
AND (u.username LIKE CONCAT('%',#{keyWord},'%') OR ... )
</if>
<if test="startTime != null && endTime != null">
AND register_time BETWEEN #{startTime} AND #{endTime}
</if>
</select>
```
上述例子说明了怎样接收来自服务层的方法调用者所提供的各种可能存在的可选查询条件并将其融入到实际运行时所使用的数据库命令之中。
阅读全文
相关推荐



















