0

我有 2 个表用户user_roles如下

CREATE TABLE IF NOT EXISTS users ( 
 username char(50) NOT NULL, 
 password char(100) NOT NULL,
 PRIMARY KEY (username)
);
INSERT INTO users values ("root","abc"); 

CREATE TABLE IF NOT EXISTS user_roles ( 
 username char(50) NOT NULL, 
 role_name char(50) NOT NULL,
 FOREIGN KEY (username) REFERENCES users(username) 
  ON UPDATE CASCADE
  ON DELETE CASCADE
); 

INSERT INTO user_roles values ("root","admin");
INSERT INTO user_roles values ("root","role1");
INSERT INTO user_roles values ("root","role2");
INSERT INTO user_roles values ("root","role3");
INSERT INTO user_roles values ("root","role4");

这是更新用户角色的html表单

  <td>Roles :</td>
     <td>
       <select id="role" name="role" multiple>
         <option value="role1" <%= role1== true ? "selected" : ""%>>role1</option>                                          
         <option value="role2" <%= role2== true ? "selected" : ""%> >role2</option>                                                               
         <option value="role3" <%= role3== true ? "selected" : ""%> >role3</option>
         <option value="role4" <%= recap == true ? "selected" : ""%> >role4</option>
     </td>
 <td> 

这是更新 user_roles 表中的用户角色但它不起作用的 servlet 代码?

  if (request.getParameterMap().containsKey("roles")) {
        String roleList = request.getParameter("roles");
        String[] role = splitRoles(roleList);

       for (int i = 0; i < role.length; i++) {
              String currentRole = role[i];
                  int editedrole = dao.editUserRoles(currentRole, username);
           }
  }

DAO 方法(更新

   public int editUserRoles(String roleName,String username) {
    int done = 0 ;
    boolean hasRole = false; // checking whether records with roleName and username exits or not 
    if (connection != null) {
        try {
                System.out.println("Connected to Database updating role");
                String sql1 = "SELECT * FROM user_roles WHERE username = \"" + username + "\" AND role_name = \"" + roleName + "\" ";
                Statement stmt = connection.createStatement();
                ResultSet resultset = stmt.executeQuery(sql1);
                 while(resultset.next()){
                     hasRole = true;
                 } 

                if(hasRole){   // if record exist then only update it
                String sql2 = "UPDATE user_roles SET role_name = ? WHERE username = ? ";
                PreparedStatement ps2 = connection.prepareStatement(sql2);
                ps2.setString(1, roleName);
                ps2.setString(2,username);
                done = ps2.executeUpdate();
                }
                else{  // else add new 
                    addUserRoles(username,roleName);
                }
        }
        catch(Exception e){
            System.out.println("Exception :"+e.getMessage());
        }
    }
    else {
        System.out.println("Not able to connect to database");
    }
    return done;
}
4

2 回答 2

0

您尚未初始化用户名变量并将其传递给函数,因此用户名为空,查询输出为空。在调用 editUserRoles() 之前,您必须提供用户名,然后您将获得结果。我试过它会很好用。

于 2013-11-14T11:28:23.733 回答
0

我已经解决了我的问题以避免表中的重复记录,只是在 servlet 代码中进行了更改

       if (action.equalsIgnoreCase("edit")) {        
          String username = request.getParameter("username").trim();
          if (request.getParameterMap().containsKey("roles")) {
                        String roleList = request.getParameter("roles").trim();
                        String[] role = splitRoles(roleList);
                        dao.deleteRoles(username); // first delete roles                                                  
                       for(int i = 0;i<role.length;i++){
                           String currentRole = role[i];  
                           dao.addUserRoles(username,currentRole); // then add roles
                       }
          }

  }
于 2013-11-15T10:28:52.577 回答