mybatis if判断 动态递归菜单查询sql
时间: 2023-08-12 09:35:08 浏览: 135
如果要在 Mybatis 的动态递归菜单查询 SQL 中使用 if 判断语句,可以使用 Mybatis 的动态 SQL 功能来实现。
下面是一个示例 SQL,可以根据传入的菜单 ID 和菜单名称查询该菜单及其所有子菜单:
```
WITH RECURSIVE temp_menu(id, parent_id, name, level, path) AS (
-- 查询指定菜单
SELECT id, parent_id, name, 1 AS level, CAST(id AS VARCHAR) AS path
FROM menu
WHERE 1=1
<if test="menuId != null">
AND id = #{menuId}
</if>
<if test="menuName != null and menuName != ''">
AND name like CONCAT('%', #{menuName}, '%')
</if>
UNION ALL
-- 查询子菜单
SELECT m.id, m.parent_id, m.name, tm.level + 1 AS level, CONCAT(tm.path, '-', m.id) AS path
FROM menu m
INNER JOIN temp_menu tm ON m.parent_id = tm.id
)
SELECT id, parent_id, name, level, path
FROM temp_menu
ORDER BY path;
```
在这个 SQL 中,使用了 Mybatis 的 if 判断语句来动态拼接 SQL 语句。如果传入了菜单 ID 参数,则在 SQL 语句中添加 where 条件语句,查询指定菜单。如果传入了菜单名称参数,则在 SQL 语句中添加 like 条件语句,查询包含指定菜单名称的菜单。如果两个参数都传入了,则同时使用两个条件进行查询。
在 Mybatis 中,可以在 Mapper 接口中定义对应的方法和参数,然后在 XML 文件中使用动态 SQL 语句来拼接 SQL 查询语句,最终实现动态递归菜单查询。
例如,对应的 Mapper 接口和 XML 文件如下:
```
public interface MenuMapper {
List<Menu> selectRecursiveMenu(@Param("menuId") Integer menuId, @Param("menuName") String menuName);
}
```
```
<!-- MenuMapper.xml -->
<select id="selectRecursiveMenu" resultMap="menuResultMap">
WITH RECURSIVE temp_menu(id, parent_id, name, level, path) AS (
-- 查询指定菜单
SELECT id, parent_id, name, 1 AS level, CAST(id AS VARCHAR) AS path
FROM menu
WHERE 1=1
<if test="menuId != null">
AND id = #{menuId}
</if>
<if test="menuName != null and menuName != ''">
AND name like CONCAT('%', #{menuName}, '%')
</if>
UNION ALL
-- 查询子菜单
SELECT m.id, m.parent_id, m.name, tm.level + 1 AS level, CONCAT(tm.path, '-', m.id) AS path
FROM menu m
INNER JOIN temp_menu tm ON m.parent_id = tm.id
)
SELECT id, parent_id, name, level, path
FROM temp_menu
ORDER BY path;
</select>
```
在 XML 文件中,使用了 select 语句来定义 SQL 查询语句,并使用 resultMap 来映射查询结果集。使用了 if 判断语句来根据传入的参数动态拼接 SQL 查询语句。最后,定义了一个 selectRecursiveMenu 方法来调用该 SQL 语句,并返回查询结果。
阅读全文