發下牢騷,這段時間要作項目,又要學框架,搞得都沒時間寫筆記,可是以爲這知識學過仍是要記錄下。進入主題了java
1.一、Hibernate簡介mysql
什麼是Hibernate?Hibernate有什麼用?算法
Hibernate是開放源代碼的對象關係映射框架,用來把java的對象映射到數據庫中的關係數據中,以便永久保存數據。sql
(簡單說來,咱們都知道Java語言是面向對象的語言,數據庫是面向關係的,咱們每次要往數據庫中添加數據的時候,是否是每次都須要寫SQL語句,進行CRUD,而優秀的開發人員數據庫
他們想出了一個很是好的映射框架,對象關係映射,也就是Hibernate,再透徹點說,就是你往對象添加數據的時候,數據庫中的表就自動添加了數據了。是否是很神奇!)網絡
Hibernate的做用:session
一、管理Java類的對象到數據庫的映射app
二、提供數據查詢框架
三、提升效率,減小開發人員使用SQL和jdbc處理數據的時間ide
四、Hibernate能實現數據持久化和對象關係的映射
1.二、理解Hibernate
筆者在前面有說過,學一個東西,首先要理解它是什麼?有什麼用?爲什麼存在?
咱們要了解Hibernate,首先要先去了解三層結構,三層結構咱們都聽過,可是,它和Hibernate有什麼關係呢?
這裏簡要說明下三層結構
三層結構分爲: 表示層,業務邏輯層,數據庫層
表示層: 提供與用戶進行交互的界面
業務邏輯層: 負責各類業務邏輯,提供對業務數據的保存,更新,刪除和查詢操做等
數據庫層: 存放管理應用的持久化業務數據
而Hibernate,其實就是在業務邏輯層和數據庫層中間,添加一個持久化層,這個持久化層是業務邏輯中分離出來的;這樣,業務邏輯層經過持久化層,持久化層經過數據庫層。
這裏說了持久化,那麼什麼是持久化呢?
將數據(如內存中的對象)永久的保存到存儲設備中,就是持久化,持久化的做用是將內存中的數據存儲到關係型的數據庫中。
說到底其實數據存放分爲兩種,一種是短時間存放,就是存放在內存中,當你從新運行項目的時候,內存中的數據就消失,而另一種就是永久存放。
理論就到這裏。
1.二、簡單例子——增刪改查
1.2.一、搭建環境
新建java property,這裏筆者的環境是Eclipse+Tomcat8.0,下載所須要的jar包,打包在這裏,注意還得添加mysql的jar包,將包導入到項目中,具體操做
右鍵項目名——Properties——Java Build Path——Libraries——Add Library——User Library——User Libraryies——New,接下來就添加jar,而後起個名字,以後將導入到你的項目就能夠了。
效果圖:
1.2.二、新建配置文件
這裏須要注意一點就是:在Hibernate中,默認配置文件的命名爲hibernate.cfg.xml,因此咱們配置文件命名通常就是這個,若是說你想要從新命名的話,那麼在讀取配置文件的時候就要指定相對路徑。
在src下新建hibernate.cfg.xml
內容有鏈接數據庫,指定讀取實體類的配置信息,還有在控制檯輸出SQL語句等數據;配置文件中的dtd文件,在hibernate-core-4.2.4.Final.jar中的org.hibernate中的最後就能看到hibernate-configuration-3.0.dtd,打開該文件,而後將下面的dtd文件限制加到xml配置文件中便可。注意:筆者這裏使用的是hibernate 4.2的版本。可是通常都在覈心包裏面的。
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
新建實體類:Student.java
package com.hibernate.hellos; public class Student { private int sid; private String sname; private int sage; public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } }
重點來了:當咱們新建實體類時,須要在該實體類的基礎上新建映射文件,dtd限制一樣在覈心包中裏面查找
新建配置文件:Student.hbn.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> <!-- name:表示的是該類的相對路徑 table:表示的是數據庫的表名 --> <class name="com.hibernate.hellos.Student" table="Student"> <!-- type:表示該屬性是int類型 column:映射的是數據庫中的列名 native:根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個,就是根據數據庫生成 --> <id name="sid" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="sname" type="java.lang.String"> <column name="SNAME" /> </property> <property name="sage" type="int"> <column name="SAGE" /> </property> </class> </hibernate-mapping>
注意:
其中generator的class有:
increment(遞增)
用於爲long, short或者int類型生成惟一標識。只有在沒有其餘進程往同一張表中插入數據時才能使用。
identity (標識)
對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內置標識字段提供支持。返回的標識符是long, short 或者int類型的。
sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的標識符是long, short或者 int類型的
uuid
用一個128位的UUID算法生成字符串類型的標識符。在一個網絡中惟一(使用了IP地址)。UUID被編碼爲一個32位16進制數字的字符串。
native(本地)
根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。
新建配置文件:hiberate.cfg.xml,該文件放在src下
<?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-configuration> <session-factory> <property name="show_sql">true</property> <!-- 顯示sql語句 --> <property name="format_sql">true</property> <!-- 格式化sql語句 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url"> <![CDATA[jdbc:mysql://localhost:3306/myhibernate?useUnicode=true&characterEncoding=utf8]]> </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 建立表 使用create,查詢或者更新的時候使用update--> <property name="hibernate.hbm2ddl.auto">create</property> <!-- hibernate的第一個測試例子 --> <mapping resource="com/hibernate/hellos/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
注意:使用hibernate.hbm2ddl.auto的時候,當爲create的時候,表示若是你數據庫中沒建立表也不要緊,hibernate會自動幫你建立,當使用update的時候,表示在表的基礎上使用
接下來新建一個測試類:Test.java
package com.hibernate.hellos; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class Test { private static SessionFactory sessionfactory; private static Session session; public static void main(String[] args){ //讀取默認配置文件名 hibernate.cfg.xml //若是要指定文件名,只須要在new Configuration().configure("指定文件的路徑"); Configuration config = new Configuration().configure(); //註冊服務 ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()) .buildServiceRegistry(); //實例化一個session工廠 SessionFactory sessionfactory = config.buildSessionFactory(service); //打開hibernate的session,執行操做 session = sessionfactory.openSession(); //添加 add(); //查詢 sel(); //修改 update(); //刪除 delete(); } //添加 public static void add(){ Transaction transaction = session.beginTransaction(); Student s = new Student(); s.setSname("張三"); s.setSage(20); session.save(s); transaction.commit(); //注意:若是session關閉的話,須要指定打開 } //查詢 public static void sel(){ Student s = (Student) session.get(Student.class, 1); System.out.println(s.getSname()); } //修改數據 public static void update(){ Student s = new Student(); s.setSname("李四"); s.setSage(30); Transaction transaction = session.beginTransaction(); //獲取數據庫中的表 Student s1 = (Student) session.get(Student.class,1); transaction.commit(); s1.setSname("李思思"); transaction = session.beginTransaction(); session.update(s1); transaction.commit(); } public static void delete(){ Transaction transaction = session.beginTransaction(); Student s = (Student) session.get(Student.class, 1); session.delete(s); transaction.commit(); } }
若是你直接複製我代碼的話,你就會看到數據庫中除了一張表數據什麼都沒有,把delete()方法註釋掉。恩,別犯傻。
當咱們使用格式化的時候,就能夠看到
添加和修改的效果圖:
數據庫中的表的數據:
總結:
一、新建實體類的時候,記得要寫映射文件,固然可使用註解的方式,後期筆者會慢慢記錄
二、table表名不能夠是mysql中的關鍵字
三、hibernate.hbm2ddl.auto的使用須要注意