一、首先要搞定配置文檔:
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