Mybatis一、二级菜单查询结果封装的技巧以及foreach的使用

目录

一、前景提要

二、在xml文件中使用foreach来遍历parameterType的list


一、前景提要

有一个需求是:

根据当前账号的权限设置登录后显示的一二级分类,也就是管理员可以看到所有的界面,而权限低一点的可能就看到的少一点。

第一种做法:(也是浪费我阳间时间的做法,太**了)

根据userid查询当前用户的所有能访问的一级和二级菜单的list集合然后再在controller类中进行封装?

答案是:NO!

正确做法如下:()

**
 * @author Dragon code!
 * @create 2022-04-13 9:59
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Reference(check = false)
    private UserService userService;
    @RequestMapping("/getusername")
    public Result getUsername(){
        try {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String username = authentication.getName();
            User user = userService.findUserByUserName(username);
            if (user == null) {
                return null;
            }
            HashMap<String, Object> map = new HashMap<>();
            map.put("username",username);
            HashMap<String, Object> results = new HashMap<String, Object>();

            List<Menu> result = userService.findMenuByUserId(user.getId());
            map.put("menuList",result);
            return new Result(true, MessageConstant.GET_USERNAME_SUCCESS, map);
        } catch (Exception e) {
            return new Result(false, MessageConstant.GET_USERNAME_FAIL);
        }
    }
}

xml文件:

首先通过userid来查询所有的一级分类,精髓在于此处的resultMap是自己自定义的map

 <select id="findMenuByUserId" resultMap="findByIdRM">
        SELECT
            c.*
        FROM
            t_role a,
            t_role_menu b,
            t_menu c
        WHERE
            a.id IN ( SELECT role_id FROM t_user_role WHERE user_id = #{value} )
          AND a.id = b.role_id and b.menu_id = c.id and c.`level` =1
        ORDER BY
            c.priority ASC
    </select>

定义baseMap:

通常是某个pojo的实体类映射的map

 <resultMap id="baseRM" type="menuPro">
        <!-- 主键  property为实体类属性 column为数据库字段 jdbcType为实体类对应的jdbc类型-->
        <id property="id" column="id"/>
        <!-- 普通属性  property为实体类属性 column为数据库字段  jdbcType为实体类对应的jdbc类型-->
        <result property="title" column="name"/>
        <result property="linkUrl" column="linkUrl"/>
        <result property="path" column="helpCode"/>
        <result property="priority" column="priority"/>
        <result property="description" column="description"/>
        <result property="icon" column="icon"/>
        <result property="parentMenuId" column="parentMenuId"/>
    </resultMap>

第二步,用自己最后想返回的map来继承这个基础map

在原有单个menu的基础上向其中加入子列表的list


    <resultMap id="findByIdRM" type="menuPro" extends="baseRM">
        <!--其中ofType是单个对象的类型-->
    <collection property="children"
                ofType="menuPro"
                javaType="ArrayList"
                column="id"
                select="com.lay.kangan.mapper.UserMapper.findChileIdByParentId"/>
    </resultMap>

子列表的结果由他的子查询来完成,注意此子查询可以直接放在本xml文件中,也可以用全限定接口名来引用其他xml文件中的方法。

通过父分类的id来查询子分类:

查询的结果会直接封装到list中。

    <select id="findChileIdByParentId" resultType="menuPro">
        select  a.*,a.name title from t_menu a where parentMenuId = #{value} order By priority ASC
    </select>

至此查询返回的一级分类中就有二级分类了!

二、在xml文件中使用foreach来遍历parameterType的list

比如传入的是List<Integer> 类型的list

使用方法如下:

SELECT * FROM t_checkitem
        WHERE id IN
        <foreach item = "id" index = "index" collection = "list" open = "(" close = ")" separator = "," >
            #{id}
        </foreach>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你有以下的菜单表(menu): | id | name | parent_id | |----|------|-----------| | 1 | 菜单1 | null | | 2 | 菜单2 | null | | 3 | 菜单1-1 | 1 | | 4 | 菜单1-2 | 1 | | 5 | 菜单2-1 | 2 | 其中,parent_id 表示该菜单的父级菜单的 id,如果该菜单没有父级菜单,则 parent_id 为 null。 下面是查询二级菜单的 SQL: ```sql SELECT m1.id, m1.name, m2.id AS sub_id, m2.name AS sub_name FROM menu m1 LEFT JOIN menu m2 ON m1.id = m2.parent_id WHERE m1.parent_id IS NULL AND m2.parent_id IS NOT NULL; ``` 这里使用了自连接和左连接,将菜单表与自身连接,并筛选出 parent_id 为 null 的一级菜单,和 parent_id 不为 null 的二级菜单。同时,使用别名给一级菜单和二级菜单取名,方便后续处理。 在 Java 中,使用 MyBatis 可以将上面的 SQL 封装成一个 mapper 接口的方法,如下: ```java public interface MenuMapper { List<Map<String, Object>> selectSubMenus(); } ``` 这里返回的是一个 List<Map<String, Object>>,其中每个 Map 对应一条记录,包含 id、name、sub_id 和 sub_name 四个字段,表示父级菜单和对应的二级菜单。具体的 mapper.xml 可以参考下面的代码: ```xml <!-- MenuMapper.xml --> <mapper namespace="com.example.MenuMapper"> <select id="selectSubMenus" resultType="java.util.Map"> SELECT m1.id, m1.name, m2.id AS sub_id, m2.name AS sub_name FROM menu m1 LEFT JOIN menu m2 ON m1.id = m2.parent_id WHERE m1.parent_id IS NULL AND m2.parent_id IS NOT NULL; </select> </mapper> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值