• mybatis3


    1.时刻记得尽量不要在for循环中用sql语句,太耗资源了。

    举个例子,查出所有用户的角色,角色用逗号隔开,分页,模糊查询都有。

    用户和角色是多对多,我们一般要转成一对多来使用。users ,sys_user_role ,sys_role

    先users和sys_user_role左连接,组成一个新表,然后再左连接sys_role。

    <select id="findUserList" parameterType="java.util.HashMap" resultType="com.lyh.beacon.model.sys.VO.UsersRolesVO">
    <!-- user是mysql关键字,转成普通字符要用`` 1左边的字符,不然报 错-->
    select t.*,r.id roleId,r.name roleName from
    (select u.*,ur.role_id from users u left join sys_user_role ur on u.`user` = ur.user_id
    <where>
    <if test="fuzzy != null and fuzzy != ''">
    CONCAT(IFNULL(u.`user`,""),IFNULL(u.name,"")) like "%"#{fuzzy}"%"
    </if>
    <if test="center != null and center != ''">
    and u.centername = #{center}
    </if>
    <if test="dept !=null and dept !=''">
    and u.deptname = #{dept}
    </if>
    </where>
    ) t
    left join
    sys_role r on t.role_id = r.id

    </select>

    但这样子查出来的记录除角色字段外,其他字段重复,因为每条记录都有一个角色,假如用户都有两个包含两个以上角色情况。

    那么代码中要实现去

    1.把角色拼接成逗号隔开。

    2.只有一个用户返回给前端。

    小白代码实现(给自己总结)

    public Map<String, Object> findUserList(SysQueryParameter parameter) {

    log.info("fuzzy:"+parameter.getFuzzy()+",center:"+parameter.getCenter()+",dept:"+parameter.getDept()+",currentPage:"+
    parameter.getCurrentPage()+",pageSize:"+parameter.getPageSize());
    //先判断分页
    Map<String, Object> pageMap = packPage(parameter);
    int currentPage = (Integer)pageMap.get("currentPage");
    int pageSize = (Integer)pageMap.get("pageSize");
    //模糊参数
    Map<String, Object> params = new HashMap<String, Object>();
    if(parameter !=null){
    params.put("fuzzy", parameter.getFuzzy());
    params.put("center", parameter.getCenter());
    params.put("dept", parameter.getDept());
    }
    /**
    * 查出来会是每个用户有多少个角色,就会查出多少条记录,我们要返回一条记录,并且这条包含所有的角色
    * 解决:
    * 1.通过比较去把角色练连到一起。
    * 2.要把众多条数据,整成一条,用个map来存每个循环的id,当map中有的时候,就退出当前循环。
    */
    List<UsersRolesVO> lists = userRoleDao.findUserList(params);

    //转map
    List<Map<String, Object>> listMap = new ArrayList<Map<String,Object>>();
    Map<String, Object> maps = new HashMap<>();
    if(CollectionUtils.isNotEmpty(lists)){
    for(UsersRolesVO user:lists){
    if(null != user){
    if(MapUtils.isNotEmpty(maps)){
    String string = (String)maps.get("user"+user.getId());
    if(null != string && string.equals(user.getId()+"")){
    continue;
    }else{
    maps.put("user"+user.getId(), user.getId()+"");
    }
    }else{
    maps.put("user"+user.getId(), user.getId()+"");
    }
    Map<String, Object> map = new HashMap<>();
    map.put("id", user.getId());
    map.put("userName", user.getName());
    map.put("userNum", user.getUser());
    map.put("center", user.getCentername());
    map.put("dept", user.getDeptname());
    map.put("position", user.getJobname());
    map.put("status", user.getPsnclidname());//状态?
    map.put("picture", user.getPicture());//是否开通 1:开通 空:未开通
    //优化
    StringBuilder userRoles = new StringBuilder(user.getRoleName()+",");

    for(UsersRolesVO user2:lists){
    if(null !=user2 && null != user.getId() && null != user2.getId() && user.getId().equals(user2.getId())){

    if(null != user.getRoleName() && null != user2.getRoleName() && !user.getRoleName().equals(user2.getRoleName())){
    userRoles = userRoles.append(user2.getRoleName()+",");
    }
    }

    }
    userRoles =new StringBuilder(userRoles.substring(0,userRoles.length()-1));
    map.put("roles", userRoles);//角色 ,隔开
    listMap.add(map);
    }
    }
    }
    Map<String, Object> returnMap = packSubList(currentPage, pageSize, listMap);

    return returnMap;
    }

  • 相关阅读:
    HTTP、HTTP2
    1-1 用本地代码调试线上环境代码
    js判断触摸方向
    1-1 node 基础
    1-2 nodejs小节 文件读取
    c++ 递归斐波那契算法及时间复杂度
    十进制转换成二进制以 二进制转换成 8进制和16进制
    centos6.5 安装cmake 3.3.2
    回文字符串
    -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable
  • 原文地址:https://www.cnblogs.com/yiyezhiqiuwuchen/p/12795765.html
Copyright © 2020-2023  润新知