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 表名 则可以仅返回指定列,这种操作称为投影。

  • 相关阅读:
    在SQLite中使用索引优化查询速度
    SQLite支持的SQL数据操作
    left (outer) join , right (outer) join, full (outer) join, (inner) join, cross join 区别
    深入理解Android内存管理原理(六)
    Merge Sorted Array
    Sort Colors
    Construct Binary Tree from Preorder and Inorder Traversal
    Binary Tree Postorder Traversal
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/hfx123/p/9984021.html
Copyright © 2011-2022 走看看