Hibernate增删改查一些方法的区别

上一篇http://blog.youkuaiyun.com/qq_32588349/article/details/51465261


简单总结

  • save()和persist()
    1).二者都是将瞬时态对象保存到数据库转为持久态对象,区别是save()立即执行,而persist()需要在清理缓存(flush方法或提交事务)时才执行。
    2).save()方法立即分配OID,persist()只有清理缓存(flush方法或提交事务)时才会分配OID。

  • update()、saveOrUpdate()、merge()
    1).update()是将游离态对象更新到数据库变为持久态对象,若游离态对象OID在数据库不存在,会抛出异常。
    2).saveOrUpdate()是根据对象状态判断执行方法,对于瞬时态对象执行save(),对于游离态执行update()。
    3).merge()方法类似于saveOrUpdate(),区别在于不用考虑游离态对象的OID在数据库中是否存在,不存在执行save()。merge()不会改变原来对象的状态,但是会返回一个新的持久态对象。

  • delete()
    1).若删除的为持久态对象,会在清理缓存的时候执行delete语句删除。
    2).若删除的为游离态对象,回先将该对象与当前Session关联,在清理缓存时执行delete语句删除。
    3).delete()方法一次只能删除一个对象。

  • get()和load()
    1).懒加载开启情况下,load()只有需要获取其非OID属性时才会去查询,而get()不受懒加载影响。
    2).如果不存在于对象OID对应的记录,load()方法抛出异常,而get()方法返回null。


测试代码

  • 使用Hibernate添加数据(save()和persist()的区别)
1.调用session.save()方法实现添加数据
    /**
     * 不开启事务且不提交事务也就是不清理缓存
     */
    public void saveEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //不开启事务
        //Transaction transaction = session.beginTransaction();
        //创建一个实体类对象
        Emp emp = new Emp();
        //设置值-如果主键方式为数据库自动递增或序列生成,不用设置
        emp.setEname("save测试名");
        //..其余属性略
        //持久化
        session.save(emp);
        //改变持久化对象属性                   
        emp.setEname("改变后的save测试名");  
        //不提交事务
        //transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台显示如下-并未执行update语句
    Hibernate: 
    insert 
    into
        hibernate_data.emp
        (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
    values
        (?, ?, ?, ?, ?, ?, ?)

    /**
     * 开启事务但不提交事务也就是不清理缓存
     */
    public void saveEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个实体类对象
        Emp emp = new Emp();
        //设置值-如果主键方式为数据库自动递增或序列生成,不用设置
        emp.setEname("save测试名");
        //..其余属性略
        //持久化
        session.save(emp);
        //改变持久化对象属性                   
        emp.setEname("改变后的save测试名");  
        //不提交事务
        //transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台显示如下-并未执行update语句
    Hibernate: 
    insert 
    into
        hibernate_data.emp
        (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
    values
        (?, ?, ?, ?, ?, ?, ?)

    /**
     * 开启事务且提交事务清理缓存
     */
    public void saveEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个实体类对象
        Emp emp = new Emp();
        //设置值-如果主键方式为数据库自动递增或序列生成,不用设置
        emp.setEname("save测试名");
        //..其余属性略
        //持久化
        session.save(emp);
        //输出雇员编号
        System.out.println("雇员编号:" + emp.getEmpno());
        //改变持久化对象属性
        emp.setEname("改变后的save测试名");
        //清理缓存-与提交事务的区别在于清理缓存可以回滚事务
        //session.flush();
        //提交事务-事务提交会清理缓存
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台显示如下-执行update语句
    Hibernate: 
    insert 
    into
        hibernate_data.emp
        (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
    values
        (?, ?, ?, ?, ?, ?, ?)
    雇员编号:16    
    Hibernate: 
        update
            hibernate_data.emp 
        set
            ENAME=?,
            JOB=?,
            MGR=?,
            HIREDATE=?,
            SAL=?,
            COMM=?,
            DEPTNO=? 
        where
            EMPNO=?

//在save()之后改变属性如果不开启事务不提交事务只调用session.flush()也会计划update语句且将对象放入Session缓存中,之后如果再提交事务也会同步到数据库中。这里就不举例了。

- 当调用save()方法后,会执行以下操作
 1).无论是否开始事务或清理缓存都会将对象加入到Session的缓存中,使它进入持久化状态。
 2).无论是否开始事务或清理缓存都会根据映射文件指定的配置,为持久化对象分配唯一的OID。
 3).无论是否开启事务或清理缓存都会执行一个insert语句,比如多次
    执行save()方法后不提交事务,会发现总是输出insert语句且获得一个新的OID。
- save()方法之后又对对象的属性进行了更改且执行事务提交或清理缓存时,会额外执行一条update语句
2.调用session.persist()方法实现添加数据
    /**
     * 不开启事务且不提交事务
     */
    public void persistEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //不开启事务
        //Transaction transaction = session.beginTransaction();
        //创建一个实体类对象
        Emp emp = new Emp();
        //设置值-如果主键方式为数据库自动递增或序列生成,不用设置
        emp.setEname("persist测试名");
        //..其余属性略
        //持久化
        session.persist(emp);
        //输出雇员编号
        System.out.println("雇员编号:" + emp.getEmpno());
        //更改属性
        emp.setEname("更改persist测试名");
        //不提交事务
        //transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下-未执行任何SQL语句,未获取雇员编号
    雇员编号:null

    /**
     * 不开启事务且不提交事务,但是清理缓存
     */
    public void persistEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //不开启事务
        //Transaction transaction = session.beginTransaction();
        //创建一个实体类对象
        Emp emp = new Emp();
        //设置值-如果主键方式为数据库自动递增或序列生成,不用设置
        emp.setEname("persist测试名");
        //..其余属性略
        //持久化
        session.persist(emp);
        //输出雇员编号
        System.out.println("雇员编号:" + emp.getEmpno());
        //更改属性
        emp.setEname("更改persist测试名");
        //清理缓存
        session.flush();
        //不提交事务
        //transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下-清理缓存前,不计划任何SQL语句,不分配OID,清理之后执行且分配.
    雇员编号:null
    Hibernate: 
        insert 
        into
            hibernate_data.emp
            (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
        values
            (?, ?, ?, ?, ?, ?, ?)
    Hibernate: 
        update
            hibernate_data.emp 
        set
            ENAME=?,
            JOB=?,
            MGR=?,
            HIREDATE=?,
            SAL=?,
            COMM=?,
            DEPTNO=? 
        where
            EMPNO=?
    雇员编号:33

    /**
     * 不开启事务且不提交事务且不清理缓存
     */
    public void persistEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个实体类对象
        Emp emp = new Emp();
        //设置值-如果主键方式为数据库自动递增或序列生成,不用设置
        emp.setEname("persist测试名");
        //..其余属性略
        //持久化
        session.persist(emp);
        //输出雇员编号
        System.out.println("雇员编号:" + emp.getEmpno());
        //更改属性
        emp.setEname("更改persist测试名");
        //不提交事务
        //transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下-计划insert语句,分配OID,不计划update语句
    Hibernate: 
        insert 
        into
            hibernate_data.emp
            (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
        values
            (?, ?, ?, ?, ?, ?, ?)
    雇员编号:34
    雇员编号:34

- 当调用persist()方法后,会执行以下操作
 1).只有开启事务或清理缓存才会将对象加入到Session的缓存中,使它进入持久化状态。
 2).只有开启事务或清理缓存才会根据映射文件指定的配置,为持久化对象分配唯一的OID。
 3).只有开启事务或清理缓存才会执行一个insert语句。
- persist()方法之后又对对象的属性进行了更改且执行事务提交或清理缓存时,会额外执行一条update语句
  • 使用Hibernate更新数据(update()和saveOrUpdate()区别)
1.调用update()方法更新数据
    /**
     * 开启事务但是不提交不清理缓存
     */
    public void updateEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个瞬时态对象
        Emp emp = new Emp();
        //设置OID变为游离态对象
        emp.setEmpno(1);
        emp.setEname("update测试名");
        //..其余属性略
        //变更为持久态对象
        session.update(emp);
        //更改属性
        emp.setEname("测试名");
        //不提交事务
        //transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输入如下-无任何输出

    /**
     * 开启事务且提交事务或清理缓存
     */
    public void updateEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个瞬时态对象
        Emp emp = new Emp();
        //设置OID变为游离态对象
        emp.setEmpno(1);
        emp.setEname("update测试名");
        //..其余属性略
        //变更为持久态对象
        session.update(emp);
        //更改属性
        emp.setEname("测试名");
        //提交事务
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下-仅执行一条update语句
    Hibernate: 
        update
            hibernate_data.emp 
        set
            ENAME=?,
            JOB=?,
            MGR=?,
            HIREDATE=?,
            SAL=?,
            COMM=?,
            DEPTNO=? 
        where
            EMPNO=?

- 当调用update()方法后,会执行以下操作
 1).只对具备OID也就是游离态对象有效,对瞬时态(不具备OID)对象无效,将游离态转为持久态。
 2).只有提交事务或清理缓存才会将对象加入到Session的缓存中,执行一条update语句,使它进入持久化状态。
 3).无论对对象属性修改多少次,清理缓存时只执行一次update语句。

2.调用saveOrUpdate()方法更新数据

    /**
     * 更新瞬时态对象
     */
    public void saveOrUpdateEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个瞬时态对象
        Emp emp = new Emp();
        //不设置OID变为游离态对象
        //emp.setEmpno(1);
        emp.setEname("测试名");
        //..其余属性略
        session.saveOrUpdate(emp);
        //输出雇员编号
        System.out.println("雇员编号:" + emp.getEmpno());
        //更改属性
        emp.setEname("更改名");
        //提交事务
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();

    控制台输出如下
    Hibernate: 
    insert 
    into
        hibernate_data.emp
        (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
    values
        (?, ?, ?, ?, ?, ?, ?)
    雇员编号:38
    Hibernate: 
        update
            hibernate_data.emp 
        set
            ENAME=?,
            JOB=?,
            MGR=?,
            HIREDATE=?,
            SAL=?,
            COMM=?,
            DEPTNO=? 
        where
            EMPNO=?

    /**
     * 更新游离态对象
     */
    public void saveOrUpdateEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建一个瞬时态对象
        Emp emp = new Emp();
        //设置OID变为游离态对象
        emp.setEmpno(1);
        emp.setEname("测试名");
        //..其余属性略
        session.saveOrUpdate(emp);
        //更改属性
        emp.setEname("更改名");
        //提交事务
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下
    Hibernate: 
    update
        hibernate_data.emp 
    set
        ENAME=?,
        JOB=?,
        MGR=?,
        HIREDATE=?,
        SAL=?,
        COMM=?,
        DEPTNO=? 
    where
        EMPNO=?

    /**
     * 更新持久态对象
     */
    public void saveOrUpdateEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //获得持久态对象
        Emp emp = (Emp) session.get(Emp.class, 1);
        session.saveOrUpdate(emp);
        //更改属性-此属性与数据库对应数据字段数据一致
        emp.setEname("更改名");
        //提交事务
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下-此语句为get()方法输出
    Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_4_0_,
        emp0_.ENAME as ENAME2_4_0_,
        emp0_.JOB as JOB3_4_0_,
        emp0_.MGR as MGR4_4_0_,
        emp0_.HIREDATE as HIREDATE5_4_0_,
        emp0_.SAL as SAL6_4_0_,
        emp0_.COMM as COMM7_4_0_,
        emp0_.DEPTNO as DEPTNO8_4_0_ 
    from
        hibernate_data.emp emp0_ 
    where
        emp0_.EMPNO=?

- 当调用saveOrUpdate()方法后,会执行以下操作
 1).对于瞬时态对象调用save()方法。
 2).对于游离态对象调用update()方法。
 3).对于持久态对象不进行任何操作直接返回,对于持久态对象,属性无改变不会执行update语句。

3.使用merge()方法更新数据
    /**
     * 保存一个数据库已存在的OID对象
     */
    public void useMerge() {
        Session session = HibernateSessionFactory.getSession();
        Transaction transaction = session.beginTransaction();
        //创建一个对象
        Emp emp = new Emp();
        //设置一个数据库已经存在的OID
        emp.setEmpno(43);
        emp.setEname("merge");

        session.merge(emp);

        transaction.commit();
        HibernateSessionFactory.closeSession();
    }

    控制台输出
    Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_4_0_,
        emp0_.ENAME as ENAME2_4_0_,
        emp0_.JOB as JOB3_4_0_,
        emp0_.MGR as MGR4_4_0_,
        emp0_.HIREDATE as HIREDATE5_4_0_,
        emp0_.SAL as SAL6_4_0_,
        emp0_.COMM as COMM7_4_0_,
        emp0_.DEPTNO as DEPTNO8_4_0_ 
    from
        hibernate_data.emp emp0_ 
    where
        emp0_.EMPNO=?
    Hibernate: 
        update
            hibernate_data.emp 
        set
            ENAME=?,
            JOB=?,
            MGR=?,
            HIREDATE=?,
            SAL=?,
            COMM=?,
            DEPTNO=? 
        where
            EMPNO=?

    /**
     * 保存一个数据库不存在的OID对象
     */
    public void useMerge() {
        Session session = HibernateSessionFactory.getSession();
        Transaction transaction = session.beginTransaction();
        //创建一个对象
        Emp emp = new Emp();
        //设置一个数据库不存在的OID
        emp.setEmpno(1);
        emp.setEname("merge");

        session.merge(emp);

        transaction.commit();
        HibernateSessionFactory.closeSession();
    }

    控制台输出
    Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_4_0_,
        emp0_.ENAME as ENAME2_4_0_,
        emp0_.JOB as JOB3_4_0_,
        emp0_.MGR as MGR4_4_0_,
        emp0_.HIREDATE as HIREDATE5_4_0_,
        emp0_.SAL as SAL6_4_0_,
        emp0_.COMM as COMM7_4_0_,
        emp0_.DEPTNO as DEPTNO8_4_0_ 
    from
        hibernate_data.emp emp0_ 
    where
        emp0_.EMPNO=?
    Hibernate: 
        insert 
        into
            hibernate_data.emp
            (ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) 
        values
            (?, ?, ?, ?, ?, ?, ?)
  • 使用Hibernate删除数据(delete()方法)
    /**
     * 删除持久化对象
     */
    public void deleteEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //获取一个持久化对象
        Emp emp = (Emp) session.get(Emp.class, 1);
        //调用delete方法将该对象有持久态转化为临时态
        session.delete(emp);
        //提交事务
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下
    Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_4_0_,
        emp0_.ENAME as ENAME2_4_0_,
        emp0_.JOB as JOB3_4_0_,
        emp0_.MGR as MGR4_4_0_,
        emp0_.HIREDATE as HIREDATE5_4_0_,
        emp0_.SAL as SAL6_4_0_,
        emp0_.COMM as COMM7_4_0_,
        emp0_.DEPTNO as DEPTNO8_4_0_ 
    from
        hibernate_data.emp emp0_ 
    where
        emp0_.EMPNO=?
    Hibernate: 
        delete 
        from
            hibernate_data.emp 
        where
            EMPNO=?

    /**
     * 删除游离态对象
     */
    public void deleteEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        Emp emp = new Emp();
        //设置为游离态对象
        emp.setEmpno(2);
        //调用delete方法将该对象有持久态转化为临时态
        session.delete(emp);
        //提交事务
        transaction.commit();
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台输出如下
    Hibernate: 
    delete 
    from
        hibernate_data.emp 
    where
        EMPNO=?

- 当调用delete()方法后,会执行以下操作
 1).若删除的为持久态对象,会在清理缓存的时候执行delete语句删除。
 2).若删除的为游离态对象,回先将该对象与当前Session关联,在清理缓存时执行delete语句删除。
 3).delete()方法一次只能删除一个对象。
  • 使用Hibernate查询数据(get()和load()区别)
<!--首先在映射文件内开启懒加载(lazy="true" 默认开启)-->
<class name="com.bc.pojo.Emp" table="emp" catalog="hibernate_data" lazy="true">

    /**
     * 使用get()获取对象
     */
    public void getEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //获取对象
        Emp emp = (Emp) session.get(Emp.class, 7);
        //分割线
        System.out.println("----------------------");
        //输出雇员姓名
        System.out.println("雇员姓名:" + emp.getEname());
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台信息
    Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_4_0_,
        emp0_.ENAME as ENAME2_4_0_,
        emp0_.JOB as JOB3_4_0_,
        emp0_.MGR as MGR4_4_0_,
        emp0_.HIREDATE as HIREDATE5_4_0_,
        emp0_.SAL as SAL6_4_0_,
        emp0_.COMM as COMM7_4_0_,
        emp0_.DEPTNO as DEPTNO8_4_0_ 
    from
        hibernate_data.emp emp0_ 
    where
        emp0_.EMPNO=?
    ----------------------
    雇员姓名:save测试名

    /**
     * 使用load()获取对象
     */
    public void loadEmp() {
        //获取Session
        Session session = HibernateSessionFactory.getSession();
        //获取对象
        Emp emp = (Emp) session.load(Emp.class, 7);
        //分割线
        System.out.println("----------------------");
        //输出雇员姓名
        System.out.println("雇员姓名:" + emp.getEname());
        //关闭Session
        HibernateSessionFactory.closeSession();
    }

    控制台信息
    ----------------------
    Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_4_0_,
        emp0_.ENAME as ENAME2_4_0_,
        emp0_.JOB as JOB3_4_0_,
        emp0_.MGR as MGR4_4_0_,
        emp0_.HIREDATE as HIREDATE5_4_0_,
        emp0_.SAL as SAL6_4_0_,
        emp0_.COMM as COMM7_4_0_,
        emp0_.DEPTNO as DEPTNO8_4_0_ 
        from
            hibernate_data.emp emp0_ 
        where
            emp0_.EMPNO=?
    雇员姓名:save测试名

- get()方法和load()方法区别:
 1).懒加载开启情况下,load()只有需要获取其非OID属性时才会去查询,而get()不受懒加载影响。
 2).如果不存在于对象OID对应的记录,load()方法抛出异常,而get()方法返回null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值