• 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     }

     本文地址:http://www.cnblogs.com/wangjiajun/p/4208077.html 

  • 相关阅读:
    灾备架构图
    Dashboard有什么用
    第一次使用Docker的完整过程
    网页端的消息接收方式
    我理解中的应用架构
    数字化转型模型
    工业4.0的下一个十年
    一文读懂华为全屋智能一文读懂华为全屋智能
    支付总架构解析
    spring boot:shardingsphere+druid整合seata分布式事务(spring boot 2.3.3)
  • 原文地址:https://www.cnblogs.com/wangjiajun/p/4208077.html
Copyright © 2020-2023  润新知