Hibernate實例


Hibernate實例

一、Hibernate簡介

Hibernate是簡化項目中連接數據庫的一個框架工具

Hibernate是Java領域類技術成熟穩定的ORM框架

* ORM是對象關系映射
* 使用ORM的好處:使得習慣使用面向對象編程的程序員在項目中盡量少寫和底層數據庫相關的sql語句
* 這樣做的好處:方便程序維護和修改以及跨平台性和擴展

 

二、使用的工具

(1)eclipse

Eclipse Java EE IDE for Web Developers. Version: Neon.3 Release (4.6.3)

(2)mysql

mysql-5.7.17

(3)Navicat

Navicat Premium_11.2.7簡體中文破解版

(4)hibernate插件

jbosstools-4.4.4.Final

(5)junit工具

junit-4.8.2

* JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。
* Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。
* Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。

(6)jdbc

mysql-connector-java-5.1.7

 

(三)Hibernate開發的基本步驟

* (1)編寫項目配置文檔hibernate.cfg.xml
* (2)編寫實體類(需遵循Java bins的規范)
* (3)生產對應實體類的映射文件並添加到配置文檔中
* (4)調用Hibernate API函數進行測試

hibernate執行流程圖

1)編寫項目配置文檔hibernate.cfg.xml

這個配置文件制定了連接數據庫的方式以及輸出方式和數據庫操作方式

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <session-factory>
 7         <property name="connection.username">root</property><!--數據庫用戶名 -->
 8         <property name="connection.password">1314</property><!--數據庫密碼 -->
 9         <property name="connection.driver_class">com.mysql.jdbc.Driver</property><!--數據庫驅動 -->
10         <!--數據庫鏈接 -->
11         <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
12 
13         <!--表示數據庫的方言,對數據庫的語言結構進行優化 -->
14         <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
15 
16         <!--是否把要執行的語句輸出到控制台 -->
17         <property name="show_sql">true</property>
18         <!--是否對要執行的語句格式化 -->
19         <property name="format_sql">true</property>
20         <!--生成表結構的策略,create表示刪除原表重新生成,update表示更新原表 -->
21         <property name="hbm2ddl.auto">create</property>
22         <!--給數據庫中的所有表加上前綴 -->
23         <property name="hibernate.default_schema">hibernate</property>
24         <!--getCurrentSession方法創建session要用到的屬性 -->
25         <property name="hibernate.current_session_context_class">thread</property>
26 
27 
28         <mapping class="Students" />
29         <!--掉用映射 Students.hbm.xml -->
30         <mapping resource="Students.hbm.xml" />
31         
32     </session-factory>
33 </hibernate-configuration>

2)編寫實體類(需遵循Java bins的規范)

Students.java

這是這個hibernate實例中的實體類,會映射到數據庫的表中

 1 import java.util.Date;
 2 
 3 //學生類
 4 public class Students {
 5 
 6     /*
 7      * Java bin類的原則 1.公有的類 2.提供公有的不帶參數的默認的構造方法 3.屬性私有 4.屬性setter/getter封裝  8      * 
 9      */
10 
11     private int sid;// 學號
12     private String sname;// 姓名
13     private String gender;// 性別
14     private Date birthday;// 出生日期
15     private String address;// 地址
16 
17     public Students() {
18 
19     }
20 
21     public Students(int sid, String sname, String gender, Date birthday, String address) {
22         // super();
23         this.sid = sid;
24         this.sname = sname;
25         this.gender = gender;
26         this.birthday = birthday;
27         this.address = address;
28     }
29 
30     public int getSid() {
31         return sid;
32     }
33 
34     public void setSid(int sid) {
35         this.sid = sid;
36     }
37 
38     public String getSname() {
39         return sname;
40     }
41 
42     public void setSname(String sname) {
43         this.sname = sname;
44     }
45 
46     public String getGender() {
47         return gender;
48     }
49 
50     public void setGender(String gender) {
51         this.gender = gender;
52     }
53 
54     public Date getBirthday() {
55         return birthday;
56     }
57 
58     public void setBirthday(Date birthday) {
59         this.birthday = birthday;
60     }
61 
62     public String getAddress() {
63         return address;
64     }
65 
66     public void setAddress(String address) {
67         this.address = address;
68     }
69 
70     @Override
71     public String toString() {
72         return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
73                 + ", address=" + address + "]";
74     }
75 
76 }

 

3)生產對應實體類的映射文件並添加到配置文檔中

這個配置文件就是將java中的類映射到數據庫中的表

每修改一次實例的屬性,這個配置文件就需要修改

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2017-5-29 9:53:03 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="Students" table="STUDENTS"><!--name表示在java中的類  table表示映射在數據庫中的表名-->
 7         <id name="sid" type="int"><!--id整個這個標簽表示主鍵 -->
 8         <!--sid表示在java類中的屬性名  type表示這個屬性的類型-->
 9             <column name="SID" /><!--SID表示的是這個屬性映射在數據庫中的字段名稱-->
10             <generator class="assigned" /><!--generator表示的是主鍵的生產方式 assigned表示人為指定 active表示數據庫自動生成-->
11         </id>
12         <property name="sname" type="java.lang.String"><!--property是屬性的意思-->
13             <column name="SNAME" />
14         </property>
15         <property name="gender" type="java.lang.String">
16             <column name="GENDER" />
17         </property>
18         <property name="birthday" type="java.util.Date">
19             <column name="BIRTHDAY" />
20         </property>
21         <property name="address" type="java.lang.String">
22             <column name="ADDRESS" />
23         </property>
24     </class>
25 </hibernate-mapping>

4)調用Hibernate API函數進行測試

通過junit進行測試

 1 //這里報錯我一直在糾結,其實視頻里面這里也有錯啊,我浪費時間
 2 //多去看視頻下面的評論,有告訴我們很多問題的解決方案
 3 //運行代碼時老犯配置錯誤,原來配置文件中不支持java注釋的寫法
 4 //我是通過刪減犯錯位置的代碼來發現錯誤的
 5 
 6 /*
 7  * 理解hibernate
 8  * hibernate是對jdbc進行了輕量級的封裝,本身還是用的jdbc
 9  */
10 
11 /*
12  * 理解session
13  * Session對象相當於jdbc中的connection數據庫,因為要面對對象的思想操作數據庫,
14  * 所以用session而不是用而不是直接用jdbc
15  * hibernate是對jdbc進行了輕量級的封裝,本身還是用的jdbc
16  * 所以可以簡單理解session為操作數據庫對象
17  * session與connection是一對多的關系,每個session都有一個與之對應的connection,
18  * 一個connection不同時刻可以供多個session使用
19  * session的增刪改查:save(),update(),delete().createQuery()
20  */
21 
22 /*
23  * 理解transaction
24  * hibernate對數據的操作都是封裝在事務當中,並且默認是非自動提交方式,
25  * 所以用session保存對象時,如果不開啟事務,並且手工提交事務,對象並不會真正保存在數據庫中
26  * 如果不開事務,要用session的doWork()方法將數據提交到數據庫
27  */
28 
29 /*
30  * session詳解
31  * 如何獲得session對象
32  * 1)openSession
33  * 2)getCurrentSession
34  */
35 import java.sql.Connection;
36 import java.sql.SQLException;
37 import java.util.Date;
38 
39 import org.hibernate.Session;
40 import org.hibernate.SessionFactory;
41 import org.hibernate.Transaction;
42 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
43 import org.hibernate.cfg.Configuration;
44 import org.hibernate.jdbc.Work;
45 import org.hibernate.service.ServiceRegistry;
46 import org.junit.After;
47 import org.junit.Before;
48 import org.junit.Test;
49 
50 //測試類
51 public class StudentsTest {
52 
53     private SessionFactory sessionFactory;
54     private Session session;
55     private Transaction transaction;
56     
57     @Before
58     public void init(){
59         //創建配置對象
60         Configuration config = new Configuration().configure();
61         //創建服務注冊對象
62         ServiceRegistry serviceRegistry =  new 
63                 StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();//這里有點不一樣
64         //創建會話工廠對象
65         sessionFactory = config.buildSessionFactory(serviceRegistry);
66         //創建會話對象
67         session = sessionFactory.openSession();
68         //開啟事務
69         transaction = session.beginTransaction();
70     }
71     
72     @After
73     public void destory(){
74         transaction.commit();//提交事務
75         session.close();//關閉會話
76         sessionFactory.close();//關閉會話工廠
77     }
78     
79     
80     @Test
81     public void testSaveStudents(){
82         //生產學生對象
83         Students s = new Students(1,"飯飯","男",new Date(),"博客園");
84 //        session.doWork(new Work() {//匿名內部類
85 //            @Override
86 //            public void execute(Connection connection) throws SQLException {
87 //                // TODO Auto-generated method stub
88 //                connection.setAutoCommit(true);
89 //            }
90 //        });
91         session.save(s);//保存對象進入數據庫
92 //        session.flush();//強制刷新流
93     }
94     
95 }

 

四、hibernate基本操作

hibernate基本數據類型

hibernate對象類型

hibernate常用基本類型

 

五、總結

* 1、什么是ORM?為什么要使用Hibernate?
* ORM是對象關系映射
* 使用ORM的好處是使得習慣使用面向對象編程的程序員在項目中盡量少寫和底層數據庫相關的sql語句
* 這樣做的好處:方便程序維護和修改以及跨平台性和擴展
* Hibernate是Java領域類技術成熟穩定的ORM框架


* 2、Hibernate開發的基本步驟
* (1)編寫項目配置文檔hibernate.cfg.xml
* (2)編寫實體類(需遵循Java bins的規范)
* (3)生產對應實體類的映射文件並添加到配置文檔中
* (4)調用Hibernate API函數進行測試


* 3、什么是session?
* hibernate對數據庫的操作都要使用session對象,session對象相當於我們使用jdbc開發的一個connection對象
* 我們使用hibernate對數據庫的操作本質上就是調用session的API函數來實現的
* save():(增)保存數據 get()/load():(查)取出數據 update():(改)更新數據 delete():(刪)刪除數據


* 4、openSession與getCurrentSession
* openSession每次創建一個新的實例對象,需要我們顯示關閉
* getCurrentSession使用的是一種單例模式,每次創建的都是相同的對象,自動關閉


* 5、單表操作有哪些方法?
* save():(增)保存數據 delete():(刪)刪除數據 update():(改)更新數據 get()/load():(查)取出數據


* 6、get和load
* get使用時立刻發送sql語句,而且直接獲得實體類本身
* load是在使用到具體的實例的非主屬性的時候才會發送sql語句,返回的是代理對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM