最近接觸的老項目,老是愛用hibernate,維護起來以爲很麻煩,這裏隨便總結一下hibernate的特色。java
首先:sql
1.hibernate能夠直接對java實例操做,達到數據庫的增刪改查做用,可是這個實例,只對應一個表。數據庫
2.hibernate能夠經過編寫hql語句,達成自定義SQL查詢,可是返回結果,多是一個map,而沒法直接對應成JAVA實例,要本身組裝查詢結果。mybatis
3.hibernate能夠經過建立配置文件,配置文件裏,定義一個複雜的JAVA實例Class,對應數據庫中一個複雜的視圖table,並指定在這個複雜視圖中,多個表之間的one-to-one, one-to-many, many-to-many關係,和指定哪一個字段做爲關聯條件。而在複雜的java實例中,根據一對一仍是一對多的關係,建立其餘表的實例做爲成員變量,接收其餘表的查詢結果。既查詢一次這個複雜的java實例,就等於關聯查詢了好多張表。app
該文件的命名,通常以XXXX.hbm.xml結尾。ide
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping auto-import="false"> <class name="com.nstc.cpm.biz.acm.Account" table="V_CPM_BKUNIT_ACCOUNT" lazy="true"> <id name="id" type="java.lang.Integer"> <column name="ACCOUNT_ID" /> <generator class="sequence"> <param name="sequence">S_CPM_BOOK_UNIT</param> </generator> </id> <discriminator column="ACC_CLASS" /> <version name="version" type="java.lang.Integer"> <column name="VERSION_COLUMN" /> </version> <many-to-one name="customer" class="com.nstc.cpm.biz.acm.Customer" fetch="join" outer-join="true"> <column name="CUST_ID" /> </many-to-one> <many-to-one name="subject" class="com.nstc.cpm.biz.acm.Subject" fetch="join"> <column name="SUBJECT_ID" length="8" not-null="true" /> </many-to-one> <many-to-one name="currency" class="com.nstc.cpm.biz.model.BCurrency" fetch="select" update="false" insert="false"> <column name="CUR_CODE" not-null="true" /> </many-to-one> <property name="number" type="java.lang.String" unique="true"> <column name="ACCOUNT_NO" length="32" not-null="true" /> </property> <one-to-one name="accIntr" class="com.nstc.cpm.biz.acm.DefaultAccIntr" property-ref="accountId"/> <many-to-one name="type" class="com.nstc.cpm.biz.acm.AccountType" fetch="select" not-null="true"> <column name="TYPE_ID" length="8" /> </many-to-one> <many-to-one name="bizType" class="com.nstc.cpm.biz.model.BizType" fetch="select"> <column name="BTY_ID" length="6" /> </many-to-one> <many-to-one name="smartBizType" class="com.nstc.cpm.biz.model.SmartBizType" fetch="select"> <column name="SMART_BTY_ID" /> </many-to-one> <property name="name" type="java.lang.String"> <column name="ACCOUNT_NAME" length="128" /> </property> <property name="openDate" type="java.util.Date"> <column name="OPEN_DATE" length="7" /> </property> <property name="endDate" type="java.util.Date"> <column name="END_DATE" length="7" /> </property> <property name="interBranchFlag" type="java.lang.Integer"> <column name="INTER_BRANCH_FLAG" /> </property> <property name="currencyNo" type="java.lang.String"> <column name="CUR_CODE" length="32" not-null="true" /> </property> <!-- MODIFY BY ZHUQW FOR ZMJT-388 START 20170815 --> <many-to-one name="branch" class="com.nstc.cpm.biz.model.Branch" fetch="join"> <column name="BRANCH_NO" length="8" not-null="true" /> </many-to-one> <!-- MODIFY BY ZHUQW FOR ZMJT-388 END 20170815 --> <property name="balanceDir" type="java.lang.Integer"> <column name="BALANCE_DIR" /> </property> <property name="state" type="java.lang.Integer"> <column name="ACCOUNT_STATE" /> </property> <property name="clearDate" type="java.util.Date"> <column name="CLEAR_DATE"/> </property> <property name="floorAmount" type="java.lang.Double"> <column name="FLOOR_AMOUNT" /> </property> <property name="sourceId" type="java.lang.String"> <column name="SOURCE_MARK" length="32" /> </property> <property name="thirdCustomerId" type="java.lang.Integer"> <column name="THIRD_CUSTOM_ID" /> </property> <property name="initBalance" type="java.lang.Double"> <column name="INIT_BALANCE"/> </property> <property name="sleepState" type="java.lang.Integer"> <column name="SLEEP_STATE"/> </property> <property name="accTxDate" type="java.util.Date"> <column name="ACCOUNT_TX_DATE"/> </property> <property name="sleepSDate" type="java.util.Date"> <column name="SLEEP_SDATE"/> </property> <property name="sleepEDate" type="java.util.Date"> <column name="SLEEP_EDATE"/> </property> <set name="intrSbUnits" inverse="true"> <key> <column name="CPM_ACCOUNT_ID" not-null="true" /> </key> <one-to-many class="com.nstc.cpm.biz.acm.StandingBookUnit" /> </set> <subclass name="com.nstc.cpm.biz.acm.CustomerAccount" discriminator-value="CustomerAccount"> <subclass name="com.nstc.cpm.biz.acm.EntitySettlementAccount" discriminator-value="EntitySettlementAccount"> <subclass name="com.nstc.cpm.biz.acm.DemandDepositAccount" discriminator-value="DemandDepositAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.VirtualSettlementAccount" discriminator-value="VirtualSettlementAccount"> <subclass name="com.nstc.cpm.biz.acm.CustLinkageAccount" discriminator-value="CustLinkageAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.DepositAccount" discriminator-value="DepositAccount"> <subclass name="com.nstc.cpm.biz.acm.FixedDepositAccount" discriminator-value="FixedDepositAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.CallDepositAccount" discriminator-value="CallDepositAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.MarginDepositAccount" discriminator-value="MarginDepositAccount"> <subclass name="com.nstc.cpm.biz.acm.MarginDemandDepositAccount" discriminator-value="MarginDemandDepositAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.MarginFixedDepositAccount" discriminator-value="MarginFixedDepositAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.LoanAccount" discriminator-value="LoanAccount"> <subclass name="com.nstc.cpm.biz.acm.CommonLoanAccount" discriminator-value="CommonLoanAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.SyndicatedLoanAccount" discriminator-value="SyndicatedLoanAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.BankAccount" discriminator-value="BankAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.InsideAccountingAccount" discriminator-value="InsideAccountingAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <subclass name="com.nstc.cpm.biz.acm.OffSheetAccountingAccount" discriminator-value="OffSheetAccountingAccount"> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </subclass> <sql-delete> delete from CPM_BOOK_UNIT a where a.ACCOUNT_ID=? AND A.VERSION_COLUMN = ? </sql-delete> </class> </hibernate-mapping>
4.hibernate基於JPA,經過註解的方式,來完成數據庫的增刪改查。使用這個方式,類的成員屬性,都須要加上註解,標識這個成員屬性,對應表的哪一個字段,是不是主鍵,是不是關聯條件。一樣的,實體類新增了成員變量,而改變量不對應表的字段時,也要加上註解,標識該字段與表無關。fetch
在多表關聯查詢的時候,父類查詢結果,持有子類查詢結果時,還要在父類中還須要持有子查詢類的實體類對象,並添加註解,標識改子查詢是one-to-one仍是one-to-many類型,若是是one-to-many,就須要持有子表實體類的集合做爲成員變量。.net
以上,是我在項目中,遇到的hibernate幾種用法。hibernate
下面,咱們來講一下mybatis,實際上mybatis主要有兩種用法:code
1.基於註解的,在dao文件中,定義SQL方法,而在每一個自定義的SQL方法上,編寫mybatis的註解,來對數據庫進行操做。可是缺點是多表關聯查詢,須要編寫的SQL比較複雜,使用註解的方式,會更復雜。因此咱們通常不用。
2.基於配置文件,基於配置文件的mybatis用法比較常見,有點是,適合編寫複雜,超長的sql語句,並且配套的動態sql子句,用起來很好用。