4.6 Dao常用代码

大部分的代码都是以下的格式
Session session=this.getSession();
Transaction tx=session.beginTransaction();
//代码逻辑
tx.commit();
session.close();
//返回值
1.根据主键查找整条数据:
public User queryUserbyId(String username){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    User user=null;
    try{
        user=(User)session.load(User.class,username);
    }
    catch(ObjectNotFoundException e){
        user=null;
    }
    tx.commit();
    session.close();
    return user;
}
关键代码是User user= (User) session.load(User.class, username); 注意事项: a.必须用强制类型转换(User) b.load的第一个参数是影射类.class的形式 c.第二个参数匹配的是user表的主键 d.当主键查找不存在的时候,会抛出ObjectNotFoundException的异常 d.以下是别的表的例子:
Class表: Clazz clazz=(Clazz)session.load(Clazz.class,id);
Chapter表:Chapter chapter=(Chapter)session.load(Chapter.class,chapterId);
下面是jsp使用的例子: 代码解释: 27:声明userDao 28:使用userDao调用queryUserbyId函数,结果是一个User对象 55:把查询到的user对象的nickname属性显示在jsp页面上 nickname是昵称,网页上的显示效果如下 2.无条件查找所有数据
public List queryAllUsers(){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    String hql="from User";
    List result=session.createQuery(hql).list();
    tx.commit();
    session.close();
    return result;
}
其中hql这个是Hibernate查询语言,和sql类似,它不需要select *,直接就是from User(注意User是影射类的名字,不是表名字) 以下是类似的代码: 查找所有Chapter
public List queryAllChapters(){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    String hql="from Chapter";
    List result=session.createQuery(hql).list();
    tx.commit();
    session.close();
    return result;
}
3.有条件查找数据 多用于根据某关键字查找数据
//通过角色查找用户
public List queryUsersByRole(String role){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    StringBuffer buffer=new StringBuffer("from User where role='")
        .append(role).append("'");
    List users=session.createQuery(buffer.toString()).list();
    tx.commit();
    session.close();
    return users;
}
StringBuffer用来构建比较长的字符串,用append一直添加内容,比直接用“+”号效率高。其中role的值需要用单引号包起来,所以在最后还使用了一个append("'"); 4.保存或更新
public void saveOrUpdate(User user){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    session.saveOrUpdate(user);
    tx.commit();
    session.close();
}
当传入的user有主键值,并且在数据库已经存在,那么是更新;如果不存在该主键,那么是插入新数据。 5.调用同一个dao里面的其他函数 有时候可以使用同一个dao的其他函数来帮助实现,例如查找用户名是否存在:
public boolean isUsernameExist(String username){
    User user=this.queryUserbyId(username);
    if(user != null)
        return true;
    else
        return false;
}
使用了queryUserbyId,先根据用户名查找,再判断user是不是null。 6. 如何在jsp页面使用查找的List结果的数据: 这是声明dao,这个dao的名字是classDao IClassDao classDao = (IClassDao) SpringUtil.getBean("classDao", this.getServletContext()); 根据用户名查找所有班级 List classList = classDao.queryClassByTeacherId(username); 接下来的for循环,每次生成一个option,效果就是这样: 7.分页查询 首先hibernate查询的时候,需要指定两个参数:从哪里开始、查多少个
public List queryGamesByPlatform(String os,int page){
    Session session=this.getSession();
    Transaction tx=session.beginTransaction();
    int start=page*10;
    StringBuffer buffer=new StringBuffer("from Game where platform='")
        .append(os).append("'");
    List games=session
        .createQuery(buffer
        .toString()).setFirstResult(start).setMaxResults(10).list();
    tx.commit();
    session.close();
    return games;
}
里面的setFirstResult(start)决定了从哪里开始,setMaxResults(10)决定了查找10个。然后在前台的页面,增加页面的连接,把p作为一个页面参数,例如这样: 第一页 然后在jsp页面的最开始就把这个p的值取出来,传给queryGamesByPlatform方法。 if(pstr==null||pstr.equals("")){ pstr="0"; } int p=Integer.parseInt(pstr); List games = gameDao.queryGamesByPlatform("ios", p);