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;
}