Hibernate4调用SQL和存储过程

最近使用了新的Struts2.20+spring4.0+hibernate4.0,新框架移除了HibernateSupportDao,所以重写了下Hibernate4对SQL和存储过程的操作,以备后查

以下的sessionFactory 对象是通过spring注入
1 private SessionFactory sessionFactory;
2     public void setSessionFactory(SessionFactory sessionFactory) {
3         this.sessionFactory = sessionFactory;
4     }

1、通过SQL查询,以List的方式返回

 1     /**
 2      * 通过SQL查询,结果集不作处理直接返回
 3      * @param queryString 查询字符串
 4      * @param params 参数
 5      * @return
 6      */
 7     @SuppressWarnings("unchecked")
 8     public List<Object> find_sql(String queryString,Object[] params){
 9         Session session = sessionFactory.getCurrentSession();
10         Query query = session.createSQLQuery(queryString);
11         if(null!=params){
12             for(int i=0;i<params.length;i++){
13                 query.setParameter(i, params[i]);
14             }
15         }
16         List<Object> list = query.list();
17         return list;
18     }

2、SQL或存储过程查询,将返回的结果集转换成Map,结果集列名作为键

 1     /**
 2      * 通过SQL查询,将结果集转换成Map对象,列名作为键(适用于有返回结果集的存储过程或查询语句)
 3      * @param queryString
 4      * @param params
 5      * @return
 6      */
 7     @SuppressWarnings("unchecked")
 8     public List<Map<String,Object>> find_sql_toMap(String queryString,Object[] params){
 9         Session session = sessionFactory.getCurrentSession();
10         Query query = session.createSQLQuery(queryString);
11         query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
12         if(null!=params){
13             for(int i=0;i<params.length;i++){
14                 query.setParameter(i, params[i]);
15             }
16         }
17         List<java.util.Map<String,Object>> list = query.list();
18         return list;
19     }

3、SQL执行增、删、改操作,测试使用该方法执行存储过程会报错

 1 /**
 2      * 通过SQL执行无返回结果的语句,执行修改、删除、添加等(适用于无结果集返回SQL语句,不能用于存储过程)
 3      * @param queryString
 4      * @param params
 5      */
 6     public void executeSql(String queryString,Object[] params){
 7         Session session = sessionFactory.getCurrentSession();
 8         Query query = session.createQuery(queryString);
 9         if(null!=params){
10             for(int i=0;i<params.length;i++){
11                 query.setParameter(i, params[i]);
12             }
13         }
14         query.executeUpdate();
15     }

4、执行无结果集返回的存储过程,是第3点的补充

 1 /**
 2      * 通过SQL执行无返回结果的存储过程(仅限于存储过程)
 3      * @param queryString
 4      * @param params
 5      */
 6     public void executeVoidProcedureSql(final String queryString,final Object[] params) throws Exception{
 7         Session session = sessionFactory.getCurrentSession();
 8         session.doWork(new Work(){
 9           public void execute(Connection conn) throws SQLException {
10             ResultSet rs = null;
11             CallableStatement call = conn.prepareCall("{" + queryString + "}");
12             if (null != params) {
13                 for (int i = 0; i <params.length; i++) {
14                     call.setObject(i+1, params[i]);
15                 }
16             }
17             rs = call.executeQuery();
18             call.close();
19             rs.close();
20           }
21        });
22     }

5、通过存储过程查询,返回的结果集必须为单结果集,与第2点方法效果一致

 1     /**
 2      * 通过存储过程查询(单结果集)
 3      * @param sql 查询sql
 4      * @param params 参数
 5      * @param columnNum 返回的列数
 6      * @return
 7      */
 8     public List<Map<String, Object>> find_procedure(final String sql,final Object[] params){
 9         final List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
10         try {
11             Session session = sessionFactory.getCurrentSession();
12             session.doWork(new Work(){
13               public void execute(Connection conn) throws SQLException {
14                   CallableStatement cs=null;
15                   ResultSet rs=null;
16                   cs = conn.prepareCall(sql);
17                     for(int i=1;i<=params.length;i++){
18                         cs.setObject(i, params[i-1]);//设置参数
19                     }
20                     rs = cs.executeQuery();
21                     ResultSetMetaData metaData = rs.getMetaData();
22                     int colCount=metaData.getColumnCount();
23                     while(rs.next()){
24                         Map<String, Object> map = new HashMap<String, Object>();
25                         for(int i=1;i<=colCount;i++){
26                             String colName=metaData.getColumnName(i);
27                             map.put(colName, rs.getObject(colName));
28                         }
29                         result.add(map);
30                     }
31                     close( cs, rs);
32               }
33            });
34             return result;
35         } catch (Exception e) {
36             e.printStackTrace();
37         }
38         return null;
39     }

6、通过存储过程查询,适用返回的结果集有一个或多个

 1 /**
 2      * 通过存储过程查询(多结果集)
 3      * @param sql 查询sql
 4      * @param params 参数
 5      * @param columnNum 返回的列数
 6      * @return
 7      */
 8     public List<List<Map<String, Object>>> find_procedure_multi(final String sql,final Object[] params){
 9         final List<List<Map<String, Object>>> result = new ArrayList<List<Map<String, Object>>>();
10         try {
11 //            conn = SessionFactoryUtils.getDataSource(sessionFactory).getConnection();
12             Session session = sessionFactory.getCurrentSession();
13             session.doWork(new Work(){
14                 public void execute(Connection conn) throws SQLException {
15                     CallableStatement cs=null;
16                     ResultSet rs=null;
17                     cs = conn.prepareCall(sql);
18                     for(int i=1;i<=params.length;i++){
19                         cs.setObject(i, params[i-1]);
20                     }
21                     boolean hadResults = cs.execute();
22                     ResultSetMetaData metaData = null;
23                     while(hadResults){//遍历结果集
24                         List<Map<String, Object>> rsList = new ArrayList<Map<String, Object>>();//用于装该结果集的内容
25                         rs = cs.getResultSet();//获取当前结果集
26                         metaData=rs.getMetaData();
27                         int colCount=metaData.getColumnCount();//获取当前结果集的列数
28                         while(rs.next()){
29                             Map<String, Object> map = new HashMap<String, Object>();
30                             for(int i=1;i<=colCount;i++){
31                                 String colName=metaData.getColumnName(i);
32                                 map.put(colName, rs.getObject(colName));
33                             }
34                             rsList.add(map);
35                         }
36                         result.add(rsList);
37                         close(null, rs);//遍历完一个结果集,将其关闭
38                         hadResults=cs.getMoreResults();//移到下一个结果集
39                     }
40                     close(cs, rs);
41                 }
42             });
43             return result;
44         } catch (Exception e) {
45             e.printStackTrace();
46         }
47         return null;
48     }

代码中的close方法,执行doWork的execute方法中不能关闭connection,connection连同session由spring管理

 1 private void close(CallableStatement cs,ResultSet rs){
 2         try {
 3             if(cs!=null){
 4                 cs.close();
 5             }
 6             if(rs!=null){
 7                 rs.close();
 8             }
 9         } catch (Exception e) {
10             e.printStackTrace();
11         }
12     }
时间: 2025-01-06 06:36:41

Hibernate4调用SQL和存储过程的相关文章

VS中调用SQL SERVER存储过程

 存储过程是经过编译的,永久保存在数据中的一组SQL语句,通过创建和使用存储过程可以提高程序的重用性和扩展性,为程序提供模块化的功能,还有利于对程序的维护和管理.下面就详谈一下,VB.NET如何调用SQL SERVER中的存储过程. 以上就是本人数据库中的一张表-OnDutyInfo 创建存储过程 <span style="font-size:18px;">create procedure pro_OnDutyInfo --存储过程名 @teacherID char(1

Cpp 调用sql server 存储过程时不返回output参数解决办法

Cpp 调用sql server 存储过程时不返回output参数,但是在ssms中调用的时候能正常返回,貌似数据库和应用代码是一切正常,再测试用c#调用也能正常获取output参数,在存储过程的的开始加上set nocount on,就能解决这个问题. 墙外原文件:点击打开链接

java 调用 sql server存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进

qt调用sql server存储过程并获取output参数

最近新做的一个项目需要使用qt连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章,如果是连接另一台机器的sql server就不用执行第一步“开启ODBC驱动”了 http://www.cnblogs.com/shaolw/p/3411285.html 另外指定数据库用户名和密码可以使用Uid和Pwd,即原文dsn参数可以这样写: QString dsn = QString("Driver={

C#调用SQL中存储过程并用DataGridView显示执行结果

//连接数据库 SqlConnection con = new SqlConnection("server=服务器名称;database=数据库名称;user id=登录名;pwd=登录密码;"); //打开数据库 con.Open(); //调用存储过程 SqlCommand scd = new SqlCommand("存储过程名称", con); scd.CommandType = CommandType.StoredProcedure;//调用命令改成存储格式

c#客户端调用sql server 存储过程速度慢的问题

1 : c#代码是 SqlConnection connNew = null; connNew = new SqlConnection(@"Data Source="XXX"); connNew.Open(); SqlCommand commNew = connNew.CreateCommand(); commNew.CommandText = "sp_catcher_MeraRptCAV_Insert_detail"; commNew.CommandTy

Java调用SQL Server存储过程

1.调用普通存储过程(1)创建存储过程CREATE Procedure [dbo].[GetContactListByName]  /*根据联系人姓名获取联系人信息*/@Name nvarchar(50)Asbegin    select Contact.Id,Contact.Name,Phone,Email,QQ,GroupName from Contact,ContactGroup where Contact.GroupId=ContactGroup.Id and Name like '%'

MVC c# 调用sql的存储过程

var hid = new SqlParameter { ParameterName = "HistoryId", Value = history.Id, Direction = ParameterDirection.Input }; var sid = new SqlParameter { ParameterName = "StoreId", Value = StoreId, Direction = ParameterDirection.Input }; var

laravel调用sql server存储过程

alter proc [dbo].[aaa](    @AgencyID int,--代理商ID    @AdminID int --结算操作人ID(管理员ID))asbegin    select top 5 * from tusers    return 5end $dbh = DB::connection()->getPdo(); $stmt = $dbh->prepare("EXEC aaa ?,?");//Web_pAgencyBalance_Single $a