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
- Hibernate数据库操作基本实例
- Hibernate 数据库操作 DAO 实例
- Hibernate 登陆实例的基本操作
- springBoot+Jpa(hibernate)数据库基本操作
- "Hibernate"对数据库操作的实例代码
- Hibernate的基本操作数据库,增加,修改,删除,查询
- Hibernate 框架基本的数据库增删改查操作
- Hibernate底层数据库操作函数BaseDao+具体实例
- 关于C# Ado.NET连接数据库操作基本实例模板
- 记录Hibernate基本操作
- hibernate基本操作流程
- Hibernate基本操作
- Hibernate操作视图实例
- hibernate 数据库查询 实例
- Spring+HIbernate 数据库实例
- MongoDB基本操作实例
- 简单Hibernate数据库操作
- hibernate 之 操作数据库
- crosstool-ng在编译过程中遇到的问题
- Nsstring NSNumber NSArray
- 简单理解JMS
- Cocoapods 添加第三方,导入不了头文件或者 not found file
- 最长上升子序列nlogn 模板
- Hibernate数据库操作基本实例
- cleancache
- sql语句实现按某字段分组并按另一字段排名(oracle)
- 适时选择 getDeclared X X X 和 get x X X
- 文章标题
- 词法分析优化
- Glide图片加载变形如何解决?
- error LNK2001: 无法解析的外部符号
- 关于JS中Apply和Call的一些理解