学习笔记:把sql语句从循环中拿出来

一、dao层插入sql语句

即为从web页面传入controll层传入数据到dao层传入数据库中

旧代码(不重要):

 for (Long role : roleId) {
            jdbcTemplate.update("insert into sys_user_role values (?,?)",userId,role);
        }

sql语句 INSERT INTO sys_user_role(userid,roleid) VALUES (6,2),(6,3),(6,4)

其中(userid,roleid)可以不写,因为sys_user_role只有userid和roleid

有两种修改方式

1、使用list集合和batchUpdate函数

   String sql="insert into sys_user_role values (?,?)";
        List<Object[]> objects=new ArrayList<>();
        for (Long role : roleId) {
            objects.add(new Object[]{userId,role});
        }
        jdbcTemplate.batchUpdate(sql,objects);

2、使用StringBuffer

   String sql="insert into sys_user_role values ";
        StringBuffer stringBuffer=new StringBuffer();
        for (Long role : roleId) {
            stringBuffer.append("("+userId+","+role+"),");//如:(1,3),
        }
        stringBuffer.deleteCharAt(stringBuffer.length()-1);
        jdbcTemplate.update(sql+stringBuffer);

二、查询的dao层的数据传入controller层中

controller对函数service层-》dao层有循环,而dao层该函数中有查询sql语句

旧代码(不重要)

这是controller层循环

      for (User user : userList) {
            Long userid=user.getId();
            List<Role> userroles=userService.findRoleByUserid(userid);//sql语句放入循环中了
            user.setRoleList(userroles);
        }

service—》dao,这是dao层的sql函数

    public List<Role> findRoleByUserid(Long userid) {//通过userid在数据库中得到每个用户拥有的角色,一个用户可以用以偶多个角色
        List<Role> userroles= jdbcTemplate.query
                ("SELECT r.* FROM sys_role r,sys_user_role ur WHERE r.`id`=ur.`roleId` AND ur.`userId`=?",
                new BeanPropertyRowMapper<Role>(Role.class),userid);
    return userroles;//返回每个用户拥有的角色
    }

将sql从循环中拿出来:

SELECT ur.userid,r.* FROM sys_role r,sys_user_role ur WHERE r.`id`=ur.`roleId` AND ur.`userId` IN (1,2,3,4,5) ORDER BY ur.userid

修改之后 controller层

public ModelAndView list(){
        List<User> userList= userService.list();//userList所有的user集合,里面的每一个user都有个rolelist集合
        List<UserRoleVo> urv=userService.findUserRoleByUserids(userList);//sql
        //将urv中的角色对象装入userlist中的每一个User中的List<Role>里
        for (User user : userList) {//把每一个userid对应的所有role装入每一个user里的rolelist集合
            Long userid=user.getId();
            List<Role> roleList=new ArrayList<>();
            for (UserRoleVo userRoleVo : urv) {
                if(userRoleVo.getUserid()==userid){
                    roleList.add(userRoleVo.getRole());
                }
            }
            user.setRoleList(roleList);
        }
        ModelAndView mav=new ModelAndView();
        mav.addObject("userList",userList);
        mav.setViewName("user-list");
        System.out.println(userList);
        return mav;
    }

dao层,这个层新建立一个实体类,每一个对应一个userid有一个roleid

    public List<UserRoleVo> findUserRoleByUserids(List<User> userList) {
        String sql="SELECT ur.userid,r.* FROM sys_role r,sys_user_role ur WHERE r.`id`=ur.`roleId` AND ur.`userId` IN ";
        StringBuffer sbf=new StringBuffer();
        sbf.append("(" );
        for (User user : userList) {
           sbf.append(user.getId()+",");
        }//变成了1,2,3,4,5,
        sbf.deleteCharAt(sbf.length()-1);//把最后一个“,”减去
        sbf.append(")");
        List<UserRoleVo>  urv=jdbcTemplate.query(sql+sbf,new BeanPropertyRowMapper<UserRoleVo>(UserRoleVo.class));
        return urv;
    }

上述实体类,里面有userid和role


public class UserRoleVo {
    private long userid;
    private Role role;

    public long getUserid() {
        return userid;
    }

    public void setUserid(long userid) {
        this.userid = userid;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

总结在dao层中把每一个单个的userid和role都放入UserRoleVo集合中,在controller层中把user里的id和传过来的userid对比,相同则把role放入user的rolelist集合中,最后把user集合传到jsp页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值