10
回答
SSH下,普通类调用 dao操作数据库
终于搞明白,存储TCO原来是这样算的>>>   

ssh2 框架下。 我有一个普通类(非action) 调用dao下的方法。实现操作数据库。可是一进dao中。 session值就获取不到。 而是用action类就可以。 这是为什么?

用什么方式可以实现普通类调用dao?

<无标签>
举报
wygxz
发帖于5年前 10回/3K+阅
共有10个答案 最后回答: 5年前
List<Contents> contents=this.hibernateTemplate.executeFind(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
String hql="from Contents c where (c.users.User_id in (select ur.fusers.User_id from User_relation ur where ur.users.User_id=?)  ";
if(flag) hql+=" or c.users.User_id="+user.getUser_id();
hql+=") and c.Reply_id=0 order by c.Content_time desc";
Query query=session.createQuery(hql);
query.setInteger(0, user.getUser_id());
query.setFirstResult(begin).setMaxResults(size);
List<Contents> lists=query.list();
return lists;
}
}); 

=========
这上面是我曾经在hibernate中获取session的方法,就用到了这个内部类。
不知道你用了hibernateTemplate没有。希望能对你有所帮助。

引用来自“情天大圣”的答案

为什么要去DAO里获取session呢,而不是将你需要的session里的值当参数传进DAO里呢?
    public boolean executeSQL(String preparedSql,String[] param) {
     boolean flag = false;
     Session session = getSession();
        /*  处理SQL,执行SQL  */
        try {
         SQLQuery sqlQuery = session.createSQLQuery(preparedSql);
            if( param != null ) {
                for( int i = 0; i < param.length; i++ ) {
                 sqlQuery.setString(i, param[i]);         // 为预编译sql设置参数
                }
            }
            sqlQuery.executeUpdate();    // 执行SQL语句
            flag = true;
        } catch (Exception e) {
         System.out.println("错误信息:" + e.getMessage());
   e.printStackTrace();
  } finally {
   session.flush();
   session.clear();
         session.close();                     // 释放资源
        }
        return flag;
    }
你这样做,还要SSH来做什么
--- 共有 4 条评论 ---
loki_lan回复 @wygxz : 亲,SessionFactory.getCurrentSession在commit之后Session就自动关闭了!用openSession吧 5年前 回复
wygxz回复 @loki_lan : public Session getSession() { return sessionFactory.getCurrentSession(); } 不是传递session值。 亲。 我以为你懂.. 5年前 回复
loki_lan回复 @wygxz : 既然是调用DAO,Session的值怎么可能会在DAO里面不见了呢,调用最多算个值传递吧~不理解你为什么在DAO还可以对Session操作 5年前 回复
wygxz就是自己写个类。然后发现获取不到。想获取到罢了。 5年前 回复

引用来自“xiaojia2008”的答案

SSH 真是害人不浅。。。

随便个开发人员就会依葫芦画瓢 SSH  : DAO -> SERVICE -> ACTION 

哎。。。

要是不会就不要说风凉话好么?
有些东西不一定非要写,比如什么DAO,service,等你真正发现他们有用的时候再写吧,先实现功能再说,,,

把这个普通类定义在applicationContext.xml里,然后把Dao注入进去。

--- 共有 2 条评论 ---
jason-st哦你使用的注解? 5年前 回复
wygxz我都是自动扫描dao的。可是不知道为什么这个类扫描不到。 <context:annotation-config/> <context:component-scan base-package="dl.cd.*"/> 5年前 回复

引用来自“苏叶晚晚”的答案

List<Contents> contents=this.hibernateTemplate.executeFind(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
String hql="from Contents c where (c.users.User_id in (select ur.fusers.User_id from User_relation ur where ur.users.User_id=?)  ";
if(flag) hql+=" or c.users.User_id="+user.getUser_id();
hql+=") and c.Reply_id=0 order by c.Content_time desc";
Query query=session.createQuery(hql);
query.setInteger(0, user.getUser_id());
query.setFirstResult(begin).setMaxResults(size);
List<Contents> lists=query.list();
return lists;
}
}); 

=========
这上面是我曾经在hibernate中获取session的方法,就用到了这个内部类。
不知道你用了hibernateTemplate没有。希望能对你有所帮助。
确实如此啊,在ssh2中,不知道楼主是不是使用了hibernatetemplate来简化数据库操作,如果使用了hibernatetemplate,这个方法就可以获取到session,想executeFind方法传入一个callback回调,在这个匿名内部类中完全可以使用hibernate的api来做了。

引用来自“xiaojia2008”的答案

SSH 真是害人不浅。。。

随便个开发人员就会依葫芦画瓢 SSH  : DAO -> SERVICE -> ACTION 

哎。。。

你懂SSH吗???你真的了解吗???

引用来自“苏叶晚晚”的答案

List<Contents> contents=this.hibernateTemplate.executeFind(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException {
String hql="from Contents c where (c.users.User_id in (select ur.fusers.User_id from User_relation ur where ur.users.User_id=?)  ";
if(flag) hql+=" or c.users.User_id="+user.getUser_id();
hql+=") and c.Reply_id=0 order by c.Content_time desc";
Query query=session.createQuery(hql);
query.setInteger(0, user.getUser_id());
query.setFirstResult(begin).setMaxResults(size);
List<Contents> lists=query.list();
return lists;
}
}); 

=========
这上面是我曾经在hibernate中获取session的方法,就用到了这个内部类。
不知道你用了hibernateTemplate没有。希望能对你有所帮助。

确实可以。

后来我采用了SpringContextPublisher 继承ApplicationContextAware

实现getBean()方法来获取所有注入类。

谢谢你!

顶部