本文包括:
1、CRM 項目的整體介紹
2、Hibernate 框架概述
3、Hibernate 快速入門
4、Hibernate 常用的配置文件
5、Hibernate 常用的接口和類
1、CRM 項目的整體介紹
-
什么是 CRM
CRM(Customer Relationship Management)客戶關系管理,是利用相應的信息技術以及互聯網技術來協調企業與顧客間在銷售、營銷和服務上的交互,向客戶提供創新式的個性化的客戶交互和服務的過程
其最終目標是將面向客戶的各項信息和活動集成起來,組建一個以客戶為中心的企業,實現對面向客戶的活動的全面管理
-
CRM 的模塊
CRM 系統實現了對企業銷售、營銷、服務等各階段的客戶信息、客戶活動進行統一管理。
CRM 系統功能涵蓋企業銷售、營銷、用戶服務等各各業務流程,業務流程中與客戶相關活動都會在 CRM 系統統一管理。
-
下邊列出一些基本的功能模塊,包括:
客戶信息管理
聯系人管理
商機管理
統計分析等
-
模塊的具體功能
-
客戶信息管理
- 對客戶信息統一維護,客戶是指存量客戶或擬營銷的客戶,通過員工錄入形成公司的“客戶庫”是公司最重要的數據資源。
-
聯系人管理
- 對客戶的聯系人信息統一管理,聯系人是指客戶企業的聯系人,即企業的業務人員和客戶的哪些人在打交道。
-
客戶拜訪管理
- 業務員要開發客戶需要去拜訪客戶,客戶拜訪信息記錄了業務員與客戶溝通交流方面的不足、采取的策略不當、有待改進的地方或值得分享的溝通技巧等方面的信息。
-
綜合查詢
- 客戶相關信息查詢,包括:客戶信息查詢、聯系人信息查詢、商機信息查詢等
-
統計分析
- 按分類統計客戶信息,包括:客戶信息來源統計、按行業統計客戶、客戶發展數量統計等
-
系統管理
系統管理屬于crm系統基礎功能模塊,包括:數據字典、賬戶管理、角色管理、權限管理、操作日志管理等
-
-
SSH 框架
-
Hibernate 的開發位置
學習路線:
Hibernate 入門:主要是學習框架的入門,自己搭建框架,完成增刪改查的操作
Hibernate 一級緩存:主要學習一級緩存、事務管理和基本的查詢
Hibernate 進階:主要學習一對多和多對多的操作等
Hibernate 查詢優化:基本查詢和查詢的優化
2、Hibernate 框架概述
-
Hibernate 框架的概述
Hibernate 是一個開放源代碼的對象關系映射(ORM)框架,它對 JDBC 進行了非常輕量級的對象封裝,使得 Java 程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
Hibernate 可以應用在任何使用 JDBC 的場合,既可以在 Java 的客戶端程序使用,也可以在 Servlet/JSP 的 Web 應用中使用。
Hibernate 是輕量級 JavaEE 應用的持久層解決方案,是一個關系數據庫ORM框架
記住:Hibernate 是一個持久層的 ORM 框架!!!
-
什么是ORM(對象關系映射)
-
ORM映射:Object Relational Mapping
- O:面向對象領域的 Object(JavaBean 對象)
- R:關系數據庫領域的 Relational(表的結構)
- M:映射 Mapping(XML 的配置文件)
簡單一句話:Hibernate 使程序員通過操作對象的方式來操作數據庫表記錄
-
-
Hibernate 優點:
Hibernate 對 JDBC 訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。
Hibernate 是一個基于 jdbc 的主流持久化框架,是一個優秀的 ORM 實現,它很大程度的簡化了 DAO 層編碼工作。
Hibernate 的性能非常好,因為它是一個輕量級框架。映射的靈活性很出色。它支持很多關系型數據庫,從一對一到多對多的各種復雜關系。
3、Hibernate 快速入門
-
下載Hibernate 5的運行環境
-
創建表結構
-
建表語句如下
Create database hibernate_day01; Use hibernate_day01; CREATE TABLE `cst_customer` ( `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)', `cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)', `cust_user_id` bigint(32) DEFAULT NULL COMMENT '負責人id', `cust_create_id` bigint(32) DEFAULT NULL COMMENT '創建人id', `cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源', `cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業', `cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別', `cust_linkman` varchar(64) DEFAULT NULL COMMENT '聯系人', `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話', `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動電話', PRIMARY KEY (`cust_id`) ) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
-
-
搭建 Hibernate 的開發環境
-
創建 WEB 工程,引入 Hibernate 開發所需要的 jar 包
MySQL的驅動jar包
Hibernate開發需要的jar包(資料/hibernate-release-5.0.7.Final/lib/required/所有jar包)
日志jar包(資料/jar包/log4j/所有jar包)
-
-
編寫 JavaBean 實體類
-
Customer 類的代碼如下:
public class Customer { // 以后都使用包裝類,默認值為 null private Long cust_id; private String cust_name; private Long cust_user_id; private Long cust_create_id; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; private String cust_phone; private String cust_mobile; // 省略get和set方法 }
-
-
創建 類與表結構的 映射:
-
在 JavaBean 所在的包下創建映射的配置文件
默認的命名規則為:實體類名.hbm.xml
-
在 實體類名.hbm.xml 配置文件中引入約束(引入的是 hibernate3.0 的 dtd 約束,不要引入 4 的約束)
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
-
如果不能上網,編寫配置文件是沒有提示的,需要自己來配置
復制 http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd --> window --> preferences --> 搜索 xml --> 選擇 xml catalog --> 點擊 add --> 選擇 URI --> 粘貼復制的地址 --> 選擇 location,選擇本地的 DTD 的路徑
-
編寫映射的配置文件:實體類名.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 配置類和表結構的映射 --> <class name="com.itheima.domain.Customer" table="cst_customer"> <!-- 配置 id 見到 name 屬性,JavaBean 的屬性 見到 column 屬性,是表結構的字段 --> <id name="cust_id" column="cust_id"> <!-- 主鍵的生成策略 --> <generator class="native"/> </id> <!-- 配置其他的屬性 --> <property name="cust_name" column="cust_name"/> <property name="cust_user_id" column="cust_user_id"/> <property name="cust_create_id" column="cust_create_id"/> <property name="cust_source" column="cust_source"/> <property name="cust_industry" column="cust_industry"/> <property name="cust_level" column="cust_level"/> <property name="cust_linkman" column="cust_linkman"/> <property name="cust_phone" column="cust_phone"/> <property name="cust_mobile" column="cust_mobile"/> </class> </hibernate-mapping>
-
-
編寫 Hibernate 核心的配置文件
在 src 目錄下,創建名稱為 hibernate.cfg.xml 的配置文件
-
在 XML 中引入 DTD 約束
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
-
打開:資料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties,可以查看具體的配置信息
-
必須配置的4大參數
#hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password
-
數據庫的方言(必須配置的)
#hibernate.dialect org.hibernate.dialect.MySQLDialect
-
可選的配置
#hibernate.show_sql true #hibernate.format_sql true #hibernate.hbm2ddl.auto update
-
引入映射配置文件(一定要注意,要引入映射文件,框架需要加載映射文件,如果不引入,則需要在 Java 代碼中手動加載)
<mapping resource="com/itheima/domain/Customer.hbm.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-configuration> <!-- 記住:先配置SessionFactory標簽,一個數據庫對應一個SessionFactory標簽 --> <session-factory> <!-- 必須要配置的參數有5個,4大參數,數據庫的方言 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">liaohaolin</property> <!-- 數據庫的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 可選配置 --> <!-- 顯示SQL語句,在控制臺顯示 --> <property name="hibernate.show_sql">true</property> <!-- 格式化SQL語句 --> <property name="hibernate.format_sql">true</property> <!-- 生成數據庫的表結構 update:如果沒有表結構,創建表結構。如果存在,不會創建,添加數據 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 映射配置文件,需要引入映射的配置文件 --> <mapping resource="com/itheima/domain/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>
-
編寫 Hibernate 入門代碼
-
具體的代碼如下:
/** * 測試保存客戶 */ @Test public void testSave(){ /** * 1. 先加載配置文件 * 2. 創建SessionFactory對象,生成Session對象 * 3. 創建session對象 * 4. 開啟事務 * 5. 編寫保存的代碼 * 6. 提交事務 * 7. 釋放資源 */ // 1. 先加載配置文件 // 簡寫的方法,默認加載src目錄下hibernate.cfg.xml的配置文件 Configuration config = new Configuration().configure(); // 2. 創建SessionFactory對象 SessionFactory factory = config.buildSessionFactory(); // 3. 創建session對象 Session session = factory.openSession(); // 4. 開啟事務 Transaction tr = session.beginTransaction(); // 5. 編寫保存的代碼 Customer c = new Customer(); // c.setCust_id(cust_id); // 主鍵是自動遞增的,所以不用編寫 c.setCust_name("測試3"); c.setCust_level("2"); c.setCust_phone("110"); // 保存數據,操作對象就相當于操作數據庫的表結構 session.save(c); // 6. 提交事務 tr.commit(); // 7. 釋放資源 session.close(); factory.close(); }
-
如果在 hibernate.cfg.xml 中不引入映射配置文件,則需要在上述代碼的第1點中這樣編寫:
// 1. 先加載配置文件 Configuration config = new Configuration(); // 默認加載src目錄下hibernate.cfg.xml的配置文件 config.configure(); // 手動加載(了解即可) config.addResource("com/itheima/domain/Customer.hbm.xml");
-
回憶:快速入門
1. 下載 Hibernate 框架的開發包
2. 編寫數據庫和表結構
3. 創建WEB的項目,導入了開發的 jar 包
* MySQL 驅動包、Hibernate 開發的必須要有的 jar 包、日志的 jar 包
4. 編寫 JavaBean,以后不使用基本數據類型,使用包裝類
5. 編寫映射的配置文件(核心),先導入開發的約束,里面正常配置標簽
6. 編寫 hibernate 的核心的配置文件,里面的內容是固定的
7. 編寫代碼,使用的類和方法
4、Hibernate 常用的配置文件
-
映射配置文件
-
映射文件,即 Customer.hbm.xml 的配置文件
-
<class>
標簽 -- 用來將類與數據庫表建立映射關系- name -- 類的全路徑
- table -- 表名(如果類名與表名一致,那么 table 屬性也可以省略)
- catalog -- 數據庫的名稱,基本上都會省略不寫
-
<id>
標簽 -- 用來將類中的屬性與表中的主鍵建立映射,id 標簽就是用來配置主鍵的。- name -- 類中屬性名
- column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么 column 可以省略.)
- length -- 字段的程度,如果數據庫已經創建好了,那么 length 可以不寫。如果沒有創建好,生成表結構時,length 最好指定。
-
<property>
-- 用來將類中的普通屬性與表中的字段建立映射.- name -- 類中屬性名
- column -- 表中的字段名.(如果類中的屬性名與表中的字段名一致,那么 column 可以省略.)
- length -- 數據長度
- type -- 數據類型(一般都不需要編寫,如果寫需要按著規則來編寫)
- Hibernate的數據類型 type="string"
- Java的數據類型 type="java.lang.String"
- 數據庫字段的數據類型 <column name="name" sql-type="varchar"/>
-
-
-
核心配置文件
-
核心配置文件的兩種方式
-
第一種方式是屬性文件的形式,即properties的配置文件
- hibernate.properties
- hibernate.connection.driver_class=com.mysql.jdbc.Driver
- 缺點
- 不能加載映射的配置文件,需要手動編寫代碼去加載
- hibernate.properties
-
第二種方式是 XML 文件的形式,開發基本都會選擇這種方式
- hibernate.cfg.xml
<property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
- 優點
- 格式比較清晰
- 編寫有提示
- 可以在該配置文件中加載映射的配置文件(最主要的優點)
- hibernate.cfg.xml
-
-
關于 hibernate.cfg.xml 的配置文件方式
-
必須有的配置
-
數據庫連接信息:
hibernate.connection.driver_class -- 連接數據庫驅動程序
hibernate.connection.url -- 連接數據庫 URL
hibernate.connection.username -- 數據庫用戶名
hibernate.connection.password -- 數據庫密碼 -
方言:
hibernate.dialect -- 操作數據庫方言
-
-
可選的配置
- hibernate.show_sql -- 顯示 SQL
- hibernate.format_sql -- 格式化 SQL
- hibernate.hbm2ddl.auto -- 通過映射轉成 DDL 語句,常用: update
- create -- 每次都會創建一個新的表 --- 測試的時候
- create-drop -- 每次都會創建一個新的表,當執行結束之后,將創建的這個表刪除 --- 測試的時候
- update -- 如果有表,使用原來的表。沒有表,創建一個新的表,同時更新表結構(比如新增一個字段,但是不能刪除字段)
- validate -- 如果有表,使用原來的表。同時校驗映射文件與表中字段是否一致,如果不一致就會報錯。
-
加載映射
-
如果XML方式:
<mapping resource="cn/itcast/hibernate/domain/User.hbm.xml" />
-
-
-
5、Hibernate 常用的接口和類
-
Configuration 類和作用
-
Configuration 類
Configuration 對象用于配置并且啟動 Hibernate。
Hibernate 應用通過該對象來獲得對象-關系映射文件中的元數據,以及動態配置 Hibernate 的屬性,然后創建 SessionFactory 對象。
簡單一句話:加載 Hibernate 的配置文件,可以獲取 SessionFactory 對象。
-
Configuration 類的其他應用(了解)
- 加載配置文件的種類,Hibernate 支持 xml 和 properties 類型的配置文件,在開發中基本都使用 XML 配置文件的方式。
-
如果采用的是 properties 的配置文件,那么通過:
Configuration configuration = new Configuration();
就可以自動配置文件,但是還需要自己手動加載映射文件(xxx.hbm.xml):
config.addResource("cn/itcast/domain/Student.hbm.xml");
-
如果采用的XML的配置文件,通過:
Configuration configuration = new Configuration().configure();
加載配置文件。
-
- 加載配置文件的種類,Hibernate 支持 xml 和 properties 類型的配置文件,在開發中基本都使用 XML 配置文件的方式。
-
-
SessionFactory:重要
- SessionFactory 是工廠類,是生成 Session 對象的工廠類
- SessionFactory 類的特點
由 Configuration 通過加載配置文件創建該對象。
-
SessionFactory 對象中保存了當前的數據庫配置信息和所有映射關系以及預定義的 SQL 語句。同時,SessionFactory 還負責維護 Hibernate 的二級緩存。
- 預定義SQL語句
- 使用 Configuration 類創建了 SessionFactory 對象是,已經在SessionFacotry 對象中緩存了一些 SQL 語句
- 常見的 SQL 語句是增刪改查(通過主鍵來查詢)
- 這樣做的目的是效率更高
- 預定義SQL語句
一個 SessionFactory 實例對應一個數據庫,應用從該對象中獲得 Session 實例。
SessionFactory 是線程安全的,意味著它的一個實例可以被應用的多個線程共享。
SessionFactory 是重量級的,意味著不能隨意創建或銷毀它的實例。如果只訪問一個數據庫,只需要創建一個 SessionFactory 實例,且在應用初始化的時候完成。
SessionFactory 需要一個較大的緩存,用來存放預定義的SQL語句及實體的映射信息。另外可以配置一個緩存插件,這個插件被稱之為 Hibernate 的二級緩存,被多線程所共享
-
總結
- 一般應用使用一個 SessionFactory,最好是應用啟動時就完成初始化。
-
編寫HibernateUtil的工具類
正因為 SessionFactory 比較特別,每次使用時都是固定的代碼,所以可以把代碼抽取出來,編寫工具類。
-
具體代碼如下
public class HibernateUtil { private static final Configuration cfg; private static final SessionFactory factory; static{ // 給常量賦值 // 加載配置文件 cfg = new Configuration().configure(); // 生成factory對象 factory = cfg.buildSessionFactory(); } // 獲取Session對象 public static Session openSession(){ return factory.openSession(); } }
-
Session 接口
-
概述
Session 是在 Hibernate 中使用最頻繁的接口。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象
Session 是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心
Session是線程不安全的
所有持久化對象必須在 session 的管理下才可以進行持久化操作
Session 對象有一個一級緩存,顯式執行 flush 之前,所有的持久化操作的數據都緩存在 session 對象處
持久化類與 Session 關聯起來后就具有了持久化的能力
-
特點
不是線程安全的。應避免多個線程使用同一個 Session 實例
Session 是輕量級的,它的創建和銷毀不會消耗太多的資源。應為每次客戶請求分配獨立的 Session 實例
Session 有一個緩存,被稱之為 Hibernate 的一級緩存。每個 Session 實例都有自己的緩存
-
常用的方法
-
save(obj)
/** * 測試工具類 */ @Test public void testSave2(){ // 使用工具類簡化代碼 Session session = HibernateUtils.getSession(); Transaction tr = session.beginTransaction(); Customer c = new Customer(); c.setCust_name("小風"); session.save(c); // 提交事務 tr.commit(); // 釋放資源 session.close(); }
-
get(Class,id)
2個參數:class 表示要查詢的 JavaBean 的 class 對象,id 為主鍵的值。
例如,需要查 Customer 對應的表中主鍵值為7(Long 類型)的記錄,代碼如下:
Customer c = session.get(Customer.class, 7L);
-
delete(obj)
注意:在這里是對數據庫進行操作,所以刪除的是數據庫的表中的某一行記錄,所以首先要調用上面的 get 方法,得到對象后,再刪除。
Customer c = session.get(Customer.class, 7L); // 刪除客戶 session.delete(c);
-
update(obj)
Customer c = session.get(Customer.class, 95L); // 設置客戶的信息 c.setCust_name("小蒼"); c.setCust_level("3"); // 修改 session.update(c);
-
saveOrUpdate(obj) -- 保存或者修改(如果沒有數據,保存數據。如果有,修改數據)
-
保存
Customer c = new Customer(); // c.setCust_id(10L); 這是錯誤做法!千萬不能自己設置主鍵去保存! c.setCust_name("測試"); session.saveOrUpdate(c);
-
修改
// 先查詢再改 Customer c = session.get(Customer.class, 6L); c.setCust_name("小澤"); session.saveOrUpdate(c);
-
-
createQuery() -- HQL語句的查詢的方式
// 創建查詢的接口 Query query = session.createQuery("from Customer"); // 查詢該表所有的數據 List<Customer> list = query.list(); for (Customer customer : list) { System.out.println(customer); }
-
-
-
Transaction 接口
Transaction 是事務的接口
-
常用的方法
commit() -- 提交事務
rollback() -- 回滾事務
-
特點
Hibernate 框架默認情況下事務不自動提交.需要手動提交事務
如果沒有開啟事務,那么每個 Session 的操作,都相當于一個獨立的事務
在如上的代碼中,都開啟了事務,并且手動提交了事務。
-
示例:
/** * 測試保存 */ @Test public void testSave3(){ Session session = null; Transaction tr = null; try { // 獲取session session = HibernateUtils.getSession(); // 開啟事務 tr = session.beginTransaction(); // 執行代碼 Customer c = new Customer(); c.setCust_name("哈哈"); // 保存 session.save(c); // 提交事務事務 tr.commit(); } catch (Exception e) { // 回滾事務 tr.rollback(); e.printStackTrace(); }finally{ // 釋放資源 session.close(); } }