1 什麼是CRM?
客戶關係管理,面向客戶,以客戶爲中心的企業客戶管理
客戶關係管理的具體內容爲:
客戶信息管理,聯繫人管理,客戶拜訪管理,綜合查詢,統計分析,系統管理
具體分析如下:
綜合查詢:客戶信息查詢,聯繫人信息查詢,商機信息查詢
統計分析:按客戶來源,按行業,按客戶數量
系統管理:數據字典,賬戶管理,角色管理,權限管理,操作日誌管理
2 什麼是CRUD?
增(create)查(retrieve)改(update)刪(delete)
3 JavaEE開發三層架構:
web層 業務邏輯層 持久層
早期爲: jsp+servlet javaBean jdbc
現在: SSH Struts2(Struts1+webwork) spring hibernate springJDBC的模板
SSM SpringMvc spring Mybatis
4 Hibernate框架簡述:
Hibernate是一個開源全自動的,基於JDBC的持久化,ORM(對象關係映射)框架,它對象JDBC進行輕量級封裝,封裝後好處爲:
它將POJO與數據庫建立映射關係,可以自動生成sql語句,自動執行,使之可以用面向對象思維操作數據庫。
注:POJO:plain Ordinary Java Object簡單的Java對象,其命名是爲了與EJB(Enterprise JavaBean 編好核心代碼的java類)的命名區分開來
除此之外,它可以應用在 使用JDBC的客戶端程序和WEB應用程序。
最具有革命意義的是,Hibernate可以在應用EJB的JavaEE架構中取代CMP,來完成數據持久化
5 Hibernate與傳統的JDBC:
(1) 爲什麼要使用Hibernate?
JDBC適合小型應用程序開發,大型應用開發需要使用Hibernate(它提高數據訪問層效率,也就是操作數據庫的效率)
(2) Hibernate是ORM框架,何爲ORM(對象關係映射)?
它是描述java對象和關係型數據庫表之間的元數據,可以自動把java對象持久化到關係型數據庫表中(通過操作java對象完成數據庫表操作)
它相當於java對象和關係型數據庫中的一個紐帶,如下:
業務邏輯模型 持久層 數據存儲層
javaBean對象 <---> O/R映射(ORM) <--> 關係型數據庫
速記:ORM O Object代表Java對象; R Relation關係 代表關係型數據庫; M Mapping映射 代表一種映射關係
(3) Hibernate和其他操作數據庫的技術相比的優勢:
1>對JDBC訪問數據庫代碼進行輕量級封裝,它簡化了DAO層(data access object 數據訪問層)操作 (從而減少內存消耗,加快運行效率)
2>Hibernate映射性能好,支持很多種關係型數據庫,且代碼開源可擴展。
6 Hibernate目錄簡要介紹:
documentation文件夾:存放Hibernate相關的API參考文檔
lib文件夾: 存放 Hibernate編譯和運行所依賴的jar包,其子目錄required下爲 運行Hibernate框架必備的jar包
project文件夾: 存放Hibernate框架源代碼
7 Hibernate使用POJO進行持久化 POJO(plain ordinary java object 簡單的java對象)
(1)何爲持久化類?
持久化類是應用程序中的業務實體類,這裏的持久化是指該類的對象可以被持久化保存到數據庫中
(2)POJO持久化類
POJo持久化類對象中包含與數據庫表的字段相對應的屬性,這些屬性通過 getter/setter方法進行訪問,對外部隱藏了實現細節
8 Hibernate相關配置之實體類映射文件配置(Xxx.hbm.xml,存放在POJO包下):
概述:創建完POJO實體類並不馬上具備持久化操作能力,Hibernate框架需要知道該實體類映射到關係型數據庫中那個表,以及類中屬性對應庫表中哪個字段
這都需要在映射文件中進行配置
實體類映射文件配置(反映了持久化類和數據庫表的映射信息):
(1)導入Hibernate框架約束:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
(2)orm元數據配置:
1>頭標籤 <hibernate-mapping package="xxx"></hibernate-mapping>
package屬性: 填寫包名,在元素內部凡是需要書寫完整類名的屬性,使用其後可以直接寫簡單類名
2>子標籤<class name="" table="" catalog=""></class>
配置實體類和表對應的關係
name屬性: 實體全類名
table屬性: 對應的表名
catalog屬性: 對應的數據庫名(一般可以省略)
3><class></class>下的子標籤:
1. <id name="" column="" length="" type="" length=""></id>
主鍵屬性的映射:
name(必寫):與主鍵對應的實體類中的屬性名
column(可選):表中主鍵對應的列名
length(可選):表中對應字段最大長度
type(可選):表中對應字段類型
其子標籤<generator class=""></generator>主鍵生成策略,class默認值爲 native
注: 可選項,若沒有填寫,Hibernate會進行默認值設置
2.<property name="" column="" length="" type="" length="" not-null=""></property>
普通屬性映射:
name(必寫): 與主鍵對應的實體類中的屬性名
column(可選): 表中主鍵對應的列名
length(可選): 表中對應字段最大長度
not-null(可選): 配置該表中列(屬性)是否不能爲空,默認值爲:false(即可以爲空)
type(可選): 填寫表中列(屬性)的類型,若不填寫,hibernate會自動檢測出 實體的屬性類型
若填寫,則有三種類型寫法: java類型|hibernate類型|數據庫類型(只做瞭解,不建議自己填寫)
java類型 :<property ... type="String"></property>
hibernate類型:<property...type="string"></property>
數據庫類型(較特殊),格式如下:
<property ..>
<column name="cust_name" sql-type="varchar"></column>
</property>
4>模版示例:
<!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="cn.XXX.domain.Customer" table="cst_customer" >
<id name="cust_id" column="cust_id" >
<generator class="native" ></generator>
</id>
<property name="cust_name" column="cust_name" ></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_linkman" column="cust_linkman"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>
9 Hibernate相關配置之核心配置文件配置(hibernate-cfg.xml,存放到src下):
概述: Hibernate(核心)主配置文件主要用於配置數據庫連接和Hibernate運行時所需屬性
方式一:XML配置
(1)導入約束:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" http://www.hibernate.org/dtd/hibernate- configuration-3.0.dtd">
(2)主配置:
1>主標籤<hibernate-configuration></hibernate-configuration>
2>子標籤<session-factory></session-factory>:
其子標籤下進行的數據庫連接配置:
必選配置(5項):
<!--數據庫驅動-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--數據庫url-->
<property name="hibernate.connection.url">jdbc:mysql:///數據庫名</property>
<!--數據庫用戶名-->
<property name="hibernate.connection.username">數據庫用戶名</property>
<!--數據庫密碼-->
<property name="hibernate.connection.password">數據庫密碼</property>
<!--數據庫方言
不同的數據庫中,sql語法略有區別,指定方言可以讓hibernate框架針對數據庫的方言生成sql語句
所有的數據庫語言都遵循 sql99標準
hibernate.dialect org.hibernate.dialect.MySQLDialect
hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
注意:MYSQL在選擇方言時:請選擇最短的方言
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
可選項配置(3項):
<!--將hibernate生成的sql語句打印到控制檯-->
<property name="hibernate.show_sql">true</property>
<!--將hibernate生成的sql語句格式化(語法縮進,否則就很長的一行顯示)-->
<property name="hibernate.format_sql">true</property>
<!--
auto schema export 自動導出表結構,根據實體自動建表
hibernate.hbm2ddl.auto create 自動建表且每次框架運行完後都會創建出新的表,以前的表會被覆蓋掉,表數據會丟失(通常只在開發環境的測試中才使用)
hibernate.hbm2ddl.auto create-drop 自動建表且每次框架運行完都會把所有表刪除(通常只在開發環境的測試中才使用)
hibernate.hbm2ddl.auto update(推薦使用) 自動生成表,如果已經存在則不會再生成,如果表有變動,則自動更新表(不會刪除任何數據)
hibernate.hbm2ddl.auto validate 校驗,不自動生成表(框架每次啓動 會校驗數據庫中表是否正確)校驗失敗會拋出異常
-->
<property name="hibernate.hbm2ddl.auto">update</property>
(2)引入orm元數據:
<!--路徑書寫:填寫src下 orm配置文件(Customer.hbm.xml)的路徑-->
<mapping resource="cn/itheima/domain/Customer.hbm.xml"/>
方式二: hibernate.properties文件屬性配置
把數據庫連接數據寫入hibernate.properties文件,然後在hibernate.cfg.xml配置文件裏進行配置
但在實際開發中,一般使用xml配置方式,因爲xml的配置格式更易於修改,當改變底層應用配置時不需要重新改變和編譯代碼
而properties的文件不具備這樣的優點
10 Hibernate相關的API
(1)Configuration(配置對象) ------加載核心配置文件
概述: Configuration類的作用主要是對Hibernate框架進行配置,以及啓動。
在Hibernate框架啓動時,首先會創建Configuration類實例(該實例主要用於啓動,加載,管理hibernate的配置文件信息)
Configuration類實例會首先定位主配置文件(hibernate.cfg.xml)的位置, 讀取其中配置後,就會創建一個SessionFactory對象後完成使命
具體細節:
創建實例代碼
Configuration config=new Configuration().configure();
此種方式默認會到src下讀取 hibernate.cfg.xml文件,如想使用指定目錄下的配置文件,則需要在configure()方法中傳遞一個文件路徑,如下:
Configuration config=new Configuration().configure("hibernate.cfg.xml所在路徑");
擴展理解: 如果主配置中未引入映射配置,可進行手動加載, 如下:
conf.addResource(resourceName)
conf.addClass(persistentClass 持久化類)
(2)SessionFactory(Session工廠類)
概述: SessionFactory接口負責Hibernate框架的初始化和創建Session對象,它不是輕量級的,一個項目只需一個SessionFactory就夠了, 操作多個數據庫時可爲每一個庫指定一個
它在Hibernate框架中起到一個緩衝區作用,Hibernate可以將自動生成的sql語句,映射語句,以及某些可重複利用的數據放在這個緩衝區
同時它還保存了對數據庫配置的所有映射關係,維護了當前的二級緩存
具體細節:
通過Configuration獲取SessionFactory
SessionFactory sessionFactory=config.buildSessionFactory();
釋放資源--把它看作JDBC的連接池對象會更好理解
sessionFactory.close()
特點:
1>它是重量級的,不能隨意創建和銷燬它的實例
2>它是線程安全的,同一個實例可以提供多個線程共享
衍生出的工具類:
由於Hibernate的特點,一個項目只需一個SessionFactory,當應用程序中存在多個數據源,才爲每個數據源指定SessionFactory實例,
爲此,在實際開發中,通常會抽取一個HibernateUtils工具類來提供Session對象
HibernateUtils的代碼如下:
public class HibernateUtils {
/* 工廠對象 SessionFactory負責保存和使用所有配置信息,消耗內存資源非常大,開發中要保證它只能被創建一次
* 所以使用了 static{}讓它在類加載器中只創建一次
*/
private static final SessionFactory factory;
static {
//1 獲取 配置加載類 Configuration。並讀取src下的主配置文件
Configuration conf=new Configuration().configure();
//2 獲取 hiberate數據庫核心對象 session 的工廠
factory = conf.buildSessionFactory();
}
//獲得全新session
public static Session openSession() {
// 3 獲取 hibernate核心對象 session
Session openSession = factory.openSession();
return openSession;
}
//獲得與線程綁定的session
public static Session getCurrentSession() {
// 3 獲取 hibernate核心對象 session
Session currentSession = factory.getCurrentSession();
return currentSession ;
}
}
(3)Session(應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate框架操作數據庫的核心對象)
注:(它和會話技術的用戶session和javaMail的session沒半點毛線關係,Session類似於JDBC年代的Connection)
概述:Session接口負責執行持久化對象的CRUD操作(對持久化對象的創建,讀取,刪除),所有持久化對象必須在Session管理下才可進行持久化操作
具體細節:
通過SessionFactory工廠類獲取Session
方式一:獲取全新的Session實例,使用完畢需要調用close()方法進行手動關閉
Session newSession=sessionFactory.openSession( )
方式二:獲取與當前線程綁定的Session實例,它在事務提交或回滾時會自動關閉
Session currentSession=sessionFactory.getCurrentSession()
特點分析:
1 Session線程不安全,多個併發線程同時操作一個Session實例易導致Session數據存取的混亂,因此設計軟件架構時,應要避免多個線程共享一個Session實例
2 Session是輕量級的,Session實例的創建和銷燬不需耗費太多內存
3 Session擁有Hibernate的一級緩存,這個緩存主要存放當前工作單元加載的對象
session的增刪改查:
1.增---向數據庫表中增加一個名爲 xxx 的Customer對象
Customer c=new Customer();
c.setCust_name("xxx");
session.save(c);
2.刪---刪除id爲1的Customer對象
//1 獲得要刪除的對象
Customer c=session.get(Customer.class,1l);
//3 執行 刪除
session.delete(c);
3.改--修改id爲1的Customer對象的name屬性
//1 獲得要修改的對象
Customer c=session.get(Customer.class,1l);
//2 進行修改操作
c.setCust_name("YYY");
//3 執行 update
session.update(c);
4.查--查詢id爲1的Customer對象
//通過 數據庫的主鍵獲取指定的 實體(Customer)
Customer customer = session.get(Customer.class,1l);
System.out.println(customer);
Session的API擴展:
1 save() , update() 和 saveOrUpdate()方法,用於增加和修改對象
2 delete()方法 用於刪除對象
3 get() 和 load()方法,根據主鍵查詢
4 createQuery() 和 createSQLQuery() 方法 用於數據庫操作
5 createCriteria()方法:條件查詢
(4)Transaction(用於管理事務)
概述:它是Hibernate的數據庫事務接口,對底層的事務接口進行了封裝。
使用Session對數據庫操作後,要使用Transaction接口的commit()方法進行事務提交,才能真正將數據同步到數據庫.發生異常時,可通過Transaction的rollback()
事務回滾方法,避免數據錯誤。
在進行持久化操作後,如果沒有開啓事務,則每一個Session操作都相當一個獨立操作。
具體細節:
創建並開啓事務方式一:
Transaction transaction=session.getTransaction();
transaction.begin(); ---開啓事務
創建並開啓事務方式二(建議使用):
Transaction transaction=session.beginTransaction()
事務提交
transaction.commit();
事務回顧
transaction.rollback();
釋放資源
transaction.close();