zoukankan      html  css  js  c++  java
  • Hibernate简单增删改查

    Hibernate中的基本增删改查


    文章链接:https://www.cnblogs.com/HelloXHD/p/12892402.html

    一.增:save(Object o)

    public void add(){
        Session session = Utils.getSession();
        Transaction ts = session.beginTransaction();
    
        Customer customer = new Customer();
        customer.setCust_name("李好好");
        session.save(customer);
    
        ts.commit();
        session.close();
    }
    

    二.查: get(Class class, id); load(Class class, id);

    public void demo2(){
        Session session = Utils.getSession();
        Transaction ts = session.beginTransaction();
    
        /**
        * get()与load();
        */
        //get();执行到get时立即发送sql语句查询
        Customer customer = session.get(Customer.class, 7l);
        System.out.println(customer);
    
        //load();执行到load时不会马上发送sql语句请求(lazy请求)
        Customer customer1 = session.load(Customer.class, 4l);//使用到查询对象时发送请求
        System.out.println(customer1);
    
        ts.commit();
        session.close();
    }
    

    load()与get()的区别

    load()和get()都是用来从数据库中加载所需数据来创建一个持久化对象。

    • 如果数据库中不存在该对象,load()会抛出一个ObjectNotFoundException异常,而get()只会返回null;
    • get()方法首先会查询一级缓存,若不存在则接着查询二级缓存,最后查询数据库(创建对象阶段就加载出所有属性);而load()首先查询一级缓存,若不存在则创建代理对象,在对象真正得到使用时才会开始查询二级缓存和数据库,可实现延迟加载(lazy)功能。
    • get()只返回实体类,load()可返回实体类的代理类实例。
    • get()方法直接从数据库中检索,而load()方法执行比较复杂:
      首先从Session和persistent Context中查询是否存在缓存,若存在则直接返回,否则是否是lazy,如果是则直接检索数据库,,否则需要建立代理对象,在访问获得的代理对象时检索数据库。

    三.改:update(Object o)

    public void demo3(){
        Session session = Utils.getSession();
        Transaction ts = session.beginTransaction();
    
        //直接更改法(不合适)
        /*Customer customer = new Customer();
        customer.setCust_id(1l);
        customer.setCust_name("刘少");
        session.update(customer);*/
    
        //先查询后修改(推荐)
        Customer customer = session.get(Customer.class, 1l);
        customer.setCust_level("123");
        customer.setCust_phone("13327362883");
        session.update(customer);
    
        ts.commit();
        session.close();
    }
    

    四.删:delete(Object o)

    public void demo4(){
        Session session = Utils.getSession();
        Transaction ts = session.beginTransaction();
    
        //直接删除法(不合适)
        //先查询后删除
        Customer customer = session.get(Customer.class, 6l);
        session.delete(customer);
    
        ts.commit();
        session.close();
    }
    

    五.查:Query(HQL---Hibernate Query Language)、Criteria

    Query负责各种数据库查询,可以使用Hibernate查询语言(HQL)或者SQL;HQL语言使用类和属性而非表与字段名进行查询;
    或者使用Criteria,使用Session实例的createCriteria()方法创建Criteria对象(但此API在Hibernate5中不再推荐使用)

    public void demo6(){
        Session session = Utils.getSession();
        Transaction ts = session.beginTransaction();
    
        //接收HQL:Hibernate Query Language 面向对象查询语言
        Query query = session.createQuery("from Customer ");
        List<Customer> list = query.list();
        for(Customer customer : list){
            System.out.println(customer);
        }
        //QBC:Query By Criteria
        //此方法在Hibernate5中不再推荐使用
            Criteria criteria = session.createCriteria(Customer.class);
            List<Customer> list3 = criteria.list();
            for (Customer customer : list3){
                System.out.println(customer);
            }
        ts.commit();
        session.close();
    }
    

    六.保存或更新: saveOrUpdate(Object o);

    saveOrUpdate()方法包含了save()和update()的功能。
    Hibernate会根据对象状态进行选择save()或者update():若对象是持久化对象,则不进行任何操作,直接返回;若对象的标识符属性在数据库中不存在,则调用save();否则,调用update()将对象的值更新到数据库。
    ps:如果能够确定对象是否在数据库里就尽量不用saveOrUpdate(),影响效率。

    public void demo5(){
        Session session = Utils.getSession();
        Transaction ts = session.beginTransaction();
    
        Customer customer = new Customer();
        customer.setCust_id(8l);
        customer.setCust_name("李不好");
        session.saveOrUpdate(customer);
    
        ts.commit();
        session.close();
    }
    
  • 相关阅读:
    WinForm高级控件--PictureBox控件(图片控件)
    改变GridView中列的宽度
    RabbitMq笔记()
    参数可传可不传
    C# 视频讲解
    <ItemTemp>里写判断语句
    MyEclipse 2017 CI 10 发布(附下载)
    DevExpress v17.2新版亮点—WPF篇(四)
    DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
    MyEclipse移动开发教程:设置所需配置的iOS应用(三)
  • 原文地址:https://www.cnblogs.com/HelloXHD/p/12989726.html
Copyright © 2011-2022 走看看