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. 【转】GitHub删除一个仓库——2013-08-27 21

    http://xiacijian.blog.163.com/blog/static/849931902012111195041170/ 1.进入要删除的仓库 2.找到 导航栏 Code  NetWor ...

  2. wpf 计算器布局练习

    先看一下windows自带计算机的布局: 大概布局能看出,有菜单栏(menu),有显示框(textbox),然后剩下的6行5列的布局 先看下代码: <StackPanel> <Gri ...

  3. 关于着色器LinearGradient的使用

    LinearGradient我们可以将之译为线型渐变.线型渲染等,译成什么不重要,重要的是它的显示效果是什么样子,今天我们就一起来看看. 先来看看LinearGradient的构造方法: /** Cr ...

  4. 文件处理-Directory类 (C#)

    转http://skybirdzw.blog.163.com/blog/static/7257062620099751329403/ 文件处理-Directory类 (C#) Directory.Cr ...

  5. ios开发时候,出现A valid provisioning profile for this executable was not found 错误

    今天一大早起来,做ios的开发,发现了一下错误:A valid provisioning profile for this executable was not found 错误的产生是在开发模式下产 ...

  6. 推荐几个对Asp.Net开发者比较实用的工具 2

    推荐几个对Asp.Net开发者比较实用的工具.大家有相关工具也可以在评论区留言,一起努力学习. 作为程序员要有挑战精神,大家可以尝试一下这些工具. 已经有篇文章写到了vs的扩展工具,这里不再累赘,请查 ...

  7. Android 设计随便说说之简单实践(消息流动)

    在上面两篇分别说明了设计中较为简单也是很关键的实践点. 第一模块划分,它是根据每个模块所承载的业务,进行划分,是应用程序一个静态的描述. 第二合理组合,它是是将每个模块调动起来,共同实现业务,是一个准 ...

  8. Java输出日历

    源码链接:http://pan.baidu.com/s/1o6xeybK

  9. js简单日期获取( 菜鸟入门基础)

    关于js日期的获取要用到最基本的Date()方法获取当日的日期 var d =new Date();  //定义日期对象 var y=d.getFullYear();   //获取年 var m=d. ...

  10. Oracle的安装

    本人所使用的数据库平台为Oracle 11g 1.下载Oracle Oracle官网即可下载Oracle平台.不过网上资源丰富,大家也可在百度云网盘找到合适的版本. 附上本人网盘里存储的各个Oracl ...