Hibernate Session 获取connection

由于最近一个项目要用到一条辅助的SQL ,hibernate里面的SQLQuery API 总的SQL语句不能包含 : 冒号, 固放弃Hibernate, 直接使用JDBC.

Hibernate3.3.2版本中getSession().connection()已被弃用,替代方法

SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection()

原有方法

getSession().connection()

来自类org.springframework.orm.hibernate3.SessionFactoryUtils

例子:

      

  java.sql.Connection c = null;
java.sql.PreparedStatement ps = null;
java.sql.ResultSet rs = null; public List method(String sql) {
List ret = new ArrayList();
try {
c = SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection();
ps = c.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
.....
}
ret.add(ro);
}
} catch (Exception e) {
e.printStackTrace(); } finally {
close();
}
return ret;
}

我的demo

/**
*
*
* @author mjorcen
* @email mjorcen@gmail.com
* @dateTime Jul 4, 2014 5:43:05 PM
* @version 1
* @throws SQLException
*/
private void getTop() throws SQLException {
StringBuilder sb = new StringBuilder();
sb.append("SELECT X.COMMENT_ID, X.TOTAL_NO, X.ORDER_NO, IFNULL(X.ORDER_NO / X.TOTAL_NO, 1) AS PERCENTAGE_NO ");
sb.append("FROM (SELECT @rowNum := @rowNum + 1 AS ORDER_NO, @rowCount AS TOTAL_NO, t.COMMENT_ID, t.COMMENT_SPENDING ");
sb.append(" FROM T_SD_COMMENT t, (SELECT @rowNum := 0 ");
sb.append(" ) b, (SELECT @rowCount := ( ");
sb.append(" SELECT COUNT(*) ");
sb.append(" FROM T_SD_COMMENT ");
sb.append(" WHERE to_days(CREATE_TIME) >= to_days(now()) ");
sb.append(" ) ");
sb.append(" ) c ");
sb.append(" WHERE to_days(t.CREATE_TIME) >= to_days(now()) ORDER BY t.COMMENT_SPENDING ,t.COMMENT_ID ");
sb.append(" ) X ");
sb.append("WHERE X.COMMENT_ID = ? ");
Connection c = this.commentService.getSession().connection();
PreparedStatement ps = c.prepareStatement(sb.toString());
ps.setInt(1, this.paramComment.getCommentId());
ResultSet rs = ps.executeQuery();
if (rs.next()) {
System.out.println("COMMENT_ID = " + rs.getInt("COMMENT_ID"));
System.out.println("TOTAL_NO = " + rs.getInt("TOTAL_NO"));
System.out.println("ORDER_NO = " + rs.getInt("ORDER_NO"));
System.out.println("PERCENTAGE_NO = " + rs.getDouble("PERCENTAGE_NO"));
}
}

Hibernate API中让使用doWork(Work,work),描述如下:

connection() 
          Deprecated. (scheduled for removal in 4.x). Replacement depends on need; for doing direct JDBC stuff use doWork(org.hibernate.jdbc.Work); for opening a 'temporary Session' use (TBD).

Work接口的execute()方法用于执行直接通过JDBC API来访问数据库的操作:

public interface Work {
// 直接通过JDBC API来访问数据库的操作
public void execute(Connection connection) throws SQLException;
}

Session的doWork(Work  work)方法用于执行Work对象指定的操作,即调用Work对象的execute()方法。

Session会把当前使用的数据库连接传给execute()方法。

过程如下:

Transaction tx = session.beginTransaction();
// 定义一个匿名类,实现了Work接口
Work work = new Work() {
public void execute(Connection connection) throws SQLException {
// 通过JDBC API执行用于批量更新的SQL语句
PreparedStatement stmt = connection
.prepareStatement("update CUSTOMERS set AGE=AGE+1 "
+ "where AGE>0 ");
stmt.executeUpdate();
}
};

执行work

session.doWork(work);
tx.commit();

当通过JDBC API中的PreparedStatement接口来执行SQL语句时,SQL语句中涉及到的数据不会被加载到Session的缓存中,因此不会占用内存空间。

 

Hibernate Session 获取connection的更多相关文章

  1. atitit.获取connection hibernate4

    atitit.获取connection hibernate4 1. SessionFactoryUtils法(推荐) 1 2. ConnectionProvider 法( ) 1 3. 嘎自实现法(不 ...

  2. [原理][源代码解析]spring中@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关系---转载

    问题: 一. 1. Spring 如何处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSession ? 3. propagati ...

  3. [原理][来源解析]spring于@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关联

    Spring 捆绑Hibernate. 夹: 一.  1. Spring 怎样处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSe ...

  4. hibernate.Session简介

    ★→→SessionFactory (org.hibernate.SessionFactory) 包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在各个事务(tra ...

  5. Hibernate Session & Transaction详解

    Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...

  6. Hibernate4获取Connection,ResultSet对象

    项目中需要一个json对象,封装的时候,需要数据的列名. 在jdbc里面,可以有个ResultMetaData对象获取列名字.因为我用的是hibernate,这个框架已经封装了很多,一般是难以获得re ...

  7. Could not open Hibernate Session for transaction;

    javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Co ...

  8. org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open con

    org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session f ...

  9. HibernateException: No Hibernate Session bound to thread

    解决No Hibernate Session bound to thread 背景交代 在使用this.getHibernateTemplate().getSessionFactory().getCu ...

随机推荐

  1. linux atime ctime mtime

    touch testtime 1. stat testtime[为文件名] 可以查看这个文件名的三者状态 2.ll testtime;ll --time=atime testtime ;ll --ti ...

  2. Linux--------------更改yum

    1.进入yum配置文件目录        cd /etc/yum.repos.d    2.备份配置文件        mv CentOS-Base.repo CentOS-Base.repo.bak ...

  3. Linux下如何在打开终端的时候自动配置相关环境

    参考博客“Linux启动文件.设置环境变量的位置”(http://www.2cto.com/os/201305/208251.html) 在不可取的root权限的时候可以选择编辑~/.bashrc文件 ...

  4. Eclipse中绑定java源代码

    如何在Eclipse sdk中查看jar源代码如:*.jar  1.点 “window”-> "Preferences" -> "Java" -&g ...

  5. Linux搭建SSH服务器

    Linux 远程登录服务:ssh ·SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Te ...

  6. VIM 及正则表达式

    VIM及正则表达式 一.查找/Search + 统计 1.统计某个关键字 方法是:%s:keyword:&:gn. 其中,keyword是要搜索的关键字,&表示前面匹配的字符串,n表示 ...

  7. (hdu)1022 Train Problem I 火车进站问题

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1022 Problem Description As the new term comes, ...

  8. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(一)

    项目组用air来开发手游, 但有些在原生应用里很容易实现的功能没有办法在air中直接调用,比如说震动,服务等等.但Adobe 提供了一种方法让air间接调用本地代码(java,object-c...) ...

  9. linux相关解压命令

    ZIP 我们可以使用下列的命令压缩一个目录: # zip -r archive_name.zip directory_to_compress 下面是如果解压一个zip文档: # unzip archi ...

  10. 系统重装后phpnow修复

    最近在捣鼓wordpress,主题写了一半然后就重装了win8,在新系统里面访问127.0.0.1的时候出现无法访问的情况.主题写了一半,又不想重装wordpress导数据库这些繁琐的过程,于是,尝试 ...