学习网址:https://www.linuxidc.com/Linux/2015-08/121498.htm
上一篇:https://blog.csdn.net/Carl_changxin/article/details/82118089
1、回顾
(1)hibernate的依赖包和配置文件hibernate.cfg.xml
(2)ORM思想,用配置文件Blog.hbm.xml表示一个实体类Blog对应一张表t_blog
(3)要在hibernate.cfg.xml中配置实体类的配置文件路径
(4)hibernate可以根据Blog.hbm.xml逆向生成建表语句
2、hibernate又如何实现增删改查(CRUD)
增加:
@Test
public void save(){
//读取并初始化配置文件
Configuration cfg=new Configuration().configure();
//下面三个步骤就是为了获得SessionFactory,从而可以获得session,session中有CRUD方法
StandardServiceRegistryBuilder ssrb=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
ServiceRegistry service= ssrb.build();
SessionFactory factory=cfg.buildSessionFactory(service);
//session中有CRUD方法
Session session= factory.openSession();
//开启事务
Transaction tx=session.beginTransaction();
try {
Blog blog= new Blog();
blog.setTitle("我爱学习,学习爱我");
session.save(blog);
//提交事务
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally {
session.close();
}
}
结果:
删除:替换上面try中的代码即可运行
//下面的两句等于deleteByID
//从数据库中取id=1的一条数据
Blog blog=(Blog)session.load(Blog.class, 1);
session.delete(blog);
//上面的session.load也可以换成:
//Blog blog=(Blog)session.get(Blog.class, 1);
更新:同上,替换上面try中的代码即可运行
Blog blog=(Blog)session.load(Blog.class, 1);
blog.setTitle("Java程序开发");
session.update(blog);
注意:merge()方法常用来代替update()方法、saveOrUpdate()方法。
先说说session缓存对象的生命周期:
(1)瞬时(Transient)状态
(2)持久化(Persistent)状态
(3)脱管(detached)状态
(4)移除(removed)状态
可以看到merge方法对不同状态的对象,反应时不同的,如:
情况(1)
//当merge方法作用于瞬时状态的对象时
Blog blog= new Blog();
blog.setTitle("我爱学习,学习爱我");
session.merge(blog);
情况(2)
//当merge方法作用于持久化状态的对象时
//get()和load()方法:都是根据给定的OID,加载一个持久化对象。
Blog blog = (Blog)session.get(Blog.class,4);
blog.setTitle("11111111");
session.merge(blog);
查询:
OID查询:即前面用到的get和load方法:都是根据给定的OID,加载一个持久化对象。
(1)都是先根据OID从缓存中获取,存在就直接返回
(2)get()方法:执行SQL从数据库获取
(3)load()方法:返回一个代理对象(延迟加载、懒加载)
(4)如果数据库中不存在给定OID对应的记录:get()方法返回null;load()方法跑出ObjectNotFoundException异常