開發(fā)hibernate步驟

創(chuàng)建工程可以是java也可以是web

1、引入jar文件

2、設(shè)計(jì)表同時(shí)開發(fā)和表的字段名一致的javabean(持久化類)

3、創(chuàng)建對(duì)象-關(guān)系映射文件:映射文件的擴(kuò)展名為 .hbm.xml 這里L(fēng)ogin.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名一致可以省去 -->

時(shí)間類型 把 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、創(chuàng)建 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自動(dòng)生成表 -->

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

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

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

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

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

<!-- hibernate映射文件 -->(點(diǎn)source的另一個(gè) add加進(jìn)去)

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

</session-factory>

</hibernate-configuration>

5、加載xml文件,創(chuàng)建sessionFactory

public class HibernateUtil {

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

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

}

}

6、開發(fā)crud

private Session session=null;

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

session=HibernateUtil.getSession();

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

session.save(per);//添加

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

session.close();

}

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

session=HibernateUtil.getSession();

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

session.update(per);//修改

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

session.close();

}

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

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

session=HibernateUtil.getSession();

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

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

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

session.close();

}

查詢

1get和load可查詢單個(gè)對(duì)象,兩者區(qū)就是為查詢不到時(shí)返回結(jié)果不同,get是null

load是not found

get方法

session=HibernateUtil.getSession();

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

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

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

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

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

一、get方法查詢單個(gè)對(duì)象,有就輸出結(jié)果,沒有則報(bào)空指針

案例:

public Person findByid(int id){//查詢單個(gè)對(duì)象,可以不用事務(wù)

session=HibernateUtil.getSession();

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

session.close();

return per;

}

load方法

session=HibernateUtil.getSession();

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

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

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

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

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

一、load方法查詢單個(gè)對(duì)象,有就輸出結(jié)果,沒有則報(bào)找不到對(duì)象

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

(hibernate中g(shù)et方法和load方法的根本區(qū)別

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

對(duì)于get方法,hibernate會(huì)確認(rèn)一下該id對(duì)應(yīng)的數(shù)據(jù)是否存在,首先在session緩存中查找,然后在二級(jí)緩存中查找,還沒有就查數(shù)據(jù)庫,數(shù)據(jù)庫中沒有就返回null。

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

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

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

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

get()方法執(zhí)行的時(shí)候,會(huì)立即向數(shù)據(jù)庫發(fā)出查詢語句,

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

2.如果數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄,get()方法返回的是null.而load()方法出現(xiàn)異常ObjectNotFoundException

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

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

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

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分頁,只能使用如下設(shè)置

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

/*hibernate分頁錯(cuò)誤寫法

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

createQuery.setInteger(1,pageSize);*/

//相當(dāng)于limit的第1個(gè)問號(hào)

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

//相當(dāng)于limit的第2個(gè)問號(hào)

createQuery.setMaxResults(pageSize);

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

return list;

}

public List<Dept>listLike(String name) {

//from Dept? 相當(dāng)于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() {//統(tǒng)計(jì)數(shù)量

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創(chuàng)建數(shù)據(jù)庫事務(wù)(要么同時(shí)功要么同時(shí)失敗):開發(fā)中除了查詢外都要用事務(wù)

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();//執(zhí)行修改或刪除

beginTransaction.commit();

// 7關(guān)閉Session

session.close();

}

hql的delete(不用)

public void delStudent2(int id) {

Session session = HibernateUtils.getSession();

// 4創(chuàng)建數(shù)據(jù)庫事務(wù)(要么同時(shí)功要么同時(shí)失敗):開發(fā)中除了查詢外都要用事務(wù)

Transaction beginTransaction = session.beginTransaction();

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

Query createQuery = session.createQuery(hql);

createQuery.setInteger(0,id);

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

beginTransaction.commit();

// 7關(guān)閉Session

session.close();

}

createSQLQuery:用于復(fù)雜sql語句查詢

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

return list;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容