`
风沙星辰
  • 浏览: 54661 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Hibernate 中 执行 原生 SQL 语句

    博客分类:
  • java
阅读更多


用hibernate的executeQuery来执行SQL

其原理如下(从SessionFactory里获得个Session,在调用session的connection方法,通过Statement来执行静态SQL,最后执行executeQuery就可以了)具体如下:

protected Session session = null; protected Transaction tr = null;

String sql = "insert into as_dept2role(roleid,dept_id)value('"+roleId+"','"+deptId+"')"; session=HibernateSessionFactory.getSession();                                                                              

   session.beginTransaction();
//获取connection,执行静态SQL
Statement state = session.connection().createStatement();
state.executeQuery(sql);
tr.commit(); session.close();

当然关于 关闭SESSION 这些方法我写的简单些,主要是为了写 执行SQL这些方法

对于删除只要写个删除语句就可以了

:Transaction tr = session.beginTransaction();

* session.connection() 方法过时 用下面来代替 *
DataSource ds= SessionFactoryUtils.getDataSource(getSessionFactory());
conn=ds.getConnection();

============================================

(二)

public Object get(Class cls, String szId) {
Object obj = this.getHibernateTemplate().get(cls, szId);
return obj;
}
obj.getsessionFaction.opensession返回session


Session session = dao.openSession();
Connection conn = session.connection();
List recordList = new ArrayList();

StringBuffer sql = new StringBuffer();
sql.append("select b.user_name, c.org_name ");
sql.append("from orgmeetinglinkman a, am_user b, organization c ");
sql.append("where a.login_name = b.login_name ");
sql.append("and a.org_id = c.org_id ");

PreparedStatement ps = conn.prepareStatement(sql.toString());
ResultSet rs = ps.execu

============================================

(三)

public List findWithSQL(final String sql) {
   List list = (List) this.getHibernateTemplate().execute(
     new HibernateCallback() {
      public Object doInHibernate(Session session)
        throws SQLException, HibernateException {
       SQLQuery query = session.createSQLQuery(sql);
       query.addScalar("NX",new org.hibernate.type.StringType());
       List children = query.list();
       return children;
      }
     });
   return list;
}

/**
* 查询并返回结果集,结果集中的内容已经都转为了字符串
*/
public List<List<String>> findSql(final String sql) {
   // TODO Auto-generated method stub
   System.out.println("findSql---sql1----->"+sql);
   List<List<String>> mainObjList= (List<List<String>>) getHibernateTemplate().execute(new HibernateCallback() {

    public Object doInHibernate(Session session)
      throws HibernateException, SQLException {

   
     int n=-1;
     Connection con=null;
     PreparedStatement stmt=null;
     ResultSet rs=null;
   
     try
     {
    
      DataSource ds= SessionFactoryUtils.getDataSource(getSessionFactory());
      if(ds==null)
      {
       throw new SQLException("get dataSource is null");
      }
      con=ds.getConnection();
      System.out.println("findSql---sql2----->"+sql);
      stmt=con.prepareStatement(sql);
      rs=stmt.executeQuery();
    
     } catch (HibernateException e)
     {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (SQLException e)
     {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
   
     List<List<String>> list=new ArrayList<List<String>>();//每行为一个list
     try
     {
      ResultSetMetaData rsmd=rs.getMetaData();
      int colsNum=rsmd.getColumnCount();//取得列数
      int rsNum=0;
      while(rs.next())
      {
       rsNum++;
       System.out.println("rsNum==="+rsNum+" ");
       List<String> subList=new ArrayList<String> ();//每列的类型为string
       for(int i=1;i<=colsNum;i++)
       {
        System.out.println("\ti==="+i);
        //int type= rsmd.getColumnType(i);
        String columnType=getDataType(rsmd.getColumnType(i),rsmd.getScale(i)); 
        String val="";
        if(columnType.equalsIgnoreCase("Date"))
        {
         Timestamp timest= rs.getTimestamp(i);
         if(timest!=null)
         {
          long times=timest.getTime();
          Date date=new Date(times);
          SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA);
          val=df.format(date);
         }
        }
        else if(columnType.equalsIgnoreCase("Number"))
        {
         Object obj=rs.getObject(i);
         if(obj!=null)
         {
          int m=rs.getInt(i);
          val=Integer.toString(m);
         }
        }
        else if(columnType.equalsIgnoreCase("blob"))
        {
         val="不支持blob数据的读取";
        }
        else if(columnType.equalsIgnoreCase("clob"))
        {
         val=getOracleClobField(rs, i);
       
        }
        else
        {
         val=rs.getString(i);
        }
        if(val==null)
        {
         val="";
        }
        subList.add(val);
       }
       if(subList.size()>0)
       {
        list.add(subList);
       }
      }
     }
     catch(Exception ex5)
     {
      ex5.printStackTrace();
      System.out.println("ex5.getMessage="+ex5.getMessage());
      list=null;
     }
     finally
     {
      try {
       if (rs != null) {
        rs.close();
        rs = null;
       }
      } catch (Exception e2) {
       // TODO: handle exception
       e2.printStackTrace();
       System.out.println("e2.getMessage="+e2.getMessage());
      }
      try {
       if (stmt != null) {
        stmt.close();
        stmt = null;
       }
      } catch (Exception e3) {
       // TODO: handle exception
       e3.printStackTrace();
       System.out.println("e3.getMessage="+e3.getMessage());
      }
      try {
       if (con != null) {
        con.close();
        con = null;
       }
      } catch (Exception e4) {
       // TODO: handle exception
       e4.printStackTrace();
       System.out.println("e4.getMessage="+e4.getMessage());
      }
    
     }
     return list;
    }

   });
   return mainObjList;
}

// String   columnType=getDataType(rmd.getColumnType(i),rmd.getScale(i)); 
private String getOracleClobField(ResultSet rset, int index)
     throws Exception
{
     StringBuffer buffS = new StringBuffer();
     Clob clob = rset.getClob(index + 1);
     if(clob == null)
         return " ";
     Reader reader = clob.getCharacterStream();
     char buff[] = new char[1024];
     for(int len = 0; (len = reader.read(buff)) != -1;)
         buffS.append(buff, 0, len);
      return buffS.toString();
}
   
private   static   String   getDataType(int   type,int   scale)

   String   dataType=""; 

   switch(type){ 
    case   Types.LONGVARCHAR:   //-1 
     dataType="Long"; 
      break; 
    case   Types.CHAR:         //1 
     dataType="Character"; 
          break; 
    case   Types.NUMERIC:   //2 
     switch(scale)
     { 
         case   0: 
             dataType="Number"; 
             break; 
         case   -127: 
             dataType="Float"; 
             break; 
         default: 
             dataType="Number"; 
     } 
     break; 
    case   Types.VARCHAR:     //12 
     dataType="String"; 
        break; 
    case   Types.DATE:     //91 
     dataType="Date"; 
        break; 
    case   Types.TIMESTAMP:   //93 
     dataType="Date"; 
        break; 
    case   Types.BLOB   : 
        dataType="Blob"; 
        break; 
    default: 
        dataType="String"; 
    } 
    return   dataType;
}
分享到:
评论

相关推荐

    hibernate执行原生sql语句

    hibernate执行原生sql语句

    Hibernate之原生Native SQL查询

    该方式是原生SQL查询的一种方式,需要个人自己书写SQL语句进行操作,用法比较灵活多变,适合比较复杂的SQL查询.该压缩包是本人对该查询方式的一种总结练习

    详解Java的Hibernate框架中的缓存与原生SQL语句的使用

    主要介绍了Java的Hibernate框架中的缓存与原生SQL语句的使用,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下

    Mysql 原生语句中save or update 的写法汇总

    如果使用Hibernate,它自带saverOrUpdate方法,用起来很方便,但如使用原生sql语句呢?   新手最常见的写法是,先通过select语句查询记录是否存在,存在则使用update语句更新,不存在则使用insert语句插入。 ...

    基于SSM+MySQL实现的通用权限管理系统项目【100012852】

    这是一个通用权限管理系统项目,基于SSM(Spring + Spring-MVC +Mybatis)框架开发,其SQL语句持久在Hibernate 中,对原生SQL的支持较好。制作该系统的初衷是用来帮助JavaWeb开发者或初学者学习、借鉴的需要。读者...

    Hibernate实战(第2版 中文高清版)

     15.2.3 Java Persistence中的原生SQL   15.3 过滤集合   15.4 高速缓存查询结果   15.4.1 启用查询结果高速缓存   15.4.2 理解查询高速缓存   15.4.3 什么时候使用查询高速缓存   15.4.4 自然标识符...

    Java Hibernate中使用HQL语句进行数据库查询的要点解析

    HQL是Hibernate框架中提供的关系型数据库操作脚本,当然我们也可以使用原生的SQL语句,这里我们来看一下在Java Hibernate中使用HQL语句进行数据库查询的要点解析:

    SQL查询构建工具Querydsl.zip

    Querydsl是一个Java开源框架用于构建类型安全的SQL查询语句。它采用API代替拼凑字符串来构造查询语句。可跟 Hibernate 和 JPA 等框架结合使用。 基本查询: JPAQuery query = new JPAQuery(entityManager); ...

    基于Java(SSM)+MySQL框架的 JavaWeb 通用权限管理系统【100010078】

    这是一个通用权限管理系统项目,基于 SSM(Spring + Spring-MVC +Mybatis)框架开发,其 SQL 语句持久在 Hibernate 中,对原生 SQL 的支持较好。制作该系统的初衷是用来帮助 JavaWeb 开发者或初学者学习、借鉴的需要...

    Mybatis框架基础

    在原生的Java技术中,需要使用JDBC实现对数据库中的数据访问,执行过程繁琐且相对固定,使用框架可以有效的提高开发效率!此文件包含Mybatis的配置流程! MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 ...

    SpringBoot项目整合MyBatis连接数据库

    在我们日常的开发过程中,肯定不可避免的会使用到数据库以及SQL语句。比如,刚开始学习Java的时候可能会遇到JDBC,它是连接Java和数据库的桥梁,我们可以使用JDBC来建立与数据库之间的连接并且执行相应的SQL语句。...

    最全Hibernate 参考文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate3.04中文文档.chm

    11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...

    Hibernate教程

    11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...

    Hibernate3+中文参考文档

    10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...

    hibernate 框架详解

    使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...

    java jdbc原生连接+连接池.zip

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问解决部分mybatis或者hibernate不支持的数据库,例informix。通过pool连接池提高性能,并将...

    sqltoy-orm框架系统-其他

    sqltoy-orm是比hibernate+myBatis更加贴合项目的orm框架,具有hibernate增删改的便捷性同时也具有比myBatis更加灵活优雅的自定义sql查询功能。 sqltoy-orm支持以下数据库: oracle 从oracle11g到19c db2 9.5+,建议从...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    QueryBudiler,使得更多简单的单表查询可以通过对象组织查询、更改逻辑,避免过多去写相似性的SQL语句,减少DAO接口量。 三、一些亮点 1、Entity的设计:很多人看了也许会说,这个不是POJO,不是纯粹的Java ...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题74:sql语句优化小技巧 Java面试题75:批量插入几百万条数据 Java面试题76:有没有使用过redis Java面试题77:redis的使用场景 Java面试题78:redis存储对象的方式 Java面试题79:redis数据淘汰机制 Java...

Global site tag (gtag.js) - Google Analytics