Hibernate数据库操作基本实例

来源:互联网 发布:python if 不等于 编辑:程序博客网 时间:2024/06/10 18:20
package hp.epm.hibernate.model;import java.util.Date;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;public class HibernateTest {    private static Configuration configuration = null;    private static SessionFactory sf=null;    private static ServiceRegistry serviceRegistry=null;    @BeforeClass    public static void beforeClass(){            configuration = new Configuration().configure();            serviceRegistry = new StandardServiceRegistryBuilder()                    .applySettings(configuration.getProperties()).build();            sf = configuration.buildSessionFactory(serviceRegistry);    }    //Student对象最初是临时状态-save方法使其变为持久化状态    @Test    public void testStudent() {        Student s=new Student();        s.setName("zhangsan");        s.setAge(6);        Session session=sf.openSession();        session.beginTransaction();        session.save(s);        session.getTransaction().commit();        session.close();    }    //Teacher对象最初是临时状态-save方法使其变为持久化状态    @Test    public void testTeacherSave() {        Teacher t=new Teacher();        t.setName("TeacherSaveName");        t.setTitle("讲师");        t.setBirthday(new Date());        Session session=sf.openSession();        session.beginTransaction();        session.save(t);        System.out.println(t.getId());        session.getTransaction().commit();        session.close();        System.out.println(t.getId());    }    //Teacher对象临时状态-save使其变为持久化状态-close使其变为托管-delete使其变为临时状态    @Test    public void testTeacherDelete() {        Teacher t=new Teacher();        t.setName("TeacherDeleteName");        t.setTitle("讲师");        t.setBirthday(new Date());        Session session=sf.openSession();        session.beginTransaction();        session.save(t);        session.getTransaction().commit();        session.close();        Session session2=sf.openSession();        session2.beginTransaction();        session2.delete(t);        session2.getTransaction().commit();        session2.close();    }    //Teacher对象临时状态(人为设定OID)-delete使其变为临时状态    //!!注意:给临时对象指定OID是不合规范的操作,应尽量避免!    @Test    public void testTeacherDelete2() {        Teacher t=new Teacher();        t.setId(1);        Session session=sf.openSession();        session.beginTransaction();        session.delete(t);        session.getTransaction().commit();        session.close();    }    //load方法,注意懒加载异常    //执行此测试方法之前先向数据库中添加1条Teacher记录(保证数据库中有id为3的记录)    @Test    public void testLoad() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.load(Teacher.class,3);        //注意load方法返回的类型并不是声明的类型,而是hibernate提供的声明类型的代理类        System.out.println(t.getClass());        //在session中,如果使用对象t获取任何属性值,会发出select请求执行查询操作        System.out.println(t.getName());        session.getTransaction().commit();        session.close();        System.out.println(t.getName());        //在session关闭后,如果之前没有执行过查询操作,则无法使用代理类的对象t获取任何属性值        System.out.println(t.getClass());    }    //get方法会立刻执行,返回正常类型的对象,变为持久化状态,close后变为托管状态    @Test    public void testGet() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.get(Teacher.class,3);        System.out.println(t.getClass());        System.out.println(t.getName());        session.getTransaction().commit();        session.close();        System.out.println(t.getName());        System.out.println(t.getClass());    }    /*Session的update()方法完成以下操作:     (1)把Customer对象重新加入到Session的缓存中,使它变为持久化对象。     (2)计划执行一个update语句。值得注意的是,Session只有在清理缓存的时候才会执行update语句,            并且在执行时才会把Customer对象当前的属性值组装到update语句中。            因此,即使程序中多次修改了Customer对象的属性,在清理缓存时只会执行一次update语句。*/    //get方法会立刻执行,返回正常类型的对象,变为持久化状态,close后变为托管状态,再次调用update后变为持久化状态    @Test    public void testUpdate1() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.get(Teacher.class,3);//立即执行查询操作,返回对象t        session.getTransaction().commit();        session.close();        t.setName("Update1Name");        Session session2=sf.openSession();        session2.beginTransaction();        session2.update(t);//未立即执行更新操作        t.setTitle("Update1Title");//update后再次重新设置属性,观察最后提交时如何执行update        session2.getTransaction().commit();//执行更新操作        session2.close();    }    //临时状态更新,无id信息,无法更新    @Test    public void testUpdate2() {        Teacher t=new Teacher();        t.setName("Update2Name");        Session session=sf.openSession();        session.beginTransaction();        session.update(t);        session.getTransaction().commit();        session.close();    }    //临时状态更新,自定义正确的id信息,可以更新    //!!注意:给临时对象指定OID是不合规范的操作,应尽量避免!    @Test    public void testUpdate3() {        Teacher t=new Teacher();        t.setId(3);        t.setName("Update3Name");        Session session=sf.openSession();        session.beginTransaction();        session.update(t);        session.getTransaction().commit();        session.close();    }    //get方法会立刻执行,返回正常类型的对象,变为持久化状态,此时对象属性若发生修改,事务提交时自动更新持久化信息    @Test    public void testUpdate4() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.get(Teacher.class,3);        t.setName("Update4Name");        session.getTransaction().commit();        session.close();    }    //get方法会立刻执行,返回正常类型的对象,变为持久化状态--session被close后变为托管状态--再次update后被持久化(update会自动将所有属性重置)    @Test    public void testUpdate5() {        Session session=sf.openSession();        session.beginTransaction();        Student s=(Student)session.get(Student.class,1);        s.setName("Update5Name1");        session.getTransaction().commit();        session.close();        s.setName("Update5Name2");        Session session2=sf.openSession();        session2.beginTransaction();        session2.update(s);        session2.getTransaction().commit();        session2.close();    }    //get方法会立刻执行,返回正常类型的对象,变为持久化状态--session被close后变为托管状态--调用merge方法将该对象持久化到数据库(merge仅会修改变化的属性)    @Test    public void testUpdate6() {        Session session=sf.openSession();        session.beginTransaction();        Student s=(Student)session.get(Student.class,1);        s.setName("Update6Name1");        session.getTransaction().commit();        session.close();        s.setName("Update6Name2");        Session session2=sf.openSession();        session2.beginTransaction();        session2.merge(s);        session2.getTransaction().commit();        session2.close();    }    //使用HQL进行更新    @Test    public void testUpdate7() {        Session session=sf.openSession();        session.beginTransaction();        Query q=session.createQuery("update Student s set s.name='Update7Name' where s.id=1");        q.executeUpdate();        session.getTransaction().commit();        session.close();    }    @Test    public void testSaveOrUpdate() {        Teacher t=new Teacher();        t.setName("SaveOrUpdateName1");        t.setTitle("讲师");        t.setBirthday(new Date());        Session session=sf.openSession();        session.beginTransaction();        session.saveOrUpdate(t);        session.getTransaction().commit();        session.close();        t.setName("SaveOrUpdateName2");        Session session2=sf.openSession();        session2.beginTransaction();        session2.saveOrUpdate(t);        session2.getTransaction().commit();        session2.close();    }    //session.clear()清除session中的缓存信息,一次load之后,将数据放入session缓存中,    //第二次使用load时直接使用缓存中的数据,不会再去数据库查找,提高了效率。    @Test    public void testClear() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.load(Teacher.class,3);        System.out.println(t.getName());        //session.clear();        Teacher t2=(Teacher)session.load(Teacher.class,3);        System.out.println(t2.getName());        session.getTransaction().commit();        session.close();    }    //get方法会先从session缓存中去读取数据(如果没有才会去数据库中查找数据)    @Test    public void testGetMethodDataFrom() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.load(Teacher.class,3);        System.out.println(t.getName());        //从控制台中输出的查询语句情况可以验证:get方法是否先从session缓存中去读取数据,而且session中如果有数据,就不会再去数据库中查找。        Teacher t3=(Teacher)session.get(Teacher.class,3);        session.getTransaction().commit();        session.close();    }    //同一个session中不可以存在具有相同OID的同一持久化类的多个对象。    @Test    public void testDoubleSameOIDSameClassObjectInSameSession() {        Session session=sf.openSession();        session.beginTransaction();        Teacher t=(Teacher)session.load(Teacher.class,3);        //调用t的getName方法会加载对象信息到session中        System.out.println(t.getName());        //测试一个session缓存中是否可以存在相同OID的两个Teacher对象        Teacher t4=new Teacher();        //此处设定的id值应该与用load方法查找的对象的id值相同,以方便验证。        //!!注意:严格来说此处给临时对象指定OID是不合规范的操作,实际项目编程中应尽量避免!        t4.setId(3);        //试图将临时对象t4放到session中并持久化        session.update(t4);        session.getTransaction().commit();        session.close();    }    //flush方法强制让session缓存的内容和数据库的内容做同步    //注:flush方法只是在数据库中执行相应的语句,但未提交,所以必须等待commit后才可以在数据库中看到操作后的结果    @Test    public void testFlush() {        Session session=sf.openSession();        //session.setFlushMode(FlushMode.AUTO);        session.beginTransaction();        Teacher t=(Teacher)session.load(Teacher.class,3);        t.setName("FlushName1");        //强制让session缓存的内容和数据库的内容做同步,控制台上会显示执行此步对应的sql语句。        session.flush();        t.setName("FlushName2");        session.getTransaction().commit();        session.close();    }    @AfterClass    public static void afterClass(){        sf.close();    }}
0 0
原创粉丝点击