開發hibernate步驟

創建工程可以是java也可以是web

1、引入jar文件

2、設計表同時開發和表的字段名一致的javabean(持久化類)

3、創建對象-關系映射文件:映射文件的擴展名為 .hbm.xml 這里Login.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>

<class name="com.hw.entity.Student" table="tab_student">

<id name="id" type="integer" column="id"><!-- 如果列名和name名一致可以省去 -->

時間類型 把 java.util.Date 改成 java.sql.Date

<generator class="native"></generator><!-- 主鍵自增 --></id>

<property name="name" type="string"></property>

<property name="score" type="float"></property>

</class></hibernate-mapping>

4、創建 Hibernate 配置文件(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">

<!-- Generated by MyEclipse Hibernate Tools.? ? ? ? ? ? ? ? -->

<hibernate-configuration>

<session-factory>

<!-- hibernate 的mysql方言 -->

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="connection.url">jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=utf8</property>

<property name="connection.username">root</property>

<property name="connection.password">root</property>

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- hibernate自動生成表 -->

<property name="hibernate.hbm2ddl.auto">update</property>

<!-- hibernate顯示sql -->(運行底下會顯示語句,可以刪)

<property name="show_sql">true</property>

<!-- hibernate 格式化sql-->(運行底下會顯示語句,可以刪)

<property name="format_sql">true</property>

<!-- hibernate映射文件 -->(點source的另一個 add加進去)

<mapping resource="com/hw/entity/Student.hbm.xml" />

</session-factory>

</hibernate-configuration>

5、加載xml文件,創建sessionFactory

public class HibernateUtil {

public static Session getSession() {//獲取當前session

return new Configuration().configure().buildSessionFactory().openSession()

}

}

6、開發crud

private Session session=null;

public void add(Person per){//添加

session=HibernateUtil.getSession();

Transaction beginTransaction = session.beginTransaction();//開啟事務

session.save(per);//添加

beginTransaction.commit();//事務提交

session.close();

}

public void update(Person per){//修改

session=HibernateUtil.getSession();

Transaction beginTransaction = session.beginTransaction();//開啟事務

session.update(per);//修改

beginTransaction.commit();//事務提交

session.close();

}

//saveOrUpdate 添加或修改,有id且存在為修改或則為添加

public void del(Person per){//刪除

session=HibernateUtil.getSession();

Transaction beginTransaction = session.beginTransaction();//開啟事務

session.delete(session.get(Dept.class,id));//刪除對象

beginTransaction.commit();//事務提交

session.close();

}

查詢

1get和load可查詢單個對象,兩者區就是為查詢不到時返回結果不同,get是null

load是not found

get方法

session=HibernateUtil.getSession();

// Transaction beginTransaction = session.beginTransaction();//開啟事務

Person per = (Person) session.get(Person.class, id);//get獲取單個對象

System.out.println(per.getId()+" "+per.getName()+" "+per.getMoney());

// beginTransaction.commit();//事務提交

session.close();? //注:查詢可以不加事務

一、get方法查詢單個對象,有就輸出結果,沒有則報空指針

案例:

public Person findByid(int id){//查詢單個對象,可以不用事務

session=HibernateUtil.getSession();

Person per = (Person) session.get(Person.class, id);//get獲取單個對象

session.close();

return per;

}

load方法

session=HibernateUtil.getSession();

// Transaction beginTransaction = session.beginTransaction();//開啟事務

Person per = (Person) session.load(Person.class, id);//get獲取單個對象

System.out.println(per.getId()+" "+per.getName()+" "+per.getMoney());

// beginTransaction.commit();//事務提交

session.close();? //注:查詢可以不加事務

一、load方法查詢單個對象,有就輸出結果,沒有則報找不到對象

http://www.iteye.com/topic/67686

(hibernate中get方法和load方法的根本區別

如果你使用load方法,hibernate認為該id對應的對象(數據庫記錄)在數據庫中是一定存在的,所以它可以放心的使用,它可以放心的使用代理來延遲加載該對象。在用到對象中的其他屬性數據時才查詢數據庫,但是萬一數據庫中不存在該記錄,那沒辦法,只能拋異常ObjectNotFoundException,所說的load方法拋異常是指在使用該對象的數據時,數據庫中不存在該數據時拋異常,而不是在創建這個對象時。由于session中的緩存對于hibernate來說是個相當廉價的資源,所以在load時會先查一下session緩存看看該id對應的對象是否存在,不存在則創建代理。所以如果你知道該id在數據庫中一定有對應記錄存在就可以使用load方法來實現延遲加載。

對于get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然后在二級緩存中查找,還沒有就查數據庫,數據庫中沒有就返回null。

雖然好多書中都這么說:“get()永遠只返回實體類”,但實際上這是不正確的,get方法如果在session緩存中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加載過,那么返回的還是原先的代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據),那么它會查詢二級緩存或者數據庫來加載數據,但是返回的還是代理對象,只不過已經加載了實體數據。

前面已經講了,get方法首先查詢session緩存,沒有的話查詢二級緩存,最后查詢數據庫;反而load方法創建時首先查詢session緩存,沒有就創建代理,實際使用數據時才查詢二級緩存和數據庫。

總之對于get和load的根本區別,一句話,hibernate對于load方法認為該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,就拋異常;而對于get方法,hibernate一定要獲取到真實的數據,否則返回null。)1

1.get()采用立即加載方式,而load()采用延遲加載;

get()方法執行的時候,會立即向數據庫發出查詢語句,

而load()方法返回的是一個代理(此代理中只有一個id屬性),只有等真正使用該對象屬性的時候,才會發出sql語句

2.如果數據庫中沒有對應的記錄,get()方法返回的是null.而load()方法出現異常ObjectNotFoundException

hibernate的get/load的根本區別分為4點:第一點是:load會拋出異常,get會返回空,一般采用的load方法。第二點是:get只返回實體對象實例。而load返回的是代理類實體對象實例。第三點是:get方法只能使用一級緩存。而load可以使用一級和二級緩存。第四點是:都是通過id得到單個對象的方法。

2list方法可以返回多個(hql)

public List<Dept>list() {//查詢和原來jdbc有區別

Query createQuery = session.createQuery("from Dept");//from 后接類名

List<Dept>list = createQuery.list();

return list;

}

public List<Dept>listPage(int currentPage, int pageSize) {

//selecct* from dept limit ?,?

//hql中不支持limit分頁,只能使用如下設置

Query createQuery = session.createQuery("from Dept");//from 后接類名

/*hibernate分頁錯誤寫法

* createQuery.setInteger(0,(currentPage-1)*pageSize);

createQuery.setInteger(1,pageSize);*/

//相當于limit的第1個問號

createQuery.setFirstResult((currentPage-1)*pageSize);

//相當于limit的第2個問號

createQuery.setMaxResults(pageSize);

List<Dept>list = createQuery.list();

return list;

}

public List<Dept>listLike(String name) {

//from Dept? 相當于sql語句的 select * from Dept

Query createQuery = session.createQuery("from Dept where dname like ?");

//from 后接類名

createQuery.setString(0, '%'+name+'%');

//hibernate是從0開始,jdbc是從1開始

List<Dept>list = createQuery.list();

return list;

}

public int getCount() {//統計數量

Query createQuery = session.createQuery("from Dept");//from 后接類名

List<Dept>list = createQuery.list();

return list.size();

}

Query query = session.createQuery("select count(*) from "

+ clazz.getSimpleName());

count = (Long) query.uniqueResult();

session.close();

hql的update(不用)

public void updateStudent2(Student stu) {

Session session = HibernateUtils.getSession();

// 4創建數據庫事務(要么同時功要么同時失敗):開發中除了查詢外都要用事務

Transaction beginTransaction = session.beginTransaction();

String hql="update Student set name=?,score=? where id=?";

// String hql="insert into Student values(null,?,?)"; //hib不支持insert

Query createQuery = session.createQuery(hql);

createQuery.setString(0, stu.getName());

createQuery.setFloat(1, stu.getScore());

createQuery.setInteger(2, stu.getId());

createQuery.executeUpdate();//執行修改或刪除

beginTransaction.commit();

// 7關閉Session

session.close();

}

hql的delete(不用)

public void delStudent2(int id) {

Session session = HibernateUtils.getSession();

// 4創建數據庫事務(要么同時功要么同時失敗):開發中除了查詢外都要用事務

Transaction beginTransaction = session.beginTransaction();

String hql="delete from Student? where id=?";

Query createQuery = session.createQuery(hql);

createQuery.setInteger(0,id);

createQuery.executeUpdate();//執行修改或刪除

beginTransaction.commit();

// 7關閉Session

session.close();

}

createSQLQuery:用于復雜sql語句查詢

public ListlistLikeStudentPage2(String name, int currentPage,int pageSize) {Session session = HibernateUtils.getSession();String sql="select * from tab_student where name like ? limit ?,?";//createSQLQuery:用于復雜sql語句查詢SQLQuery query = session.createSQLQuery(sql);query.setString(0, '%'+name+'%');query.setInteger(1, (currentPage-1)*pageSize);query.setInteger(2, pageSize);query.addEntity(Student.class);//一定要添加實體類Listlist = query.list();

return list;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容