1.獲取核心 配置文件對象,默認是加載src的hibernate.cfg.xm文件
Configuration cfg = new Configuration().configure();
- Configuration對象就是用來加載配置文件
- new Configuration構造方法配置加載的是hibernate.properties
- configre()方法加載的是hibernate.cfg.xml
- 默認情況下,上面兩種配置文件都需要放在src目錄下
- configure(String resource)這個方法可以指定配置文件路徑
Hibernate的核心配置文件的多種形式
- hibernate.cfg.xml 推薦使用,配置內容豐富
- hibernate.properties 配置形式key/value,key不能重複;配置有侷限性;可以進入hibernate包\project\etc目錄看
加載映射文件方式
1.在hibernate.cfg.xml配置
<!-- 2、配置JavaBean與表的映射文件 -->
<mapping resource="路徑/User.hbm.xml" />
2.代碼設置調用Configuration對象addResource方法
cfg.addResource("路徑/User.hbm.xml");
3.調用Configuration對象的addClass方法
cfg.addClass(User.class javabean類名);
常見異常
- 重複了映射文件
2.創建 會話工廠 == 數據庫 連接池
SessionFactory factory = cfg.buildSessionFactory();
- SessionFactory 相當於java web連接池,用於管理所有session
- 獲得SessionFactory 方式:config.buildSessionFactory();
- sessionFactory 還用於緩存配置信息 (數據庫配置信息、映射文件,預定義HQL語句 等)
- SessionFactory線程安全,多個線程同時訪問時,不會出現線程併發訪問問題。
3.創建會話
Session session = factory.openSession();
1.factory.openSession() 獲取一個全新的session
2.factory.getCurrentSession() 獲取一個與當前線程綁定的session
- a.要使用這個方法必須在hibernate.cfg.xml中配置<property name="hibernate.current_session_context_class">thread</property>
- b.hibernate支持,將創建的session綁定到本地線程中,底層使用ThreadLocal,在程序之間共享session。
- c.如果提交或者回滾事務,底層將自動關閉session
3.1開啓事務
Transaction trans = sessoin.getTransaction();
trans.begin();
事務也可以在hibernate.cfg.xml配置文件中設置
<!-- 是否自動提交事務 -->
<property name="hibernate.connection.autocommit">true</property>
3.2session.操作
session的api(方法)
save 保存,需要提交事務
- 執行save方法前,設置的OID將忽略;執行save方法,立即觸發insert語句,從數據庫獲得主鍵的值(OID值)
- persist保存的對象,在保存前,不能設置id,否則會報錯
get 通過id查詢,如果沒有 null
load 通過id查詢,如果沒有拋異常
get和load方法的區別:
- get方法是直接加載數據庫 直接操作
- load的設計是懶加載,load方法返回的是的一個代理對象,用到時代理對象去查詢數據庫
- load執行原理圖
update 更新
- 方式一.通過get獲取數據,調用set方法,事務提交,自動執行update語句
- 方式二.自己封裝User對象,設置id,這個時候,需要調用update方法
- session.update(user);//有id會更新,update時,一定要有id
- session.save(user); //有id會更新
- session.saveOrUpdate(user);//判斷user有沒有id,有id,更新數據,沒有id的插入數據
delete 刪除
- 刪除數據兩種方式
- 第一方式:先獲取要刪除對象,然後再調用delete方法
- 第二方式:創建一個User,設置id,然後再調用delete方法
-
session.getTransaction().begin(); //方式1 User user = (User) session.get(User.class實體名,id); session.delete(user); //方式2 User user = new User(); user.setUid(8 要刪除的id);// session.delete(user); session.getTransaction().commit();
查詢對象 :三種
- HQL:Hibernate Query Language,Hibernate查詢語言,面向對象查詢語言,最終底層要轉成面向數據庫查詢語言.
- SQL:直接面向數據庫查詢語言
1.Query 查詢對象
Query query = session.createQuery("from User where username=? and password=?");
query.setParameter(0, "zjc");
query.setParameter(1, "123");
//執行查詢
User user = (User) query.uniqueResult(); //一條結果
System.out.println(user);
分頁查詢 limit ?,?
//查詢對象
Query query = session.createQuery("from User");
//分頁查詢 limit?,? 【limit 3,3】
query.setFirstResult(3); //啓始位置
query.setMaxResults(3); //返回的數據條數
//返回多行數據
List<User> list = query.list();
for(User obj : list){
System.out.println(obj);
}
2.Criteria hibernate提供
- QBC(query by criteria),hibernate提供純面向對象查詢語言,提供直接使用PO對象進行操作。
//創建Criteria查詢對象
Criteria criteria = session.createCriteria(User.class);
//加條件zjc,123 eq =
criteria.add(Restrictions.eq("username", "zjc"));
criteria.add(Restrictions.eq("password", "123"));
System.out.println(criteria.uniqueResult());
// 【gt 大於>】【 ge大於等於>=】【lt 小於>】【 le小於等於>=】
criteria.add(Restrictions.ge("uid", 10));
// 【模糊查詢】
criteria.add(Restrictions.like("username", "%y%"));
-
PO:persistent object ,用於與數據庫交互數據。 --dao層 (JavaBean + hbm )
BO:Business object ,業務數據對象。 --service層
VO:Value Object 值對象。 --web層
3.SQLQuery 原生sql查詢語言
// 創建SQLQuery查詢對象
SQLQuery query = session.createSQLQuery("select * from t_user");
// 返回數據封裝到集合,集合裝的數組
List<Object[]> list = query.list();
// 遍歷結果
for (Object[] objs : list) {
for (Object o : objs) {
System.out.println(o);
}
}
3.3提交事務
trans.commit();
//trans.rollback();
try{
//開啓
//session操作
//提交
} catch(e){
//回滾
}
4.關閉會話
session.close();
5.關閉工廠,釋放資源
factory.close();
hibernate工具類 HibernateUtils.java (整理借用)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory factory;
static {
// 1.獲取核心 配置文件對象
Configuration cfg = new Configuration().configure();
// 2.創建會話工廠
factory = cfg.buildSessionFactory();
// 監聽程序關閉
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("程序關閉...");
// 關閉會話工廠
factory.close();
}
});
}
public static Session openSession() {
return factory.openSession();
}
public static Session getCurrentSession() {
return factory.getCurrentSession();
}
}