有了實體類,也有了hibernate ,還成功的鏈接了數據庫。本節中,我們共同使用hibernate將實體類的信息更新至數據表。
# 開啟自動創建數據表
hibernate.cfg.xml
```
<!-- 啟用hibernate自動session上下文管理(現在不需要理解)-->
<property name="current_session_context_class">thread</property>
<!-- hibernate mapping to db define language auto create -->
<!-- validate:只驗證;create:每次都自動創建新表, update:自動更新表結構.create-drop:隨sessionFactory的關閉刪除 -->
<property name="hbm2ddl.auto">create</property>
<!-- 是否在控制臺打印sql語句 -->
<property name="show_sql">true</property>
</session-factory>
```
> 當我們只給出部分代碼時,表示其它未給出代碼的部分保持不變。
# 增加映射
加載實體類文件。
src/hibernate.cfg.xml
```
<!-- 是否在控制臺打印sql語句 -->
<property name="show_sql">true</property>
<!-- 加載entity.Teacher實體類映射文件 -->
<mapping class="entity.Teacher" />
</session-factory>
```
# 增加注解
在沒有接觸到java annotation(注解)以前,我們不曾想到,這個類似于注釋的東西,竟然能夠起如此大的作用。比如前面我們使用單元測試時,就增加過一個@Test注解,來告訴java,那個方法是一個單元測試的方法。
下面我們用注解的方式,來告訴hibrenate,我們當前類要對應數據庫中一個數據表
```
package entity;
import javax.persistence.Entity;
// 聲明主體
@Entity
public class Teacher {
```
> 和其它采用命名空間的語言一樣,我們可以根據命名空間和類名,來快速的定位到文件的位置。
# 測試:
和驗證數據庫配置信息一樣,只有在開啟事務時,才會進行數據表的更新。我們繼續使用第6節中的測試方法進行測試
> 所有的測試的文件,都位于test文件夾中。
```
package hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import java.util.List;
import java.util.Properties;
public class TestCfgXml {
@Test
public void TestConfig() {
try {
// 實例化
```
測試信息:
```
發生錯誤:
org.hibernate.AnnotationException: No identifier specified for entity: entity.Teacher
```
上述報錯信息的原因,是由于我們并沒有為Teacher這個實體類增加主鍵,而Hibernate中規定:每個數據表最少存在一個主鍵。
# 增加主鍵
```
package entity;
import javax.persistence.Entity;
import javax.persistence.Id;
// 聲明主體
@Entity
public class Teacher {
// 聲明主鍵
@Id
private int id; // 主鍵
```
# 測試
```
package hibernate;
import java.util.Properties;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
public class TableTest {
@Test
public void createTable() {
// 實例化并加載數據庫配置文件
Configuration configuration = new Configuration().configure();
// 構造服務注冊對象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(configuration.getProperties()).
buildServiceRegistry();
// 創建會話工廠(session factory))
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
// 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話)
Session session = sessionFactory.getCurrentSession();
// 開啟事務(使用緩沖池進行數據庫的連接)
session.beginTransaction();
// 關閉session
session.close();
}
}
```
控制臺信息:
```
Hibernate: drop table if exists Teacher
Hibernate: create table Teacher (id integer not null, email varchar(255), name varchar(255), password varchar(255), sex boolean, username varchar(255), primary key (id))
一月 09, 2017 10:56:18 上午 org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
```
navicat查看數據庫,發現Teacher表已經為我們自動創建了。

# update
在實際開發中,如果我們將hbm2ddl.auto,則每次都會刪除所有的表,然后再重新建立空表。當我們需要一些測試數據時,明顯的,這樣會破壞我們的測試計劃。所以,我們更愿意將hbm2ddl.auto的屬性設計為update.
update能完成:1.有表則檢查表與實體是否對應,不對應則更新表結構。2.無表則創建一個新表。
最終hibrenate.cfg.xml的內容如下:
```
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate配置信息 -->
<hibernate-configuration>
<!-- session 工廠配置信息 -->
<session-factory>
<!-- 數據庫連接區動, 位于資源庫中的com.mysql.jdbc.Driver -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 數據庫連接信息jdbc:數據庫類型://地址/數據庫名 -->
<property name="connection.url">jdbc:mysql://localhost/javaee</property>
<!-- 用戶名 -->
<property name="connection.username">root</property>
<!-- 密碼 -->
<property name="connection.password"></property>
<!-- 編碼格式 -->
<property name="connection.characterEncoding">utf-8</property>
<!-- SQL 方言(不同的數據庫除實現了標準的SQL外,還有一些自己的特性) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 啟用hibernate自動session上下文管理(現在不需要理解)-->
<property name="current_session_context_class">thread</property>
<!-- hibernate mapping to db define language auto create -->
<!-- validate:只驗證;create:每次都自動創建新表, update:自動更新表結構.create-drop:隨sessionFactory的關閉刪除 -->
<property name="hbm2ddl.auto">update</property>
<!-- 是否在控制臺打印sql語句 -->
<property name="show_sql">true</property>
<!-- 加載entity.Teacher實體類映射文件 -->
<mapping class="entity.Teacher" />
</session-factory>
</hibernate-configuration>
```
- README
- 第一章:準備
- 第二章:Hello World!
- 第一節:查看工程文件
- 第二節:JDK、JRE與環境變量
- 第三節:index.jsp
- 第三章:Hello Struts
- 第一節:Web.xml
- 第二節:單入口
- 第三節:Hello Struts
- 第四節:觸發C層
- 第四章:建立數據表
- 第一節:建立實體類
- 第二節:測試一
- 第三節:測試二
- 第四節:引入Hibernate
- 第五節:配置Hibernate
- 第六節:建立連接
- 第七節:實體類映射數據表
- 第八節:完善數據表
- 第五章:教師管理
- 第一節:增加數據--add
- 第二節:增加數據--save
- 1 獲取傳入數據數據
- 2 數據寫入測試
- 3 對接C層
- 第三節:數據列表
- 1 獲取數據
- 2 重構代碼
- 3 C層對接--初始化
- 4 C層添加數據
- 5 V層顯示數據
- 6 獲取數據庫中數據
- 7 顯示性別
- 8 分頁
- 9 條件查詢
- 第四節:修改數據
- 1 edit
- 2 update
- 第五節:刪除數據
- 第六節:總結
- 第六章:重構C層
- 第一節:繼承ActionSupport類
- 第二節:數據驗證
- 第七章:前臺分離(前臺)
- 第一節:環境搭建
- 第二節:運行環境
- 第三節:共享開發環境
- 第四節:生產環境
- 第八章:前臺開發(前臺)
- 第一節:本地化
- 第二節:教師列表
- 1 引入M層
- 2 模擬后臺返回數據
- 3 C與M對接
- 4 C與V對接
- 第九章:前后臺對接(前后臺)
- 第一節:后臺輸出json(后臺)
- 第二節:對接前臺(全棧)
- 第二節:對接API(前臺)
- 第二節:跨域請求(后臺)
- 第三節:重構代碼(前臺)
- 第十章:重構后臺M層
- 第一節:數據訪問DAO層
- 第二節:項目整體重構
- 第十一章:用戶登陸(前后臺)
- 第一節:制定規范
- 第二節:定制測試用例
- 第三節:后臺輸入測試代碼(后臺)
- 第四節:postman(后臺)
- 第五節:新建用戶登陸模塊(前臺)
- 第六節:代碼重構(前臺)
- 第十二章:班級管理(前后臺)
- 第一節:班級列表
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第二節:Add
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第三節:Save
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第四節:Edit
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第五節:Update
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第六節:Delete
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第七節:小結
- 第十三章:班級管理(API)
- 第一節:ER圖
- 第二節:create
- 1 實體層
- 2 dao層
- 3 service(server)層
- 4 action層
- 第三節:ManyToOne
- 第四節:Read
- 1 service(server)層
- 2 action層
- 第五節:update
- 1 service(server)層
- 2 action層
- 第六節:update
- 第十四章:重構服務層