1. 程式人生 > >Hibernate自學心得

Hibernate自學心得

快大四了,根據自學所學的框架(Sping、Mybatis、Struts2),想出去找找實習工作,所以去看看招聘資訊,發現許多的招聘資訊裡邊要求的框架大多都是Hibernate,所以我索性也學學Hibernate這一個框架,以下為個人心得:

查了些資料,發現,Hibernate在資料量上比不上Mybatis好,資料量在很大的情況下,Hibernate可能出現奔潰、不過在許多方面Hibernate還是很好用的,可以減少了寫sql語句的麻煩,複雜的sql語句只需要簡簡單單的幾行程式碼就可以搞定了。當然Hibernate還還是用了Hql語言,也挺好用的:eg:from 實體類名稱 [條件...];

首先,Hibernate大多使用的是ORM模式(Object  Relation Mapping || 物件關係對映)。

不多說,開始編寫:

使用Hibernate需要到官網去下載包(當然我的程式碼裡邊也有):http://hibernate.org/orm/

下載好了之後就可以安安心心的編寫了:

第一步:新建Hibernate的配置檔案,有兩種形式

第一種是properties檔案的配置


配置好了就要實現:

/**
	 * 使用了properties配置檔案和對映類
	 */
	@Test
	public void test(){
		//通過物件插值
		Student student = new Student();
		student.setId(5);
		student.setName("myks");
		student.setAge(23);
		
		Configuration cfg = new Configuration();
		cfg.addClass(com.myk.hibernate.Student.class);
		SessionFactory sf = cfg.buildSessionFactory();
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();		
		try {
			//新增
			session.save(student);
			t.commit();//事務提交
		} catch (HibernateException e) {
			t.rollback();//事務回滾
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}

這個地方只是簡單的實現,如果還想要配置一些別的功能或者資原始檔,需要使用自動動手使用java去編寫,新增的方法很簡單的,可以自己百度查,不過因為這樣做很麻煩,且不方便,所以一幫使用xml檔案的配置。

第二種是xml檔案的配置

xml檔案配置也有兩種情況:

第一種情況是使用檔名hibernate.cfg.xml

另外一種是使用別的名字

--看配置(只是部分配置):

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
<hibernate-configuration>
    <session-factory>
     
    <!-- 資料庫連線配置 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
    <property name="connection.username">root</property>
    <property name="connection.password">maiyikai</property>
	<!-- 資料庫方言 -->         
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     <!-- 是否後臺顯示sql語句 -->   
    <property name="show_sql">true</property>
	<!-- 匯入對映資原始檔 -->    
    <mapping resource="com/myk/hibernate/Student.hbm.xml"/>
         
    </session-factory>
</hibernate-configuration>
再看看對映檔案(對映檔案的檔名一般是以*.hbm.xml命名的):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.myk.hibernate">
<!-- class設定關係對映表   name:對映路徑   table="表名" -->
    <class name="Student" table="student">
    <!-- id定義的是主鍵列 name:表中的欄位 -->
        <id name="id" column="id">
        	<!-- generator設定主鍵模式   class="主鍵的模式" -->
        	<generator class="assigned"></generator>
        </id>
        <!-- 定義其他欄位 -->
        <property name="name"></property>
        <property name="age"></property>
    </class>
</hibernate-mapping>

在這裡涉及到了主鍵的一種對映關係(來自: http://lqzit.iteye.com/blog/845163):

1:assigned:表示在新增資料時由應用程式指定主鍵的值。主要針對主鍵是採用自然主鍵的形式。這種方式,適用於主鍵列不是自動增長列。其缺點為在執行新增操作時,需查詢資料庫判斷生成的主鍵是否已經存在。
2:increment:表示新增資料操作時由hibernate自動生成主鍵值。其生成的值為:先查詢該主鍵列的最大值,然後在最大值的基礎上加上1.適用於採用代理主鍵形式的主鍵列。同樣不能用於主鍵列是自動增長的表。但是,該主鍵生成策略也有些缺點。
(1)新增資料前先查詢一遍,影響了效能。
(2)主鍵的型別只能為數值型的int或者long
(3)併發操作時的衝突問題。
3:identity:不如說是為sqlerver資料庫量身定做的。主要適用於sqlserver資料庫的自動增長列的表。
4:native:表示根據不同的資料庫採用不同的主鍵生成策略。比如,當前資料庫為sqlserver,則會採用identity,如為oracle,則採用oracle中的sequence等。區分資料庫的不同是以hibernate主配置檔案中sessionFactory中配置的資料庫方言。
5.uuid: 唯一主鍵生成辦法。從Hibernate中提取出來。
優點:避免了生成ID 時,與資料庫的再次交道,效能上較高。但對於有的開發人員不太習慣這種id生成方式,UUID生成的32為的字串,不同於identity 從1開始的整數。
 

Xml程式碼
1.<id name="實體類屬性名" type="java.lang.Integer">  
2.      <column name="對應表中主鍵欄位名" />  
3.      <generator class="assiged|increment|identity|native|........" />  
4.</id>  
<id name="實體類屬性名" type="java.lang.Integer">
      <column name="對應表中主鍵欄位名" />
      <generator class="assiged|increment|identity|native|........" />
</id>

採用hibernate的主鍵生成策略,就可以比較靈活和方便的對錶中的主鍵欄位進行操作了。而且,不同的資料庫,不同的主鍵形式,也只需要修改下對映檔案就可以了

配置檔案和對映檔案都寫好了之後(部分實現程式碼):

/**
	 * 使用*.cfg.xml配置檔案和對映檔案
	 */
	@Test
	public void delete(){
		Configuration configuration = new Configuration().configure();//載入配置檔案
		SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
		Session session = sessionFactory.openSession();//開啟session
		Transaction transaction = session.beginTransaction();//開啟事務管理
		Student student = (Student) session.load(Student.class, 3);//載入類,按照id查詢之後載入
		try {
			session.delete(student);
			transaction.commit();//事務提交
		} catch (HibernateException e) {
			transaction.rollback();//事務回滾
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
		
	}

/**
	 * 分頁查詢
	 */
	@Test
	public void pageSelect(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		int pageNo = 2;
		int pageNum = 2;
		try {
			//查詢全部資料
			Criteria criteria = session.createCriteria(Student.class);
			criteria.setFirstResult((pageNo-1)*pageNum);//設定起始地記錄位置
			criteria.setMaxResults(pageNo*pageNum);//設定終止的記錄位置
			List<Student> list = criteria.list();
			System.out.println(list);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}

/**
	 * 刪除
	 * 使用*.cfg.xml配置檔案和對映檔案
	 */
	@Test
	public void delete(){
		Configuration configuration = new Configuration().configure();//載入配置檔案
		SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
		Session session = sessionFactory.openSession();//開啟session
		Transaction transaction = session.beginTransaction();//開啟事務管理
		Student student = (Student) session.load(Student.class, 3);//載入類,按照id查詢之後載入
		try {
			session.delete(student);
			transaction.commit();//事務提交
		} catch (HibernateException e) {
			transaction.rollback();//事務回滾
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
		
	}
/**
	 * 條件查詢
	 */
	@Test
	public void select(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Student student = (Student) session.load(Student.class, 1);
		try {
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
		
	}
	/**
	 * 查詢
	 */
	@Test
	public void selectAll(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		try {
			//查詢全部資料
			Criteria criteria = session.createCriteria(Student.class);
			criteria.addOrder(Order.asc("age"));//結果集排序
			List<Student> list = criteria.list();
			System.out.println(list);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
/**
	 * 條件查詢
	 */
	@Test
	public void selectWhere(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		try {
			//查詢全部資料
			Criteria criteria = session.createCriteria(Student.class);
//			criteria.add(Restrictions.eq("age", 22));//條件查詢
//			criteria.add(Restrictions.eq("name", "qw"));//條件查詢
			//多條件查詢
			criteria.add(Restrictions.and(Restrictions.eq("name", "myk"), Restrictions.ge("age", 21)));
			List<Student> list = criteria.list();
			System.out.println(list);
		
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 列查詢
	 */
	@Test
	public void selectCol(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Criteria criteria = session.createCriteria(Student.class);
//		criteria.setProjection(Projections.property("age"));//設定查詢列
		criteria.setProjection(Projections.projectionList().add(Projections.property("id")).add(Projections.property("name")));//設定多個查詢了列
		List<Student> list = criteria.list();
		Iterator it = list.iterator();//迭代
		while(it.hasNext()){
			Object[] obj = (Object[]) it.next();
			System.out.println("id: "+obj[0]+" name: "+obj[1]);
		}
	}

@Test
	public void colSelect(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Criteria criteria = session.createCriteria(Student.class);
//		criteria.setProjection(Projections.sum("age"));//計算總和
//		int ages = (int) criteria.uniqueResult();//取值
//		System.out.println(ages);
//		criteria.setProjection(Projections.distinct(Projections.property("age")));//去重
//		Iterator it = criteria.list().iterator();
//		while(it.hasNext()){
//			System.out.println(it.next());
//		}
		//分組
//		criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("age")).add(Projections.rowCount(),"age"));
//		Iterator it = criteria.list().iterator();
//		while(it.hasNext()){
//			Object[] obj = (Object[]) it.next();
//			System.out.println("age: "+obj[0]+" count: "+obj[1]);
//		}
	}
@Test
	public void sessionSelect(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction teTransaction = session.beginTransaction();
		
		String sql = "select * from student";
		List<Student> list = new ArrayList<Student>();
		
		try {
			Query query = session.createSQLQuery(sql);
			Iterator iterator = query.list().iterator();
			while(iterator.hasNext()){
				Student student = new Student();
				Object[] object = (Object[]) iterator.next();
				student.setId(Integer.parseInt(object[0].toString()));
				student.setName(object[1].toString());
				student.setAge(Integer.parseInt(object[2].toString()));
				list.add(student);
			}
			
			System.out.println(list);
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

@Test
	public void sessionQuery(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction teTransaction = session.beginTransaction();
		
		String hql = "from Student";
		List list = new ArrayList();
		
		Query query = session.createQuery(hql);
		list = query.list();
		System.out.println(list);
		
		Student s = new Student();
		
		if(session.contains(s)){
			System.out.println("s在快取中");
		}else{
			System.out.println("s不再快取中");
		}
	}
	/**
	 * 快取機制
	 */
	@Test
	public void sessionContains(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		Student s = new Student();//建立持久化物件
		s = (Student) session.get("com.myk.hibernate.Student", 1);//條件獲取
		System.out.println("快取"+session.contains(s));
		session.clear();//清空快取
		System.out.println("快取"+session.contains(s));
	}
	
	/**
	 * 刪除
	 */
	@Test
	public void sessiondelete(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		//建立一個持久化物件
//		Student s = (Student) session.createQuery("from Student where age = '22'").setMaxResults(1).uniqueResult();
//		session.delete(s);//單一刪除
//		tx.commit();
		//批量刪除
		List list = session.createQuery("from Student where name = 'myk'").list();
		Iterator iterator = list.iterator();
		while(iterator.hasNext()){
			Student s = (Student) iterator.next();
			session.delete(s);
		}
		tx.commit();
	}









等等等等都在檔案裡。