4.5.2 实现

接下来我们来写实现类。 新建一个类,类名写上UserDao,一般dao的命名规则是表名+dao,接口的话在前面加一个大写的I,例如IUserdao 然后在SuperClass(超类)这里,点击右边的browse(浏览),在弹出框写上Hibernate,然后双击选中其中的HibernateDaoSupport,如图所示: 然后再添加接口IUserDao,类似这样: 按确定后代码如下:
public class UserDao extends HibernateDaoSupport implements IUserDao{
 
    @Override
    public boolean userValidate(String userName,String psw){
        // TODO Auto-generated method stub
        return false;
    }
 
    @Override
    public void saveOrUpdate(User user){
        // TODO Auto-generated method stub
    }
 
    @Override
    public String queryNickName(String username){
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public User queryUserbyId(String username){
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public boolean isUsernameExist(String username){
        // TODO Auto-generated method stub
        return false;
    }
}
这就是实现类,接下来我们来实现第一个方法,queryUserbyId,根据账号查询用户:
 
@Override
public User queryUserbyId(String username){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    User user=(User)session.load(User.class,username);
    tx.commit();
    session.close();
    return user;
}
userValidate,这个函数根据用户名和密码验证能不能登录:
 
@Override
public boolean userValidate(String userName,String psw){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    boolean result=false;
    User user=(User)session.load(User.class,userName);
    if(user != null){
        if(user.getPassword().equals(psw)){
            result=true;
        }
    }
    tx.commit();
    session.close();
    return result;
}
解释这堆代码,我们先来看看数据库里的user表是什么结构: 其中username是user表的主键 接下来再看看user表影射的java类是什么样子:
public class User implements java.io.Serializable{
    private String username;
    private String password;
    private String role;
    private String nickname;
    private String createDate;
    public User(){
    }
    public User(String username,String password,String role,String nickname,String createDate){
        this.username=username;
        this.password=password;
        this.role=role;
        this.nickname=nickname;
        this.createDate=createDate;
    }
    public String getUsername(){
        return this.username;
    }
    public void setUsername(String username){
        this.username=username;
    }
    public String getPassword(){
        return this.password;
    }
    public void setPassword(String password){
        this.password=password;
    }
    public String getRole(){
        return this.role;
    }
    public void setRole(String role){
        this.role=role;
    }
    public String getNickname(){
        return this.nickname;
    }
    public void setNickname(String nickname){
        this.nickname=nickname;
    }
    public String getCreateDate(){
        return this.createDate;
    }
    public void setCreateDate(String createDate){
        this.createDate=createDate;
    }
}
代码解释 1.开头的Session session = this.getSession();Transaction tx = session.beginTransaction();和结尾的tx.commit();session.close();是固定模式,大部分的dao都需要这样的开头和结尾。 2.User user = (User) session.load(User.class, userName);这行代码是Hibernate根据主键查询一条记录的方法,其中userName是主键 3.user对象就是根据用户名查询到的用户,if (user != null) 首先验证有没有这个用户,再验证user的密码和传进来的密码是否一致: if (user.getPassword().equals(psw)) { result = true; } 如果一致表示可以登陆 4.result的初值是false,也就是默认不能登录,当条件成立的时候它的值才会改变,最后返回的就是result的值。 下面是实现保存或更新的代码,非常简洁,不用写update语句。那么它是怎么知道保存或更新到哪条记录呢?秘密就是这个user对象的对应”主键“的属性是否有值,如果有值,那么就会更新数据库对应的记录;如果没有值,就有可能是插入操作(当主键是自动生成的时候),或直接出错(当主键需要外部赋值的时候)。
 
@Override
public void saveOrUpdate(User user){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    session.saveOrUpdate(user);
    tx.commit();
    session.close();
}