Hibernate學習筆記--單表對映
什麼是ORM?
ORM:物件關係對映,可以使面向物件程式設計師在專案當中儘量少些底層的sql語句。
Hibernate開發的基本步驟
1 編寫配置文件hibernate.cfg.xml
2 編寫實體類
3 生成與實體類對應的對映檔案ClassName.hbm.xml,把對映檔案加入到配置文件中
4 呼叫Hibernate API進行測試
Hibernate程式執行流程
配置檔案的詳解
常見屬性名稱 | 含義 |
---|---|
hbm2ddl.auto | 生成表結構策略。常見有create和update |
hibernate.show_sql | 是否列印sql語句到控制檯 |
hibernate.format_sql | 輸出時格式化sql語句 |
hibernate.dialect | 配置資料庫方言 |
hibernate字首可以不寫
對映檔案的詳解
1 < class name=”” table=”” batch-size=”“>標籤:name是對映的類名,table是對應的表名,batch-size是抓取策略(表示一次抓取記錄條數)
2 < id name=”” type=”” >標籤:name是對映的變數名,type是hibernate的資料型別,見下。
< column name=”“>標籤:資料庫中的列名
< generator class=”” >標籤:主鍵增長策略,mysql中 native依賴資料庫,assigned依賴java程式
3 < property name=”” type=”” not-null=”true”>
< column name=”“>標籤:資料庫中的列名
session的詳解
hibernate不建議直接通過jdbc中的connection操作資料庫,而是通過session操作資料庫,可以簡單理解為一個操作資料庫的物件,常用的save(),delete(),update(),get()/load()
獲得session的方法
1 openSession() 多次獲取的session不是同一個物件,不會自動關閉
2 getCurrentSession() 單例模式,所有獲得的session都是同一個,會自動關閉
如果使用,在配置檔案中配置hibernate.current_session_context_class
時間型別的區別
物件型別的區別
[學習慕課網視訊]
[ 配置檔案模版 ]
<?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="connection.url">
jdbc:mysql://localhost:3306/news
</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="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.format_sql">false</property>
<!-- c3p0連線池設定 -->
<!-- 指定連線池裡最大連線數 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定連線池裡最小連線數 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定連線池裡連線的超時時長 單位S -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定連線池裡最大快取多少個Statement物件 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!--表示連線池檢測執行緒多長時間檢測一次池內的所有連結物件是否超時. 連線池本身不會把自己從連線池中移除,而是專門有一個執行緒按照一定的時間間隔來做這件事,這個執行緒通過比較連線物件最後一次被使用時間和當前時間的時間差來和
timeout 做對比,進而決定是否銷燬這個連線物件 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!--當資料庫連線池中的連線耗盡時, 同一時刻獲取多少個數據庫連線 秒 -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<mapping resource="com/oracle/test/hibernate/bean/NewsBean.hbm.xml" />
<mapping resource="com/oracle/test/hibernate/bean/NewsCatagoryBean.hbm.xml" />
</session-factory>
</hibernate-configuration>
[ 對映檔案模版 ]
<?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>
<!--name是javaBean的完全限定名, table是該javaBean對應的資料庫表名稱 -->
<class name="com.oracle.test.hibernate.bean.NewsBean" table="news">
<!-- name對應實體類的屬性id -->
<id name="id" type="integer">
<!-- 資料表裡列名稱 -->
<column name="id"></column>
<!--主鍵的生成策略 native可以適應多種資料庫 increment mysql自動增長策略 sequence oracle自動增長策略 -->
<generator class="native"></generator>
</id>
<property name="title" type="string" not-null="true">
<column name="title"></column>
</property>
<property name="content" type="string">
<column name="content"></column>
</property>
<property name="createDate" type="date">
<column name="create_date"></column>
</property>
</class>
</hibernate-mapping>
[ 建立SessionFactory模版 ]
Configuration config = new Configuration().configure();
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);