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. CLOSE_WAIT状态的原因与解决方法 --转

    转自:http://blog.chinaunix.net/uid-20357359-id-1963662.html 这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司 ...

  2. 关于Xcode7中的tbd文件

    tbd 是 text-based stub libraries的意思, 是苹果在Xcode7中使用的一个技术,便于减少Xcode7中SDK的体积. 下面讲解下Xcode7如何通过tbd这个技术减少SD ...

  3. Android(java)学习笔记142:使用Sqlite基本流程

  4. dateTimePicker日期时间插件-----限定节假日调休的可选择性

    需求:在项目中需要一款这样的日期插件,可以选择年月日,时分秒,对法定节假日不能选择,因法定节假日进行的调休可以选择: 现在使用的比较多的日期插件比如:Wdatepicker,jqueryUI的date ...

  5. PHP 获取当前日期的上个月的日期

    获取当前日期的上个月的日期 <?php /** *参考有: *http://www.oschina.net/code/snippet_96541_4015 *http://stackoverfl ...

  6. 无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。

    引自:http://www.cnblogs.com/chillsrc/archive/2010/06/28/1766816.html 安装完VS2010中文版之后,又安装了Silverlight4_T ...

  7. Android开发——构建自定义组件

    Android中,你的应用程序程序与View类组件有着一种固定的联系,例如按钮(Button). 文本框(TextView), 可编辑文本框(EditText), 列表框(ListView), 复选框 ...

  8. 自定义控件学习 Day44

    自定义控件学习 Day44 onMeasure 测量控件的宽高. onLayout 设置位置 onDarw 绘制控件 问题堆栈 1. 事件监听传递 最外层获取到控件,根据事件事件传递机制,返回值fal ...

  9. Entity Framework 使用sql语句分页(查询视图)

    1.查询视图 //3.查询视图 var sql = @" SELECT D.* FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY TestView.B_M ...

  10. No application 'meetme' for extension 错误

    在asterisk中搭建简单会议室,在extensions.conf中执行到 exten => 18,n,MeetMe(18,p) asterisk控制台提示:Aug 6 8:28:41 WAR ...