zoukankan      html  css  js  c++  java
  • hibernate连接oracle数据库进行查询

    按主键查询

     dao层

     public Emp get(Serializable id){
            //通过session的get方法根据加载指定对象
            return (Emp)HibernateUtil.currentSession().get(Emp.class,id);
        }

    service层

    public Emp findEmpById(Integer id){
            Transaction tx=null;
            Emp result =null;
            try {
                tx=HibernateUtil.currentSession().beginTransaction();   //开启事务
                result=empDao.get(id);                                  //调用Dao,根据OID加载指定对象
                tx.commit();
            } catch (HibernateException e) {
                e.printStackTrace();
                if(tx!=null)
                    tx.rollback();  //回滚事务
            }
            return result;
        }

    test测试类

    public static void main(String[] args) {
            EmpService empService = new EmpService();
            //查询
            Emp emp =empService.findEmpById(7788);
            System.out.printf(emp.getEname());
    
        }

    使用HQL

    什么是hql

      hql查询是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念,hql语句中除了java类和属性名称外,查询语句对大小写敏感,

    所以SELECT和select是相同的.但是cn.entity.emp和cn.entity.EMP.hql语句中的关键字建议使用小写字母.

    编写hql

      hql的语法跟我们数据库中写的语法差不多,需要注意的是hql中查询所有的列并不需要select关键字如下,最重要的一点是hql列对应的是类的中的字段名称,而不是数据库中的列

    dao层 

     public List<Emp> findEmp(String job){
            String hql = "from Emp";
            Query query =HibernateUtil.currentSession().createQuery(hql);return  query.list();
        }

    service层

     public void findEmp(String job){
            Transaction tx =null;
            try {
                tx=HibernateUtil.currentSession().beginTransaction();
                List<Emp> emps = empDao.findEmp();
                for (Emp e:emps) {
                    System.out.println(e.getEname());
                }
                tx.commit();
            } catch (HibernateException e) {
                e.printStackTrace();
            }
        }

    这样即可把全表的数据读取出来,或者使用迭代器如下

     public Iterator<Emp> findAll(){
            String hql ="from Emp";     //定义hql
            Query query = HibernateUtil.currentSession().createQuery(hql);
            return query.iterate();        //执行查询
        }
    public Iterator<Emp> findAllEmps(){
            Transaction tx=null;
            Iterator<Emp> emps=null;
            try {
                tx=HibernateUtil.currentSession().beginTransaction();   //打开事务
                emps=empDao.findAll();          //获取数据
                Emp emp=null;
                while (emps.hasNext()){         //判断是否遍历到末尾
                    emp=emps.next();
                    System.out.println("员工名称:"+emp.getEname());
                }
                tx.commit();
            } catch (HibernateException e) {
                e.printStackTrace();
                if(tx!=null)
                    tx.rollback();
            }
            return emps;
        }

    在hql语句中绑定参数

    query接口提供的绑定不同类型的参数的方法

    • setBoolean():绑定Boolean类型的参数
    • setByte():绑定byte类型的参数
    • setDouble():绑定double类型的参数
    • setDate():绑定util.Date类型的参数
    • setString():绑定String类型的参数

    两种语法:

    • setXXX(下标,值)
    • setXXX(参数名称,值)

    如果需要使用setXXX(参数名称,值)进行绑定参数 如下:

    String hql = "from Emp where job=:j";
    Query query =HibernateUtil.currentSession().createQuery(hql);
    query.setString("j",job);

    如果是setXXX(下标,值)参数绑定  如下:

    String hql = "from Emp where job= ?";
    Query query =HibernateUtil.currentSession().createQuery(hql);
    query.setString(1,job);

    注意

       setXXX(参数名称,值) 在hql中 需要使用 :自定义参数名称

      setXXX(下标,值) 在hql中需要使用 ?

    除了以上用于绑定特定类型参数的方法,hibernate还提供了setParameter()方法,用来绑定任意类型的参数.

    public List<Emp> findDate(Emp hireDate){
        String hql = "from Emp where hiretDate > :hiretDate";  // :hiretDate 的hiretDate是与emp类的hiretDate名字一致
        Query query =HibernateUtil.currentSession().createQuery(hql);
        query.setProperties(hireDate);      //传参
        return  query.list();
    }

    分页和投影

      hql中的分页非常简单,如下代码

    public List<Emp> empPage(Integer start,Integer end){
            String hql = "from Emp";
            Query query =HibernateUtil.currentSession().createQuery(hql);
            query.setFirstResult((start-1)*end);      //设置页数
            query.setMaxResults(end);                 //设置每页显示的数据
            return  query.list();
        }
     public void empPage(Integer start,Integer end){
            Transaction tx=null;
            try {
                tx=HibernateUtil.currentSession().beginTransaction();
                List<Emp> emps = empDao.empPage(start,end);
                for (Emp e:emps) {
                    System.out.println(e.getEname());
                }
                tx.commit();
            } catch (HibernateException e) {
                e.printStackTrace();
                if(tx!=null)
                    tx.rollback();
            }
        }

    假设是第二页 查六笔数据如下结果

    我们再来看下数据库中

    投影

      使用from 表名 表示查询表的所有列,使用SELECT 列1, 列2, 列3 from 表名 则可以仅返回指定列,这种操作称为投影。

  • 相关阅读:
    provider: Shared Memory Provider, error: 0
    用户 'sa' 登录失败。 (Microsoft SQL Server,错误: 18456)
    从sqlite 迁移到mysql报错,处理 D:seafile-server_5.0.3_win32seafile-server-5.0.3seahubsql 重新执行这个SQL
    org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
    java.lang.NoClassDefFoundError: org/apache/log4j/spi/ThrowableInformation
    无法完成操作。服务无法在此时接受控制信息。
    MyEclipse出现Unable to install breakpoint in...
    ERROR 1364 (HY000): Field 'id' doesn't have a default value
    各地都在搞大数据,你的家乡有啥特色没——解读2017年地方政府大数据报告
    HTML5桌面通知:notification
  • 原文地址:https://www.cnblogs.com/hfx123/p/9984021.html
Copyright © 2011-2022 走看看