国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

hibernate筆記

2019-11-06 06:22:03
字體:
供稿:網(wǎng)友
Hibernate框架什么是ORM?(object/Relationship Mapping)對(duì)象/關(guān)系映射利用面向?qū)ο蟮乃枷刖帉懙?a href="http://m.survivalescaperooms.com/sql.asp">數(shù)據(jù)庫應(yīng)用程序最終都是把對(duì)象信息保存在關(guān)系型數(shù)據(jù)庫中,于是要編寫很多和底層數(shù)據(jù)庫相關(guān)的SQL語句。ORM主要解決對(duì)象-關(guān)系的映射:面向?qū)ο蟮母拍?          面向關(guān)系的概念類 表對(duì)象 表的行(記錄)屬性 表的列(字段)ORM思想:將關(guān)系數(shù)據(jù)庫中表的記錄映射成為對(duì)象,以對(duì)象的形式展現(xiàn),程序員可以把對(duì)數(shù)據(jù)庫的操作轉(zhuǎn)化為對(duì)對(duì)象的操作。ORM采用元數(shù)據(jù)來描述對(duì)象-關(guān)系映射細(xì)節(jié)。元數(shù)據(jù)通常采用xml格式,并且存放在專門的對(duì)象-關(guān)系映射文件中。Hibernate與Jdbc代碼比較://Hibernate實(shí)現(xiàn)public void save(session sess,Message m){sess.save(m);}//jdbc實(shí)現(xiàn)public void save(Connection conn,Message m){PReparedStatement ps=null;String sql="insert into message values(?,?)";try{ps=conn.prepareStatement(sql);ps.setString(1,m.getTitle());ps.setString(2,getContent());ps.execute();}catch(SQLException e){e.printStackTrace();}finall{if(ps!=null)try{ps.close();}catch(SQLException e){e.printStackTrace();}}}什么是Hibernate?Hibernate是java領(lǐng)域的一款開源的ORM框架技術(shù)。Hibernate對(duì)JDBC進(jìn)行了非常輕量的對(duì)象封裝。其他主流的ORM框架技術(shù):1.MyBatis:前身是著名的iBatis2.Toplink:后被Oracle收購,并重新包裝為Oracle As Toplink3.EJB:本身是JAVAEE的規(guī)范編寫第一個(gè)Hibernate的例子:   導(dǎo)入Hibernate必須的jar包:hibernate-release-4.2.4.Final/lib/required   導(dǎo)入MySQL的jdbc驅(qū)動(dòng):mysql-connector-java-5.1.7-bin.jar   導(dǎo)入Junit4的jar包:junit-4.10.jar      1.創(chuàng)建Hibernate的配置文件:hibernate.cfg.xml   hibernate從其配置文件中讀取和數(shù)據(jù)庫有關(guān)的信息,這個(gè)文件位于應(yīng)用的classpath下。   <property name="connection.username">root</property><property name="connection.passWord"></property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><propertyname="connection.url">jdbc.mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property> 常用配置:屬性名稱:hibernate。show_sql  是否把hibernate運(yùn)行時(shí)的SQL語句輸出到控制臺(tái),編碼階段便于測(cè)試 hibernate.format_sql  輸出到控制臺(tái)的SQL語句是否進(jìn)行排版,便于閱讀,建議設(shè)置為true hbm2dd.auto  可以幫助有java生成數(shù)據(jù)庫腳本,進(jìn)而生成具體的表結(jié)構(gòu)。create|update|createdrop|validate  hibernate.default_schema  默認(rèn)的數(shù)據(jù)庫 hibernate.dialect  配置Hibernate數(shù)據(jù)庫方言,Hibernate可針對(duì)特殊的數(shù)據(jù)庫進(jìn)行優(yōu)化            2.創(chuàng)建持久化java類提供一個(gè)無參的構(gòu)造器:使hibernate可以使用Constructor.newinstance()來實(shí)例化持久類。提供一個(gè)標(biāo)識(shí)屬性:通常映射為數(shù)據(jù)庫表的主鍵字段,如果沒有該屬性,一些功能將不起作用,如Session.saveOrUpdate()。為類的持久化類字段聲明訪問方法(get/set):hibernate對(duì)Javabean風(fēng)格屬性實(shí)行持久化。使用非final類:在運(yùn)行時(shí)生成代理是hibernate的一個(gè)重要的功能 ,如果持久化類沒有實(shí)現(xiàn)任何接口,hibernate使用CGLIB生成代理,如果使用final類,則無法生成CGLIB代理。重寫eqauls和hashCode方法:如果需要把持久化類的實(shí)例放到set中(當(dāng)需要進(jìn)行關(guān)聯(lián)映射時(shí)),則應(yīng)該重謝這連個(gè)方法。      3.創(chuàng)建對(duì)象-關(guān)系映射文件*.hbm.xmlhibernate采用xml格式的文件來指定隊(duì)形和關(guān)系數(shù)據(jù)之間的映射,在運(yùn)行時(shí)hibernate將根據(jù)這個(gè)映射文件來生成各種SQL語句。      使用Junit進(jìn)行測(cè)試:@Test:測(cè)試方法  @Before:初始化方法  @After:釋放資源         4.通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼:   //1.創(chuàng)建一個(gè)SessionFactorySessionFactory sessionFactory=null;//1)創(chuàng)建Configuration對(duì)象,對(duì)應(yīng)hibernate的基本信息和對(duì)象關(guān)系映射信息Configuration configuration=new Configuration().configure();//4.0之前這樣創(chuàng)建// sessionFactory=new configuration.buildSessionFactory();//2)創(chuàng)建一個(gè)ServiceRegistry對(duì)象;hibernate4.x新添加的對(duì)象//hibernate的任何配置和服務(wù)都需要在該對(duì)象中注冊(cè)后才能有效ServiceRegistry serviceRegistry=new ServiceRegistry().applySettings(configuration.getProperties()).build();//3)sessionFactory=configuration.buildSessionFactory(serviceRegistry);//2.創(chuàng)建一個(gè)Session對(duì)象sessionFactory session=sessionFactory.openSession();//3.開啟事務(wù)Transaction transaction=new Transaction();//4.執(zhí)行保存操作News news=new News("java","ATGUIGU",new Date(new java.util.Date().getTime()));session.save(news);//5.提交事務(wù)transaction.commit();//6.關(guān)閉Sessionsession.close();//7.關(guān)閉SessionFactory對(duì)象sessionFactory.close();   Configuration類:Configuration類負(fù)責(zé)管理Hibernate的配置信息,包括如下內(nèi)容:--hibernate運(yùn)行的底層信息:數(shù)據(jù)庫的URL,用戶名,密碼,JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫dialect,數(shù)據(jù)庫連接池等(對(duì)應(yīng).cfg.xml文件)--持久化類與數(shù)據(jù)表的映射關(guān)系(.hbm.xml文件)創(chuàng)建Configuration的兩種方式:--屬性文件(hibernate.properties)   Configuration cfg=new Configuration();--XML文件(hibernate.cfg.xml)  Configuration cfg=new Configuration().configure();--Configuration的configure方法還支持帶參數(shù)的訪問: File file=new File("simpleit.xml");  Configuration cfg=new Configuration().configure(file);SessionFactory接口:針對(duì)單個(gè)數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像,是線程安全的。SessionFactory對(duì)象一旦構(gòu)造完畢,即被賦予特定的配置信息。SessionFactory是生成Session的工廠。構(gòu)造SessionFactory很消耗資源,一般情況下一個(gè)應(yīng)用中只初始化一個(gè)SessionFactory對(duì)象。Hibernate新增了一個(gè)ServiceRegistry接口,所有基于Hibernate的配置或者服務(wù)器都必須統(tǒng)一向這個(gè)ServiceRegistry注冊(cè)才能生效。Hibernate4中創(chuàng)建SessionFactory的步驟://1.創(chuàng)建configuration對(duì)象Configuration configuration=new Configuration().configure();//2.創(chuàng)建ServiceReigstryServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();//3.創(chuàng)建SessionFactory對(duì)象SessionFactory sessionFactory=configuration.buildSessionFactory(serviceRegistry);Session接口:session可以理解為操作數(shù)據(jù)庫的對(duì)象,相當(dāng)于JDBC中的Connectionsession與connection是多對(duì)一的關(guān)系,每個(gè)session都有一個(gè)與之對(duì)應(yīng)的connection,一個(gè)connection不同時(shí)刻可以供多個(gè)session使用。持久化類與Session關(guān)聯(lián)起來后就具有了持久化的能力。Session類的方法:--取得持久化對(duì)象的方法:get(),load()--持久化對(duì)象都得保存,更新和刪除:save(),update(),saveOrUpdate(),delete()--開啟事務(wù):beginTransaction()--管理Session的方法:isOpen(),flush(),clear(),evict(),close()等把對(duì)象保存在關(guān)系數(shù)據(jù)庫中需要調(diào)用session的各種方法:如增刪改查:save(),update(),delete(),createQuery().      如何獲得session對(duì)象?1.openSession2.getCurrentSession如果使用getCurrentSession需要在hibernate.cfg.xml文件中進(jìn)行配置:  如果是本地事務(wù)(jdbc事務(wù))  <property name="hibernate.current_session_context_class">thread</property>  如果是全局事務(wù)(jta事務(wù))   <property name="hibernate.current_session_context_class">jta</property>     openSession與getCurrentSession的區(qū)別:   1.getCurrentSession在事務(wù)提交或者回滾折后會(huì)自動(dòng)關(guān)閉,而openSession需要手動(dòng)關(guān)閉,如果沒有關(guān)閉,會(huì)導(dǎo)致連接池溢出。   2.openSession每次創(chuàng)建新的session對(duì)象,getCurrentSession使用現(xiàn)有的session對(duì)象         Transaction簡(jiǎn)介:代表一次原子操作,它具有數(shù)據(jù)庫事務(wù)的概念。所有持久層都應(yīng)該在事務(wù)管理下進(jìn)行,即使是只讀操作。Transaction ts=session.beginTransaction();常用方法:--commit():提交相關(guān)聯(lián)的session實(shí)例--rollback():撤銷事務(wù)操作--wasCommitted:檢查事務(wù)是否提交hibernate對(duì)數(shù)據(jù)庫的操作都是封裝在事務(wù)中,并且默認(rèn)是非自動(dòng)提交方式。所以用session保存對(duì)象時(shí),如果不開啟事務(wù),并且手工提交事務(wù),對(duì)象并不會(huì)真正博愛村在數(shù)據(jù)庫中。如果想讓hibernate像jdbc那樣自動(dòng)提交事務(wù),必須調(diào)用session對(duì)象的daWork()方法,獲得jdbc的connection后,設(shè)置其為自動(dòng)提交事務(wù)模式(通常不推薦這樣做)               hbm配置文件常用設(shè)置:     <hibernate-mapping          schema="shcemaName"  catalog="catalogName"  default-cascade="cascade_style"   //級(jí)聯(lián)風(fēng)格  defalult-access="field|property|ClassName"  //訪問策略  default-lazy="true|fault"  //加載策略  package="packagename"      //包名  />   <class     name="ClassName" table="tableName" batch-size="N" where="condition" entity-name="EntityName" />     <id      name="propertyName" type="typename" column="column_name" length="length" <geneator class="generatorClass"/> </id> 在hibernate中使用c3p0數(shù)據(jù)源:1.導(dǎo)入jar包:hibernate-release-4.2.4.Final/lib/optional/c2p0/*.jar2.加入配置  hibernate.c3p0.max_size :數(shù)據(jù)庫連接池最大連接數(shù)  hibernate.c3p0.min_size :數(shù)據(jù)庫連接池最小連接數(shù)  hibernate.c3p0.acquire_increament :當(dāng)數(shù)據(jù)庫連接池中的連接耗盡時(shí),同一時(shí)刻獲取多少個(gè)數(shù)據(jù)庫連接  hibernate。c3p0.timeout: 數(shù)據(jù)庫連接池中連接對(duì)象在多長(zhǎng)時(shí)間沒有使用過后,就應(yīng)該被銷毀  hibernate.c3p0.idle_test_period :表示連接池檢測(cè)線程多長(zhǎng)時(shí)間檢測(cè)一次內(nèi)的所有鏈接對(duì)象是否超時(shí),連接池本身不會(huì)把自己從連接池中移除,而是專門有一個(gè)線程按照一定的時(shí)間間隔來做這件事,這個(gè)線程通過比較連接對(duì)象最后一次唄使用和當(dāng)前的時(shí)間差和timeout作對(duì)比,進(jìn)而決定是否銷毀這個(gè)連接對(duì)象。hibernate.c3p0.max_statements: 緩存statement對(duì)象的數(shù)量 Hibernate單表操作1.單一主鍵assigned,由java應(yīng)用程序負(fù)責(zé)生成(手工賦值)native,由底層數(shù)據(jù)庫自動(dòng)生成標(biāo)識(shí)符,如果是Mysql就是increment,如果是Oracle就是sequence2.基本類型映射類型     java類型         標(biāo)準(zhǔn)SQL類型        描述date java.util.Date 或        DATE           代表日期:yy-MM-dd java.sql.Date  time    java.util.Date或          TIME               代表時(shí)間:hh:mi:ssjava.sql.Time timestamp    java.util.Date或  java.sql.Timestamp   TIMESTAMP      代表時(shí)間和日期:yyyymmddhhmiss Calendar     java.util.Calendar    TIMESTAMP      代表時(shí)間和日期:yyyymmddhhmiss Calendar_date  java.util.Calendar   DATE           代表日期:yyyy-MM-dd3.對(duì)象類型映射類性 java類型 標(biāo)準(zhǔn)SQL類型 MYSQL類型Oracle類型binary byte[] VARCHAR(或BLOB) BLOBBLOBtext java.lang.String  CLOB TEXTCLOBclob java.sql.ClobCLOB TEXTCLOBblob java.sql.BlobBLOB BLOBBLOBMysql不支持標(biāo)準(zhǔn)SQL的CLOB類型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT類型來表示長(zhǎng)度超過255的長(zhǎng)文本數(shù)據(jù)。4.組件屬性實(shí)體中某個(gè)屬性屬于用戶自定義的類的對(duì)象。<component name="address" class="Adress">  <property name="postcode" column="POSTCODE"></property>  <property name="phone" column="PHONE"></property>  <property name="address" column="ADRESS"></property>  </component>      單表操作的常用方法:sava,delete,update,get與loadget與load的區(qū)別:在不考慮緩存的情況下,get方法會(huì)在調(diào)用之后立即向數(shù)據(jù)庫發(fā)出sql語句,返回持久化對(duì)象。load方法會(huì)在調(diào)用之后返回一個(gè)代理對(duì)象。該代理對(duì)象只保存實(shí)體對(duì)象的id,直到使用對(duì)象的費(fèi)主鍵屬性時(shí)才會(huì)發(fā)出sql語句。           映射類型:一對(duì)多:在數(shù)據(jù)庫中,可以通過添加外鍵的關(guān)聯(lián),表現(xiàn)一對(duì)多的關(guān)系。通過在一方有多方的集合表現(xiàn),即在“一”的一端使用<set>元素表示持有“多”的一端的對(duì)象。多對(duì)一一對(duì)一                  
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛南县| 韶关市| 来凤县| 门头沟区| 罗甸县| 邢台市| 双江| 金平| 前郭尔| 拉孜县| 贵阳市| 格尔木市| 卢湾区| 合阳县| 台中县| 蓝田县| 同心县| 平江县| 秦皇岛市| 海丰县| 海兴县| 河源市| 长岛县| 沁源县| 龙里县| 南城县| 富蕴县| 松原市| 文登市| 晋城| 冷水江市| 香格里拉县| 包头市| 贺兰县| 买车| 磐石市| 平陆县| 汤阴县| 咸丰县| 故城县| 青海省|