項目中需要一個json對象,封裝的時候,需要數據的列名。
在jdbc里面,可以有個ResultMetaData對象獲取列名字。因為我用的是hibernate,這個框架已經封裝了很多,一般是難以獲得resultset的。
經過不懈的bing和google(作為一個環保的准程序員,拒絕用百度了),發現在hibernate里面,可以獲得resultset對象。不過現在是hibernate4,比較新,獲取的方式改變了不少。
在之前的hibernate里面,可以用下面的代碼獲取connection,還有其他對象。
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; }
這樣,可以像jdbc一樣,使用resultset等對象。
但是在hibernate4里面,方法已經改了,SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection() 這一句已經不能使用,換的是新的方法。
如下:
getSession().doWork(new Work() { @Override public void execute(Connection connection) { } });
在方法體里面,可以直接使用connection了。
但是這樣,返回的是一個void,而我要取用的是獲得resultset對象。好在IDE有智能提示,發現里面有一個能傳遞返回值得的方法,算是上面一種方法的擴展吧。
直接上我項目中的代碼:
@Test public void tests() throws SQLException { Session session=HibernateSessionFactory.getSession(); ResultSet resultSet=session.doReturningWork( new ReturningWork<ResultSet>() { @Override public ResultSet execute(Connection connection) throws SQLException { String sql="select * from t_auth"; PreparedStatement preparedStatement=connection.prepareStatement(sql); ResultSet resultSet=preparedStatement.executeQuery(); return resultSet; } } ); while (resultSet.next()){ System.out.println("rs:"+resultSet.getString("authid")); } }
就是這個doReturnWork方法,里面通過內部類,把resultset對象一層一層返回給這個doReturnWork,這樣就可以像用jdbc一樣使用hibernate了。
個人一點心得,希望能給大家一些幫助。