LetonLIU 2020-05-29
文章链接:https://www.cnblogs.com/HelloXHD/p/12892402.html
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(); }
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()会抛出一个ObjectNotFoundException异常,而get()只会返回null;
- get()方法首先会查询一级缓存,若不存在则接着查询二级缓存,最后查询数据库(创建对象阶段就加载出所有属性);而load()首先查询一级缓存,若不存在则创建代理对象,在对象真正得到使用时才会开始查询二级缓存和数据库,可实现延迟加载(lazy)功能。
- get()只返回实体类,load()可返回实体类的代理类实例。
- get()方法直接从数据库中检索,而load()方法执行比较复杂:
首先从Session和persistent Context中查询是否存在缓存,若存在则直接返回,否则是否是lazy,如果是则直接检索数据库,,否则需要建立代理对象,在访问获得的代理对象时检索数据库。
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(); }
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负责各种数据库查询,可以使用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()方法包含了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(); }