hibernate之通过session来实现增删改查操作

今天学习了一下如何通过hibernate来实现对数据库的增删改查,下面来简单介绍一下:

         首先创建个Student类:      

[java]  view plain  copy
  1. package com.hibernate.model;  
  2. import javax.persistence.Column;  
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.Id;  
  6. import javax.persistence.Table;  
  7. @Entity  
  8. @Table(name = "_Teacher")  
  9. public class Teacher {  
  10. private int id;  
  11. private String name;  
  12. private int age;  
  13. private String birthPlace;  
  14. @Id  
  15. @GeneratedValue  
  16. @Column(name = "_id")  
  17. public int getId() {  
  18.     return id;  
  19. }  
  20. public void setId(int id) {  
  21.     this.id = id;  
  22. }  
  23. @Column(name = "_name")  
  24. public String getName() {  
  25.     return name;  
  26. }  
  27. public void setName(String name) {  
  28.     this.name = name;  
  29. }  
  30. @Column(name = "_age")  
  31. public int getAge() {  
  32.     return age;  
  33. }  
  34. public void setAge(int age) {  
  35.     this.age = age;  
  36. }  
  37. @Column(name = "_birthPlace")  
  38. public String getBirthPlace() {  
  39.     return birthPlace;  
  40. }  
  41. public void setBirthPlace(String birthPlace) {  
  42.     this.birthPlace = birthPlace;  
  43. }  
  44.   
  45. }  
然后创建个JUnit Test Case类型的TeacherTest:

先讲讲session.save()方法,也就是增:

[java]  view plain  copy
  1. package com.hibernate.model;  
  2.   
  3. import org.hibernate.Query;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.SessionFactory;  
  6. import org.hibernate.cfg.AnnotationConfiguration;  
  7. import org.junit.AfterClass;  
  8. import org.junit.BeforeClass;  
  9. import org.junit.Test;  
  10.   
  11. public class TeacherTest {  
  12.     public static SessionFactory sf = null;  
  13.     @BeforeClass  
  14.     public static void beforeClass(){  
  15.         try{  
  16.             sf = new AnnotationConfiguration().configure().buildSessionFactory();  
  17.             //此处最好要获取一下异常,因为annotation有一个bug有时出现有时不出现  
  18.         }  
  19.         catch(Exception e){  
  20.             e.printStackTrace();  
  21.         }  
  22.         finally{  
  23.               
  24.         }  
  25.     }  
  26.   
  27.     @Test  
  28.     public void testSave() {//增  
  29.         Teacher t = new Teacher();  
  30.         t.setAge(23);  
  31.         t.setName("moluo");  
  32.         t.setBirthPlace("huangshan");  
  33.           
  34.         Session session = sf.getCurrentSession();  
  35.         session.beginTransaction();  
  36.         session.save(t);  
  37.         session.getTransaction().commit();  
  38.     }  
  39. @AfterClass  
  40.     public static void afterClass(){  
  41.         sf.close();  
  42.     }  
  43. }  
亮结果: 吐舌头

再讲讲session.delete()方法,也就是删:

[java]  view plain  copy
  1. @Test  
  2.     public void testDelete() {//删  
  3.         Teacher t = new Teacher();  
  4.         t.setId(2);  
  5.           
  6.         Session session = sf.getCurrentSession();  
  7.         session.beginTransaction();  
  8.         session.delete(t);  
  9.         session.getTransaction().commit();  
  10.     }  
亮结果: 吐舌头

接着再来session.get(),也就是查:

[java]  view plain  copy
  1. @Test  
  2.     public void testGet() {//get          
  3.         Session session = sf.getCurrentSession();  
  4.         session.beginTransaction();  
  5.         Teacher t = (Teacher)session.get(Teacher.class1);  
  6.         System.out.println("姓名为:"+t.getName());  
  7.         session.getTransaction().commit();  
  8.     }  
亮结果: 吐舌头

[java]  view plain  copy
  1. Hibernate: select teacher0_._id as column1_1_0_, teacher0_._age as column2_1_0_, teacher0_._birthPlace as column3_1_0_, teacher0_._name as column4_1_0_ from _Teacher teacher0_ where teacher0_._id=?  
  2. 姓名为:moluo  

再来另一种查询方式:session.load():

[java]  view plain  copy
  1. @Test  
  2.     public void testLoad() {//load    
  3.         Session session = sf.getCurrentSession();  
  4.         session.beginTransaction();  
  5.         Teacher t = (Teacher)session.load(Teacher.class1);  
  6.         System.out.println("姓名为:"+t.getName());  
  7.         session.getTransaction().commit();  
  8.     }  
亮结果: 吐舌头

[java]  view plain  copy
  1. Hibernate: select teacher0_._id as column1_1_0_, teacher0_._age as column2_1_0_, teacher0_._birthPlace as column3_1_0_, teacher0_._name as column4_1_0_ from _Teacher teacher0_ where teacher0_._id=?  
  2. 姓名为:moluo  
        这里解释一下这俩查询之间的区别:首先当要查询的对象不存在的时候,返回的信息是不同的。get方式会返回:java.lang.NullPointerException
load方式会返回:org.hibernate.ObjectNotFoundException: No row with the given identifier exists

其次,load返回的是代理对象,等真正用到的时候才会发出SQL语句;另外get是直接从数据库里加载数据,不存在延迟。

最后再讲讲最常用的更新方式,通过HQL语句来更新:

[java]  view plain  copy
  1. @Test  
  2.     public void testUpdate() {//更新    
  3.         Session session = sf.getCurrentSession();  
  4.         session.beginTransaction();  
  5.         String url = "update Teacher t set t.birthPlace = 'anhui' where id = 1";  
  6.         //注意这里的Teacher必须是对象名字,而不是表名,t是对象的别名  
  7.         Query q = session.createQuery(url);  
  8.         //这里导入的包是:import org.hibernate.Query;  
  9.         q.executeUpdate();  
  10.         session.getTransaction().commit();  
  11.     }  
亮结果: 吐舌头

通过更新,把摩罗我的籍贯从黄山更新成安徽了....

        其实本身有session.update()这个更新方法的,但只是这个更新方法如果你每次只更新一部分列的话,这种更新方式也会把所有列都更新一遍,效率不是太高,所以就不怎么提倡使用,当然也有弥补方式,比如如果使用的是xml的话,可以在配置文件中某个不想被更新的列的property标签里设置update = "false";另外也可以在配置文件的class后面设置动态更新:dynamic-update = "true";当然如果使用的是Annotation,可以在不想更新的列上设置@column(update = "false");其实这些都不灵活,使用HQL才是最好的,所以这里就只贴出HQL更新的代码。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值