一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 連Hibernate技術都不清楚,你敢說你自己會ORM框架?

連Hibernate技術都不清楚,你敢說你自己會ORM框架?

2020-11-25 22:50淺羽的IT小屋淺羽Eric Java教程

ORM框架不是一個新話題,它已經伴隨我們很多年了。它提供了概念性的、易于理解的數據模型,將數據庫中的表和內存中的對象建立了很好的映射關系。在Java中常用的ORM框架主要有兩個:Hibernate和iBatis。本篇文章主要介紹Hibernate的

連Hibernate技術都不清楚,你敢說你自己會ORM框架?

 前言

ORM框架不是一個新話題,它已經伴隨我們很多年了。它提供了概念性的、易于理解的數據模型,將數據庫中的表和內存中的對象建立了很好的映射關系。在Java中常用的ORM框架主要有兩個:Hibernate和iBatis。本篇文章主要介紹Hibernate的使用方法,后續會出介紹iBatis的文章。

傳統的MVC開發模式

  1. ?M:Model包括pojo、service、dao。
  2. V:View 包括jsp、html、模塊引擎。
  3. C:Controll 包括我們動態網絡資源的技術:Servlet。?

SSH框架在開發中的作用

  • ?S:Struts/SpringMVC: 實際上解決的是我們的控制器的問題(簡單的可以認為是Servlet的封裝)。
  • Spring: 整合其余的第三方框架,就是為 Srvice 層提供事務。
  • Hibernate:其實就是DAO層的解決方案。?

同時可以看下其余框架(SSM、SSS)的含義:

連Hibernate技術都不清楚,你敢說你自己會ORM框架?

Hibernate是什么

1.Hibernate是一個非侵入式ORMapping框架

  • 非侵入式框架:我們在使用這個框架的時候,不需要繼承或者實現這個框架中的類或者接口,這種類型的框架就叫做非侵入式的框架,非侵入式的框架在使用的時候更好的和原有的框架實現了解耦
  • 侵入式框架:我們在使用這個框架的時候,需要繼承或者實現這個框架中的某些類或者接口,這種框架叫做侵入式框架

2.ORMapping解析

  • O:Object
  • R:Relation
  • M:Mapping 映射
  • a.Hibernate能夠將Java對象通過映射的關系映射到數據庫
  • b.Hibernate能夠將數據庫的數據通過映射關系映射到Java對象

Hibernate就是能夠通過操作Java對象來達到操作數據庫的一門技術。

Hibernate能干什么

簡單的說:實現數據庫的所有操作(CRUD),是原有DAO層的一個解決方案,也是一個替代品。

Hibernate的簡單使用

「簡單使用:」

導包,將下載下來的required+jpa相關的包放到一個文件里面

在src下面創建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> 

        <!--驅動程序--> 

        <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框架當前 你要生成那個數據庫下的SQL語句--> 

        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> 

        <!--是否自動創建表  create:表示的是每一次 都從新創建  update:表示的是 如果有就不創建 沒有就創建--> 

        <property name="hibernate.hbm2ddl.auto">update</property> 

         

         

        <!--配置映射文件--> 

        <mapping resource="com/qy/helloworld/User.hbm.xml"/> 

         

    </session-factory> 

  

</hibernate-configuration> 

創建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"); 

  //創建SessionFactory對象 

  SessionFactory sf=cfg.buildSessionFactory(); 

  //創建會話 

  Session session=sf.openSession(); 

  //開啟事務 

  session.beginTransaction(); 

  //操作對象 

   

  User user=new User(1,"小羽","110"); 

   

  //開始操作 

  session.save(user); 

   

  //進行事務的提交 

   

  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> 

    <!--配置我們數據庫的連接信息的--> 

    <session-factory> 

        <!--驅動程序--> 

        <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框架當前 你要生成那個數據庫下的SQL語句--> 

        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 

        <!--是否自動創建表  create:表示的是每一次 都從新創建  update:表示的是 如果有就不創建 沒有就創建--> 

        <!--create經常用在測試的環境中--> 

        <property name="hbm2ddl.auto">update</property> 

        <!--執行的時候將SQL語句展示出來--> 

        <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"

 

    <!--下面配置的是映射關系   將JAVA對象 直接映射到數據庫的表里面去 

         name:表示的是類的名字 

         table:表示的是當前的這個JAVA類 對應的數據庫中的表的名字做是什么 這個名字是可以隨便寫的 但是一般要見名之意 

         lazy:當前這個類在進行查詢操作的時候  要進行懶加載 

    --> 

 <class name="User" table="t_user"  lazy="true"

  

     <!-- 

         id:表示的是主鍵的映射 

         name:類中主鍵的名字 

         column:主鍵對應的表的字段 

         length:確定當前字段的最大長度 

         type:類型(寫的是JAVA中數據類型的全路徑) 

          

                  注意:類型可以省略:省略之后的類型就和實體中的類型保持一致 

              length:可以省略  默認就是int的最大范圍   

              column:這個也可以省略省略之后 默認和類中保持一致   

          

     --> 

  <id name="uId"

      <!--主鍵自增長 

       

                   上面的重點記住 

          identity:自增長這個表示的意思是:會根據底層的數據庫選擇自增長的策略 

          assigned:自己設置這個id的值 

          foreign:這個表示的是要將別人的主鍵來作為自己的主鍵 

          uuid:通過uuid來生成id主鍵  

           

                  下面的了解 

          increment:遞增(這個跟數據庫是有關系的) 

          native:是遞增(跟底層的數據庫的方言有關) 

          sequence:這個表示的是通過表的序列來完成下一個id的生成(Oracle數據庫) 

        

      --> 

   <generator class="identity"/> 

  </id> 

   

  <!--下面映射的是普通的屬性 

       length:字符串的長度 

       not-null:當前字段不能為空 

       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的實現

添加數據 

    session.save(user);   

  session.persist(user); 

 

修改數據 

        session.beginTransaction();  

  //查詢數據(積極的加載) 

  User user=session.get(User.class,1); 

  //下面支持的是懶加載 

  user.setUserName("xxxxx"); 

  user.setUserPwd("yyyyy"); 

  session.getTransaction().commit(); 

 

數據查詢 

        //查詢數據(積極的加載) 

  User user=session.get(User.class,1); 

  //下面支持的是懶加載 

  User user2=session.load(User.class,1);  

 

   刪除數據 

 

       //查詢數據(積極的加載) 

  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; 

 } 

  

 /** 

  * 關閉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(); 

  } 

 } 

注意事項

  1. 我們hibernate.cfg.xml配置文件中這個括hibernate.是可以省略
  2. 為什么不開啟事務也能查詢到數據?是因為默認Hibernate存在只讀事務,只讀事務是可以完成數據的讀的操作的,如果是要完成增刪改的話那么就需要讀寫事務,這個時候就需要開啟事務

Save和Persist的區別

  • Save在保存數據的時候,如果id是自增長,你給定id和不給定id都是對的。
  • Persist在保存數據的時候,如果id是自增長的,你給定id是會報錯的。

結語

本篇關于Hibernate的介紹就先到這里結束了,后續會出更多關于Hibernate系列更多文章,謝謝大家支持!

原文地址:https://mp.weixin.qq.com/s/25xY2fl4rv89alvmaUrxOw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费黄色片在线观看 | 激情综合色啪啪小说 | 日韩美女强理论片 | 精品第一国产综合精品蜜芽 | 欧美一级视频免费观看 | 91网红福利精品区一区二 | 亚洲国产精品无码中文字满 | 男人边吃奶边做好爽视频免费 | 麻豆视频网 | 大团圆免费阅读全文 | 91免费永久在线地址 | 女教师的一级毛片 | 国产成人h综合亚洲欧美在线 | 99精品视频免费 | 亚洲成人贴图 | 国产成人久视频免费 | 日本www色视频成人免费 | 亚洲 日韩 在线 国产 视频 | 翁息肉小说老扒 | 五月丁开婷婷 | 性欧美高清强烈性视频 | 精品久久久久久久久久久久久久久 | 91理论片午午伦夜理片久久 | 男生操女生动态图 | 男人边吃奶边做好爽视频免费 | 24adc年龄18岁欢迎大驾光临 | 四虎成人免费 | 91在线精品视频 | 亚洲狠狠婷婷综合久久蜜桃 | 99热在线获取最新地址 | 日本黄视频在线播放 | xxx中国bbbwww | 娇妻终于接受了3p的调教 | 成人免费网站视频ww | 欧美作爱福利免费观看视频 | 亚洲 欧美 中文 日韩欧美 | 啪啪免费入口网站 | 非洲黑人gay巨大 | 高清国产激情视频在线观看 | 亚洲成人贴图 | 日韩欧美一区二区三区免费观看 |