我正在尝试为员工和经理创建一个单一的登录系统我正确地设置了数据库,并且我的java代码正确连接到数据库。我遇到的问题是当用户以员工身份登录时,根据数据库中的用户名,然后会出现一个工作人员窗口,或者如果管理员尝试根据他们在数据库中的用户名再次登录,则会出现一个管理器窗口
例如对于员工来说,数据库中的用户名看起来像staff1,staff1等,而管理员看起来像mng1,mngr2等。
我有一些代码可以运行,但它只是出于某种原因加载了管理器视图。
final Statement s = conn.createStatement ();
ResultSet rs= s.executeQuery ("SELECT * FROM users where username='"+username1+"' && password='"+psw+"'");
String mng1="mng*";
String staff="staff*";
String pass1="";
while (rs.next ())
{
mng1 = rs.getString ("");
staff =rs.getString ("");
pass1 = rs.getString ("password");
if(username1.equals(mng1)&&psw.equals(pass1))
{
ManagerMainMenu mng= new ManagerMainMenu();
mng.main(null);
//System.out.println("its working");
}
else if(username1.equals(staff)&&psw.equals(pass1))
{
TakingOrder to = new TakingOrder();
to.main(null);
}
else
{
System.out.println("password or username is wrong");
}
}
答案 0 :(得分:2)
事实上,这是你问题的答案
if(username1.equals(mng1)&&psw.equals(pass1)){
mng= new ManagerMainMenu()
在您的情况下,这种情况似乎总是正确的
您的username1为null或为空或其他内容
也许密码也是正确的。
您的用户名不可见,您没有做任何事情
在代码中。 rs.getString(“”)最有可能返回null
。
所以你只是让它们无效。
不要使用像select * from whatever
这样的选择这是件坏事
特别是在大桌子上,而不是真正看到你选择的是什么。
但你应该遵循 建议和使用技术和/或一些好处 ORM喜欢休眠或使用好的旧springjdbc。 :)
首先,我强烈建议使用准备好的陈述 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html 它也可以帮助你避免使用sql注入 数据库的资源以更好的方式,因为sql已经预先编译到数据库中。
这是一些实际的例子。
static public void setParameters(PreparedStatement preparedStatement, Object[] params)
throws SQLException
{
if (params != null)
{
for (int i = 0; i < params.length; i++)
{
if (params[i] == null)
{
preparedStatement.setNull(i + 1, Types.INTEGER);
continue;
}
String className = params[i].getClass().getName();
if (className.compareTo("java.lang.String") == 0)
{
preparedStatement.setString(i + 1, (String) params[i]);
}
else if (className.compareTo("java.lang.Integer") == 0)
{
preparedStatement.setInt(i + 1, ((Integer) params[i]).intValue());
}
...............///your types go here
}
}
}
public static ResultSet sqlSelect(Connection con, String sql, Object[] params) throws SQLException
{
ResultSet rs = null;
PreparedStatement preparedStatement = con.prepareStatement(sql);
try
{
setParameters(preparedStatement, params);///your parameters
rs = preparedStatement.executeQuery();
logger.info(rs.toString());
}
catch (SQLException e)
{
//TODO log.error("select failed: " + preparedStatement.toString());
throw e;
}
return rs;
}
public static UserInfo getUser(String username,String pass)
{
UserInfo user=null;
Connection con=null;
//// logger.info("user: "+username+" pass: "+pass); if you want to
String query = "SELECT id,username,password,email,name,company,description,enabled" +
" FROM users WHERE username=? and password=? and enabled=true;";
try{
con = DBManager.getConnection();
ResultSet rs = DBManager.sqlSelect(con,query,new String[]{username,pass});
while(rs != null && rs.next())
{
user = new UserInfo();
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
user.setEmail(rs.getString(4));
user.setFullName(rs.getString(5));
user.setCompany(rs.getString(6));
user.setDescription(rs.getString(7));
user.setEnabled(rs.getBoolean(8));
logger.info("user written");
}
}catch(SQLException sqle){logger.info(sqle.getMessage());}
finally
{
if(con != null)
DBManager.freeConnection(con);
}
return user; }
如果该方法使用您的设置返回您的用户,则该用户有效。 您可能希望拥有用户和权限或组表 应该创建一个多对多表,如users_permissions或users_groups,如果你愿意 它将具有(id,user_id,permission_id)或group_id,然后您将必须加入 这两个表用户,permissoins使用这个多对多表。 像这样的东西
select u.user_id,p.permission from
users u,user_permissions up,permissions p
where u.user_id=up.user_id and up.permission_id=p.permission_id
and u.user=? and u.password=? and u.enabled=1
或使用联接:
select u.user_id,p.permission from
users u
inner join user_permissions up
on u.user_id=up.user_id
inner join permissions p
on up.permission_id=p.permission_id
where u.user=? and u.password=? and u.enabled=1
然后调整select和getUser()方法。
UserInfo pojo类似于:
public class UserInfo {
private int id;
private String username;
private String password;
private String email;
private String fullName;
private String company;
private String description;
private List<Integer or String> permissions;
//getters//setters
}
希望它有助于升技。