1. 程式人生 > >J2EE系列之Hibernate4學習筆記(二)--Hibernate4增刪改查體驗

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中新增資料的程式碼,現在把這個程式碼進行一下修改,修改如下:

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();
	    
	}
}
這裡把新增操作寫成了函式add,執行程式,可以實現向表t_student中新增資料。

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方法上右鍵


執行結果與前面的相同。