連Hibernate技術(shù)都不清楚,你敢說你自己會ORM框架?
前言
ORM框架不是一個新話題,它已經(jīng)伴隨我們很多年了。它提供了概念性的、易于理解的數(shù)據(jù)模型,將數(shù)據(jù)庫中的表和內(nèi)存中的對象建立了很好的映射關(guān)系。在Java中常用的ORM框架主要有兩個:Hibernate和iBatis。本篇文章主要介紹Hibernate的使用方法,后續(xù)會出介紹iBatis的文章。
傳統(tǒng)的MVC開發(fā)模式
- ❝M:Model包括pojo、service、dao。
 - V:View 包括jsp、html、模塊引擎。
 - C:Controll 包括我們動態(tài)網(wǎng)絡(luò)資源的技術(shù):Servlet。❞
 
SSH框架在開發(fā)中的作用
- ❝S:Struts/SpringMVC: 實際上解決的是我們的控制器的問題(簡單的可以認為是Servlet的封裝)。
 - Spring: 整合其余的第三方框架,就是為 Srvice 層提供事務(wù)。
 - Hibernate:其實就是DAO層的解決方案。❞
 
同時可以看下其余框架(SSM、SSS)的含義:
Hibernate是什么
1.Hibernate是一個非侵入式ORMapping框架
- 非侵入式框架:我們在使用這個框架的時候,不需要繼承或者實現(xiàn)這個框架中的類或者接口,這種類型的框架就叫做非侵入式的框架,非侵入式的框架在使用的時候更好的和原有的框架實現(xiàn)了解耦
 - 侵入式框架:我們在使用這個框架的時候,需要繼承或者實現(xiàn)這個框架中的某些類或者接口,這種框架叫做侵入式框架
 
2.ORMapping解析
- O:Object
 - R:Relation
 - M:Mapping 映射
 - a.Hibernate能夠?qū)ava對象通過映射的關(guān)系映射到數(shù)據(jù)庫
 - b.Hibernate能夠?qū)?shù)據(jù)庫的數(shù)據(jù)通過映射關(guān)系映射到Java對象
 
Hibernate就是能夠通過操作Java對象來達到操作數(shù)據(jù)庫的一門技術(shù)。
Hibernate能干什么
簡單的說:實現(xiàn)數(shù)據(jù)庫的所有操作(CRUD),是原有DAO層的一個解決方案,也是一個替代品。
Hibernate的簡單使用
「簡單使用:」
導(dǎo)包,將下載下來的required+jpa相關(guān)的包放到一個文件里面
在src下面創(chuàng)建hibernate.cfg.xml配置文件
- <?xml version='1.0' encoding='utf-8'?>
 - <!DOCTYPE hibernate-configuration PUBLIC
 - "-//Hibernate/Hibernate Configuration DTD//EN"
 - "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 - <hibernate-configuration>
 - <session-factory>
 - <!--驅(qū)動程序-->
 - <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 - <!--訪問的URL-->
 - <property name="hibernate.connection.url">jdbc:mysql:///qianyu</property>
 - <!--用戶名-->
 - <property name="hibernate.connection.username">root</property>
 - <!--密碼-->
 - <property name="hibernate.connection.password">root</property>
 - <!--方言 表示的是告訴Hibernate框架當(dāng)前 你要生成那個數(shù)據(jù)庫下的SQL語句-->
 - <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
 - <!--是否自動創(chuàng)建表 create:表示的是每一次 都從新創(chuàng)建 update:表示的是 如果有就不創(chuàng)建 沒有就創(chuàng)建-->
 - <property name="hibernate.hbm2ddl.auto">update</property>
 - <!--配置映射文件-->
 - <mapping resource="com/qy/helloworld/User.hbm.xml"/>
 - </session-factory>
 - </hibernate-configuration>
 
創(chuàng)建Java的類的對象
- public class User implements Serializable{
 - private static final long serialVersionUID = -6949433888868762441L;
 - private int uId;
 - private String userName;
 - private String userPwd;
 - public User(int uId, String userName, String userPwd) {
 - super();
 - this.uId = uId;
 - this.userName = userName;
 - this.userPwd = userPwd;
 - }
 - public User() {
 - super();
 - }
 - public int getuId() {
 - return uId;
 - }
 - public void setuId(int uId) {
 - this.uId = uId;
 - }
 - public String getUserName() {
 - return userName;
 - }
 - public void setUserName(String userName) {
 - this.userName = userName;
 - }
 - public String getUserPwd() {
 - return userPwd;
 - }
 - public void setUserPwd(String userPwd) {
 - this.userPwd = userPwd;
 - }
 - @Override
 - public String toString() {
 - return "User [uId=" + uId + ", userName=" + userName + ", userPwd=" + userPwd + "]";
 - }
 - }
 
編寫測試類
- @Test
 - public void testHelloWord() throws Exception {
 - //引入配置文件
 - Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
 - //創(chuàng)建SessionFactory對象
 - SessionFactory sf=cfg.buildSessionFactory();
 - //創(chuàng)建會話
 - Session session=sf.openSession();
 - //開啟事務(wù)
 - session.beginTransaction();
 - //操作對象
 - User user=new User(1,"小羽","110");
 - //開始操作
 - session.save(user);
 - //進行事務(wù)的提交
 - session.getTransaction().commit();
 - session.close();
 - }
 
Hibernate中的hibernate.cfg.xml配置文件的詳解
- <?xml version='1.0' encoding='utf-8'?>
 - <!DOCTYPE hibernate-configuration PUBLIC
 - "-//Hibernate/Hibernate Configuration DTD//EN"
 - "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 - <hibernate-configuration>
 - <!--配置我們數(shù)據(jù)庫的連接信息的-->
 - <session-factory>
 - <!--驅(qū)動程序-->
 - <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 - <!--訪問的URL-->
 - <property name="connection.url">jdbc:mysql:///qianyu</property>
 - <!--用戶名-->
 - <property name="connection.username">root</property>
 - <!--密碼-->
 - <property name="connection.password">root</property>
 - <!--方言 表示的是告訴Hibernate框架當(dāng)前 你要生成那個數(shù)據(jù)庫下的SQL語句-->
 - <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
 - <!--是否自動創(chuàng)建表 create:表示的是每一次 都從新創(chuàng)建 update:表示的是 如果有就不創(chuàng)建 沒有就創(chuàng)建-->
 - <!--create經(jīng)常用在測試的環(huán)境中-->
 - <property name="hbm2ddl.auto">update</property>
 - <!--執(zhí)行的時候?qū)QL語句展示出來-->
 - <property name="show_sql">true</property>
 - <!--格式化這個SQL語句-->
 - <property name="format_sql">true</property>
 - <!--配置映射文件 配置的是映射文件的-->
 - <mapping resource="com/qy/helloworld/User.hbm.xml"/>
 - <!--使用注解的時候使用的是這一個-->
 - <!-- <mapping package="com.qy.helloworld"/> -->
 - </session-factory>
 - </hibernate-configuration>
 
Hibernate的xxx.hbm.xml配置文件的詳解
- <?xml version="1.0"?>
 - <!DOCTYPE hibernate-mapping PUBLIC
 - "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 - "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 - <!--package:一般情況下要進行配置 可以不配置 但是 下面你就要寫全路徑 auto-import="true":如果不配置的話那么在進行查詢的時候必須寫類的全路徑-->
 - <!--default-lazy:配置整個實體是否支持懶加載 默認就支持懶加載-->
 - <hibernate-mapping package="com.qy.helloworld" default-lazy="true" auto-import="true">
 - <!--下面配置的是映射關(guān)系 將JAVA對象 直接映射到數(shù)據(jù)庫的表里面去
 - name:表示的是類的名字
 - table:表示的是當(dāng)前的這個JAVA類 對應(yīng)的數(shù)據(jù)庫中的表的名字做是什么 這個名字是可以隨便寫的 但是一般要見名之意
 - lazy:當(dāng)前這個類在進行查詢操作的時候 要進行懶加載
 - -->
 - <class name="User" table="t_user" lazy="true">
 - <!--
 - id:表示的是主鍵的映射
 - name:類中主鍵的名字
 - column:主鍵對應(yīng)的表的字段
 - length:確定當(dāng)前字段的最大長度
 - type:類型(寫的是JAVA中數(shù)據(jù)類型的全路徑)
 - 注意:類型可以省略:省略之后的類型就和實體中的類型保持一致
 - length:可以省略 默認就是int的最大范圍
 - column:這個也可以省略省略之后 默認和類中保持一致
 - -->
 - <id name="uId">
 - <!--主鍵自增長
 - 上面的重點記住
 - identity:自增長這個表示的意思是:會根據(jù)底層的數(shù)據(jù)庫選擇自增長的策略
 - assigned:自己設(shè)置這個id的值
 - foreign:這個表示的是要將別人的主鍵來作為自己的主鍵
 - uuid:通過uuid來生成id主鍵
 - 下面的了解
 - increment:遞增(這個跟數(shù)據(jù)庫是有關(guān)系的)
 - native:是遞增(跟底層的數(shù)據(jù)庫的方言有關(guān))
 - sequence:這個表示的是通過表的序列來完成下一個id的生成(Oracle數(shù)據(jù)庫)
 - -->
 - <generator class="identity"/>
 - </id>
 - <!--下面映射的是普通的屬性
 - length:字符串的長度
 - not-null:當(dāng)前字段不能為空
 - type:類型
 - -->
 - <property name="userName" column="userName" length="20" not-null="true"/>
 - <property name="userPwd" length="20" not-null="true" type="java.lang.String"/>
 - </class>
 - </hibernate-mapping>
 
Hibernate中的CRUD的實現(xiàn)
- 添加數(shù)據(jù)
 - session.save(user);
 - session.persist(user);
 - 修改數(shù)據(jù)
 - session.beginTransaction();
 - //查詢數(shù)據(jù)(積極的加載)
 - User user=session.get(User.class,1);
 - //下面支持的是懶加載
 - user.setUserName("xxxxx");
 - user.setUserPwd("yyyyy");
 - session.getTransaction().commit();
 - 數(shù)據(jù)查詢
 - //查詢數(shù)據(jù)(積極的加載)
 - User user=session.get(User.class,1);
 - //下面支持的是懶加載
 - User user2=session.load(User.class,1);
 - 刪除數(shù)據(jù)
 - //查詢數(shù)據(jù)(積極的加載)
 - User user=session.get(User.class,1);
 - session.delete(user);
 
Hibernate中的幫助類的編寫
- public class HibernateUtils {
 - private static Configuration cfg=null;
 - private static SessionFactory sf=null;
 - private static ThreadLocal<Session> threadLocal=null;
 - static{
 - //初始化線程的局部變量
 - threadLocal=new ThreadLocal<Session>();
 - //加載配置文件
 - cfg=new Configuration().configure("config/hibernate.cfg.xml");
 - //生成我們的工廠
 - sf=cfg.buildSessionFactory();
 - }
 - /**
 - * 獲取session的玩法
 - * @Title: getSession
 - * @Description: TODO
 - * @param: @return
 - * @return: Session
 - * @throws
 - */
 - public static Session getSession(){
 - Session session=threadLocal.get();
 - if(null==session){
 - session=sf.openSession();
 - session.beginTransaction();
 - threadLocal.set(session);
 - }
 - return session;
 - }
 - /**
 - * 關(guān)閉Session
 - * @Title: close
 - * @Description: TODO
 - * @param:
 - * @return: void
 - * @throws
 - */
 - public static void close(){
 - Session session=threadLocal.get();
 - if(null!=session){
 - session.getTransaction().commit();
 - session.close();
 - threadLocal.remove();
 - }
 - }
 - }
 
注意事項
- 我們hibernate.cfg.xml配置文件中這個括hibernate.是可以省略
 - 為什么不開啟事務(wù)也能查詢到數(shù)據(jù)?是因為默認Hibernate存在只讀事務(wù),只讀事務(wù)是可以完成數(shù)據(jù)的讀的操作的,如果是要完成增刪改的話那么就需要讀寫事務(wù),這個時候就需要開啟事務(wù)
 
Save和Persist的區(qū)別
- Save在保存數(shù)據(jù)的時候,如果id是自增長,你給定id和不給定id都是對的。
 - Persist在保存數(shù)據(jù)的時候,如果id是自增長的,你給定id是會報錯的。
 
結(jié)語
本篇關(guān)于Hibernate的介紹就先到這里結(jié)束了,后續(xù)會出更多關(guān)于Hibernate系列更多文章,謝謝大家支持!
















 
 
 






 
 
 
 