Hibernate简单增删改查

LetonLIU 2020-05-29

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();
}

相关推荐