今天學習了一下如何通過hibernate來實現對數據庫的增刪改查,下面來簡單介紹一下:
首先創建個Student類:
package com.hibernate.model;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Entity @Table(name = "_Teacher") public class Teacher {private int id;private String name;private int age;private String birthPlace;@Id @GeneratedValue @Column(name = "_id") public int getId() {return id;}public void setId(int id) {this.id = id;}@Column(name = "_name") public String getName() {return name;}public void setName(String name) {this.name = name;}@Column(name = "_age") public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Column(name = "_birthPlace") public String getBirthPlace() {return birthPlace;}public void setBirthPlace(String birthPlace) {this.birthPlace = birthPlace;}}然後創建個JUnit Test Case類型的TeacherTest:
先講講session.save()方法,也就是增:
package com.hibernate.model;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;public class TeacherTest {public static SessionFactory sf = null;@BeforeClass public static void beforeClass(){try{sf = new AnnotationConfiguration().configure().buildSessionFactory();//此處最好要獲取一下異常,因為annotation有一個bug有時出現有時不出現}catch(Exception e){e.printStackTrace();}finally{}}@Test public void testSave() {//增Teacher t = new Teacher();t.setAge(23);t.setName("moluo");t.setBirthPlace("huangshan");Session session = sf.getCurrentSession();session.beginTransaction();session.save(t);session.getTransaction().commit();}@AfterClass public static void afterClass(){sf.close();}}亮結果:
再講講session.delete()方法,也就是刪:
@Test public void testDelete() {//刪Teacher t = new Teacher();t.setId(2);Session session = sf.getCurrentSession();session.beginTransaction();session.delete(t);session.getTransaction().commit();}亮結果:
接著再來session.get(),也就是查:
@Test public void testGet() {//get Session session = sf.getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher)session.get(Teacher.class, 1); System.out.println("姓名為:"+t.getName()); session.getTransaction().commit(); }亮結果:
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=? 姓名為:moluo
再來另一種查詢方式:session.load():
@Test public void testLoad() {//load Session session = sf.getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher)session.load(Teacher.class, 1); System.out.println("姓名為:"+t.getName()); session.getTransaction().commit(); }亮結果:
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=? 姓名為:moluo
這裡解釋一下這倆查詢之間的區別:首先當要查詢的對像不存在的時候,返回的信息是不同的。 get方式會返回:java.lang.NullPointerException
load方式會返回:org.hibernate.ObjectNotFoundException:Norowwiththegivenidentifierexists
其次,load返回的是代理對象,等真正用到的時候才會發出SQL語句;另外get是直接從數據庫裡加載數據,不存在延遲。
最後再講講最常用的更新方式,通過HQL語句來更新:
@Test public void testUpdate() {//更新Session session = sf.getCurrentSession(); session.beginTransaction(); String url = "update Teacher t set t.birthPlace = 'anhui' where id = 1"; //注意這裡的Teacher必須是對象名字,而不是表名,t是對象的別名Query q = session.createQuery(url); //這裡導入的包是:import org.hibernate.Query; q.executeUpdate(); session.getTransaction().commit(); }亮結果:
通過更新,把摩羅我的籍貫從黃山更新成安徽了....
其實本身有session.update()這個更新方法的,但只是這個更新方法如果你每次只更新一部分列的話,這種更新方式也會把所有列都更新一遍,效率不是太高,所以就不怎麼提倡使用,當然也有彌補方式,比如如果使用的是xml的話,可以在配置文件中某個不想被更新的列的property標籤裡設置update="false";另外也可以在配置文件的class後面設置動態更新:dynamic-update="true";當然如果使用的是Annotation,可以在不想更新的列上設置@column(update="false");其實這些都不靈活,使用HQL才是最好的,所以這裡就只貼出HQL更新的代碼。
總結
以上就是本文關於hibernate通過session實現增刪改查操作實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以參閱本站:
快速了解Hibernate中的Session
hibernate屬性級別註解實例代碼
Hibernate使用hbm.xml配置映射關係解析
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!