Hibernate的初步学习(2)

学习网址: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异常

 

更复杂的操作:待续

猜你喜欢

转载自blog.csdn.net/Carl_changxin/article/details/82118274