J2EE系列之Hibernate4學習筆記(二)--Hibernate4增刪改查體驗
上一篇部落格中使用hibernate4成功建立了表t_student,並向這個表中添加了一個數據。現在來體驗hibernate4實現資料庫表的增刪改查操作。
一、HibernateUtil封裝
使用hibernate對資料庫操作的時候都要首先獲得一個SessionFactory,這裡把獲得SessionFactory的程式碼進行封裝。新建一個包com.test.util,在裡面新建一個HibernateUtil類:
package com.test.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory(){ Configuration configuration=new Configuration().configure(); // 例項化配置檔案 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); // 例項化服務登記 return configuration.buildSessionFactory(serviceRegistry); // 獲取Session工廠 } public static SessionFactory getSessionFactory() { // TODO Auto-generated method stub return sessionFactory; } }
呼叫HibernateUtil.getSessionFactory既可以獲得SessionFactory物件了。
二、XML版增刪改查實現
1.上一篇部落格中實現了往表t_student中新增資料的程式碼,現在把這個程式碼進行一下修改,修改如下:
這裡把新增操作寫成了函式add,執行程式,可以實現向表t_student中新增資料。package com.test.service; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.test.model.Student; import com.test.util.HibernateUtil; public class StudentTest { private SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 獲取Session工廠 private void add(){ Session session=sessionFactory.openSession(); // 生成一個session session.beginTransaction(); // 開啟事務 Student s=new Student(); s.setName("張三"); session.save(s); session.getTransaction().commit(); // 提交事務 session.close(); // 關閉session } public static void main(String[] args) { StudentTest studentTest = new StudentTest(); studentTest.add(); } }
2.刪除功能程式碼如下:
private void delete(){ Session session=sessionFactory.openSession(); // 生成一個session session.beginTransaction(); // 開啟事務 Student student = (Student)session.get(Student.class, Long.valueOf(1)); session.delete(student); session.getTransaction().commit(); // 提交事務 session.close(); // 關閉session }
首先通過session.get函式獲取到Student這個類生成的表中主鍵為1的物件,然後呼叫session.delete方法刪除該物件。
3.修改功能程式碼如下:
private void update(){
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Student student = (Student)session.get(Student.class, Long.valueOf(2));
student.setName("張三2");
session.save(student);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
首先獲取id=2的物件,把這個物件的name屬性修改成“張三2”,然後呼叫session.save方法儲存。
4.查詢表中所有元素:
private void getAllStudents(){
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
String hql = "from Student";
Query query = session.createQuery(hql);
List<Student> studentList = query.list();
for(Student student:studentList){
System.out.println(student);
}
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
查詢所有語句與之前有所不同,這裡使用的是hql,是一種面向物件的sql語句。
三、註解版增刪改查實現
上面實現Student類對映成資料庫中表的流程是:首先定義Student類之後,然後寫Student類的對映檔案Student.hbm.xml(檔案中標記了主鍵以及主鍵的生成方式),最後在hibernate的配置檔案中新增對映檔案。
1.使用註解方式的話則要簡潔很多,hibernate官方推薦使用註解方式。下面寫一個Teacher類,並把這個類對應到資料庫中的t_teacher表:
package com.test.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity //代表這個類是一個對映實體,也就是要在資料庫中建表
@Table(name="t_teacher")
public class Teacher {
private long id;
private String name;
@Id //在主鍵的get函式上面填寫@Id註解,代表這個屬性是主鍵
@GeneratedValue(generator="_native")
@GenericGenerator(name="_native",strategy="native")//主鍵的生成策略
@Column(name="teaId")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
說明:@Entity註解放在類名的上面,表示這個類是一個對映實體類,會把這個類對映成資料庫中的一個表;
@Table(name="t_teacher")表示將這個類對映成的表名為t_teacher;
@Id 標註主鍵所用,放在主鍵get函式的上
@Column(name="teaId")表示把id這個屬性對映成表中的列名為teaId。如果沒有這個標註的話,則列名與屬性名相同
@GenericGenerator —— 註解聲明瞭一個hibernate的主鍵生成策略。其中name 指定生成器名稱,strategy 指定具體生成器的類名(指定生成策略),native 對於orcale採用Sequence方式,對於MySQL和SQL Server採用identity(處境主鍵生成機制),native就是將主鍵的生成工作將由資料庫完成,hibernate不管(很常用)
@GeneratedValue —— 註解聲明瞭主鍵的生成策略,其中generator 屬性指定生成主鍵使用的生成器(可能是orcale中的序列)
2.在配置檔案最後填寫關於這個類的對映:
<mapping class="com.test.model.Teacher"/>
3.新建一個TeacherTest類,實現對t_teacher表的增刪改查:
package com.test.service;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.test.model.Teacher;
import com.test.util.HibernateUtil;
public class TeacherTest {
private SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 獲取Session工廠
private void add(){
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Teacher s=new Teacher();
s.setName("張三");
session.save(s);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
private void delete(){
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Teacher teacher = (Teacher)session.get(Teacher.class, Long.valueOf(1));
session.delete(teacher);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
private void update(){
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Teacher teacher = (Teacher)session.get(Teacher.class, Long.valueOf(2));
teacher.setName("張三2");
session.save(teacher);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
private void getAllTeachers(){
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
String hql = "from Teacher";
Query query = session.createQuery(hql);
List<Teacher> teacherList = query.list();
for(Teacher teacher:teacherList){
System.out.println(teacher);
}
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
public static void main(String[] args) {
TeacherTest teacherTest = new TeacherTest();
teacherTest.add();
//teacherTest.delete();
//teacherTest.update();
//teacherTest.getAllTeachers();
}
}
這裡的增刪改查方式與Student類相同。
四、Junit4單元測試框架引入
上面對於Student和Teacher類的增刪改查測試都要在main函式中實現。為了方便測試,引入Junit4單元測試,可以直接執行方法:
1、對於低版本的eclipse,需要引入Junit4 jar包:工程根目錄下新建一個junit4目錄,把Junit4的jar包複製進去,並把jar包Add to Build Path;
2.對於mars這個高一些的版本,裡面內建了Junit4:使用如下步驟新增Junit:
1.bulid path——configuration build path——Libraries
2.Add Libraty——Junit
3、要想使用Junit4的話,方法必須得是public的。把TeacherTest類中的所有方法都改成public的,然後右擊TeacherTest類名,新建一個Junit Test Case:
點選Next,選擇要使用Junit測試的方法:
點選Finish完成。
3.把要測試的方法補充完整:
package com.test.service;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import com.test.model.Teacher;
import com.test.util.HibernateUtil;
public class TeacherTestTest {
private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
@Test
public void testAdd() {
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Teacher s=new Teacher();
s.setName("張三");
session.save(s);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
@Test
public void testDelete() {
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Teacher Teacher=(Teacher)session.get(Teacher.class, Long.valueOf(2));
session.delete(Teacher);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
@Test
public void testUpdate() {
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
Teacher Teacher=(Teacher)session.get(Teacher.class, Long.valueOf(3));
Teacher.setName("張三2");
session.save(Teacher);
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
@Test
public void testGetAllTeacher() {
Session session=sessionFactory.openSession(); // 生成一個session
session.beginTransaction(); // 開啟事務
String hql="from Teacher";
Query query=session.createQuery(hql);
List<Teacher> TeacherList=query.list();
for(Teacher Teacher:TeacherList){
System.out.println(Teacher);
}
session.getTransaction().commit(); // 提交事務
session.close(); // 關閉session
}
}
對裡面的方法進行測試的時候,只需對方法測試即可:比如測試add方法:在testAdd方法上右鍵
執行結果與前面的相同。