創建工程可以是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;
}