學習日記(二)Hibernate用法:針對數據庫表數據的增加,查詢,更新,刪除

一、首先要搞定配置文檔:

1、hibernate.cfg.xml;2.struts.xml;3.web.xml;4.XXX.hbm.xml


最主要的是配置hibernate.cfg.xml,位置必須與src同一路徑,並且是src下的第一子菜單中,也就是打開src就能看到他,和src下的包名並列,這個要很注意,一般人都會在這裏出錯!

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="dialect">
        	org.hibernate.dialect.MySQLDialect</property>		<!-- 數據庫方言 -->
    <property name="connection.url">
        	jdbc:mysql://192.168.4.139:3306/test</property><!-- 數據庫連接URL -->
    <property name="connection.username">leo</property>	<!-- 數據庫用戶名 -->
    <property name="connection.password">cicdata</property>	<!-- 數據庫用戶密碼 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>	<!-- 數據庫驅動類 -->
	<property name="show_sql">true</property>
	<mapping resource="com/sterning/books/model/books.hbm.xml"></mapping>
	
	
</session-factory>
</hibernate-configuration>




二、增添數據:

首先你要創建要創建表的屬性值,並配置其.hbm.xml文檔。

Books.java

package com.sterning.books.model;

public class Books {
	// Fields
	private int bookId;// 編號
	private String bookName;// 書名

	public int getBookId() {
		return bookId;
	}

	public void setBookId(int bookId) {
		this.bookId = bookId;
	}

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}

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

<hibernate-mapping>
	 <class name="com.sterning.books.model.Books" table="LEARN_FRAME" >
		 <id name="bookId" type="java.lang.Integer">
            <column name="ID" length="5" />
            <generator class="assigned" />
        </id>
		<property name="bookName" type="java.lang.String">
            <column name="NAME" length="100" />
        </property>
     </class>
</hibernate-mapping>

三、更新和刪除數據

如果您是在同一個Session中取出數據並想要馬上進行更新,則只要先查詢並取出對象,透過setXXX()方法設定好新的值,然後呼叫session.flush()即可在同一個Session中更新指定的數據,例如:

package com.sterning.bean.hibernate;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.sterning.books.model.Books;

public class TestUpdate {

	private static Object updated;

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		SessionFactory sFactory=new Configuration().configure().buildSessionFactory();
		org.hibernate.classic.Session session=sFactory.openSession();
		
		
		java.util.List books=session.find("from Books");
		for (java.util.ListIterator iterator = books.listIterator(); iterator.hasNext(); ) {
			Books book = (Books) iterator.next();
			if(updated == null)
			updated = book;  
			System.out.println(
			"\n\tID: " + book.getBookId()+
			"\n\tNAME: " + book.getBookName());
			}
		
		((Books) updated).setBookName("Jesse");
		session.flush();
		books = session.find("from Books");   
		session.close(); 
		sFactory.close();
		for (java.util.ListIterator iterator = books.listIterator(); iterator.hasNext(); ) {
		Books book = (Books) iterator.next();            
		System.out.println(book.getBookName() +
				"\n\tID: " + book.getBookId()+
				"\n\tNAME: " + book.getBookName());
		} 
		
	}

}

這個程序會顯示數據表中的所有數據,並將數據表中的第一筆數據更新,一個執行的結果如下:

Hibernate: select books0_.ID as ID0_, books0_.NAME as NAME0_ from LEARN_FRAME books0_

	ID: 2
	NAME: 哈哈

	ID: 4
	NAME: 哈哈

	ID: 5
	NAME: 254534

	ID: 6
	NAME: 2534
Hibernate: update LEARN_FRAME set NAME=? where ID=?
Hibernate: select books0_.ID as ID0_, books0_.NAME as NAME0_ from LEARN_FRAME books0_
INFO - closing
INFO - cleaning up connection pool: jdbc:mysql://192.168.4.139:3306/test
Jesse
	ID: 2
	NAME: Jesse
哈哈
	ID: 4
	NAME: 哈哈
254534
	ID: 5
	NAME: 254534
2534
	ID: 6
	NAME: 2534

如果您開啓了一個Session,從數據表中取出數據顯示到使用者接口上,之後關閉Session,當使用者在接口上操作完畢並按下儲存時,這時您要重新開啓一個Session,使用update()方法將對象中的數據更新至對應的數據表中,一個例子如下:

HibernateTest.java

import onlyfun.caterpillar.*; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*; public class HibernateTest { public static void main(String[] args) throws HibernateException { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession();     List users = session.find("from User"); // 關閉這個Session session.close(); User updated = null; for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) { User user = (User) iterator.next(); if(updated == null) updated = user; System.out.println(user.getName() + "\n\tAge: " + user.getAge() + "\n\tSex: " + user.getSex()); } // 使用者作一些操作,之後儲存 updated.setName("caterpillar"); // 開啓一個新的Session session = sessionFactory.openSession();   // 更新數據 session.update(updated); users = session.find("from User");      session.close(); sessionFactory.close(); for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) { User user = (User) iterator.next();            System.out.println(user.getName() + "\n\tAge: " + user.getAge() + "\n\tSex: " + user.getSex()); }       } }

這個程序執行的結果範例如下,您可以看看實際上執行了哪些SQL:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

ser0_.age as age from USER user0_ justin Age: 28 Sex: M momor Age: 25 Sex: F Bush Age: 25 Sex: M Becky Age: 35 Sex: F Hibernate: update USER set name=?, sex=?, age=? where user_id=? Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex,

ser0_.age as age from USER user0_ caterpillar Age: 28 Sex: M momor Age: 25 Sex: F Bush Age: 25 Sex: M Becky Age: 35 Sex: F

Hibernate提供了一個saveOrUpdate()方法,爲數據的儲存或更新提供了一個統一的操作接口,藉由定義映像文件時,設定標籤的unsaved-value來決定什麼是新的值必需,什麼是已有的值必須更新:

User.hbm.xml

unsaved-value

可以設定的值包括:

◆any - 總是儲存
◆none - 總是更新
◆null - id爲null時儲存(預設)
◆valid - id爲null或是指定值時儲存
 
這樣設定之後,您可以使用session.saveOrUpdate(updated);來取代上一個程序的session.update(updated);方法。
 
如果要刪除數據,只要使用delete()方法即可,直接看個例子。

package com.sterning.bean.hibernate;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.sterning.books.model.Books;

public class TestDel {

	private static Object updated;

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		SessionFactory sFactory=new Configuration().configure().buildSessionFactory();
		org.hibernate.classic.Session session=sFactory.openSession();
		
		
		java.util.List books=session.find("from Books");
		for (java.util.ListIterator iterator = books.listIterator(); iterator.hasNext(); ) {
			Books book = (Books) iterator.next();
			if(updated == null)
			updated = book;  
			System.out.println(
			"\n\tID: " + book.getBookId()+
			"\n\tNAME: " + book.getBookName());
			}
		
		session.delete(updated);
		books = session.find("from Books");   
		session.close(); 
		sFactory.close();
		for (java.util.ListIterator iterator = books.listIterator(); iterator.hasNext(); ) {
		Books book = (Books) iterator.next();            
		System.out.println(book.getBookName() +
				"\n\tID: " + book.getBookId()+
				"\n\tNAME: " + book.getBookName());
		} 
		
	}

}


一個執行的結果範例如下:

Hibernate: select books0_.ID as ID0_, books0_.NAME as NAME0_ from LEARN_FRAME books0_

	ID: 2
	NAME: Jesse

	ID: 4
	NAME: 哈哈

	ID: 5
	NAME: 254534

	ID: 6
	NAME: 2534
Hibernate: delete from LEARN_FRAME where ID=?
Hibernate: select books0_.ID as ID0_, books0_.NAME as NAME0_ from LEARN_FRAME books0_
INFO - closing
INFO - cleaning up connection pool: jdbc:mysql://192.168.4.139:3306/test
哈哈
	ID: 4
	NAME: 哈哈
254534
	ID: 5
	NAME: 254534
2534
	ID: 6
	NAME: 2534


Hibernate對於數據的更新、刪除等動作,是依賴id值來判定,如果您已知id值,則可以使用load()方法來加載資料。


部分參考 51CTO.com


發佈了16 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章