mewuhua 2009-10-11 13:18
浏览 447
已采纳

Hibrernate中的Dao

个位大虾 看看小弟写的 使用Hibernate有没有什么问题 或是需要规范的 谢谢。

先声明个Session

private static Session session;

这个是获得数据库中某个表的所有数据

public List getByAll(String hql){
try{
session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
List list = query.list();
return list;
}catch(Exception e){
e.printStackTrace();
}
return null;
}

这个是获得数据库中单个列的数据

public Object getById(Object o,int id) {
session = HibernateSessionFactory.getSession();
Object obj;
try{
obj = session.get(o.getClass(),new Integer(id));
}catch(Exception e){
obj = new Object();
e.printStackTrace();
}finally{

    }
    return obj;
}

这个是存入数据库中的方法

public void saveExecuteQuery(Object o) {
session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
try{
session.save(o);
tx.commit();
}catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally{

    }
}

这个是修改数据库中某个列的值
public void updateExcuteUpdate(String hql) {
session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
try{
Query query = session.createQuery(hql);
query.executeUpdate();
tx.commit();
}catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally{

    }

}

删除某条数据
public void deleteExcuteUpdate(String hql) {
session = HibernateSessionFactory.getSession();
Query query = session.createQuery(hql);
Transaction tx = session.beginTransaction();
try{
query.executeUpdate();
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}finally{

    }

}

手动关闭Session
public void closeSession(){
session.close();
}
[b]问题补充:[/b]
哦,我已经跑起来了。我给了10分吖
还逮也给说说如何改进。
[b]问题补充:[/b]
我对于静态的理解不是很透彻
在这里我写的private static Session session;
开始的时候写的是 private Session session。 但想想了 怕出错
就用static。能不能给我详解一下 为什么不用static 我想的就是用个单列
最好是一个用户一个session 不必每次都实例化一个session
最好能给举例说明一下好处。
[b]问题补充:[/b]
呵呵,我昨天买了本设计模式方面的书,正在努力的研究中... ...

[b]问题补充:[/b]
再弱弱的问一句
session这个时候应该用什么关闭
是session.colse还是HibernateSessionFactory.closeSession()
我准备在所有的方法的
try{
..
..
代码中
..
..
}catch(Exception e){
HibernateSessionFactory.closeSession()
e.printStackTrace();
}

有没有问题

还是这两种关闭的不同

  • 写回答

13条回答 默认 最新

  • CaiHuajiang 2009-10-11 14:33
    关注

    Dao
    [code="java"]package com.test;

    import java.util.List;

    import org.hibernate.Session;

    public class TestDao {
    private Session session;

    public Session getSession() {
        return session;
    }
    
    public void setSession(Session session) {
        this.session = session;
    }
    
    public List getByAll(String hql) {
        return session.createQuery(hql).list();
    }
    
    public Object getById(Object o, int id) {
        return session.get(o.getClass(), new Integer(id));
    }
    
    public void saveExecuteQuery(Object o) {
        session.save(o);
    }
    
    public void updateExcuteUpdate(String hql) {
        session.createQuery(hql).executeUpdate();
    }
    
    public void deleteExcuteUpdate(String hql) {
        session.createQuery(hql).executeUpdate();
    }
    

    }[/code]
    Service
    [code="java"]package com.test;

    import java.util.List;

    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;

    import com.flyy.util.HibernateSessionFactory;

    public class TestService {
    private TestDao dao = new TestDao();
    private Session session = HibernateSessionFactory.getSession();

    public TestService() {
        dao.setSession(session);
    }
    
    public List getByAll(String hql) {
        return dao.getByAll(hql);
    }
    
    public Object getById(Object o, int id) {
        return dao.getById(o, id);
    }
    
    public void saveExecuteQuery(Object o) {
        Transaction tx = session.getTransaction();
        try {
            tx.begin();
            dao.saveExecuteQuery(o);
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
        }
    }
    
    public void updateExcuteUpdate(String hql) {
        Transaction tx = session.getTransaction();
        try {
            tx.begin();
            session.createQuery(hql).executeUpdate();
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
        }
    }
    
    public void deleteExcuteUpdate(String hql) {
        Transaction tx = session.getTransaction();
        try {
            tx.begin();
            session.createQuery(hql).executeUpdate();
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
        }
    }
    

    }[/code]
    这样来说,事务管理和日志管理也统一了,不会显得那么混乱了,session绝对不能设置为类变量,除非你能保证这个程序永远只有一个人用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型