关于hibernate的一些小记

本文详细对比了Hibernate和MyBatis两种持久层框架的使用特点。Hibernate通过配置文件或注解实现对象关系映射,支持复杂视图查询及多表关联;MyBatis则以配置文件为主,适合编写复杂SQL,提供动态SQL支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近接触的老项目,总是爱用hibernate,维护起来觉得很麻烦,这里随便总结一下hibernate的特点。

首先:

1.hibernate可以直接对java实例操作,达到数据库的增删改查作用,但是这个实例,只对应一个表。

2.hibernate可以通过编写hql语句,达成自定义SQL查询,但是返回结果,可能是一个map,而无法直接对应成JAVA实例,要自己组装查询结果。

3.hibernate可以通过创建配置文件,配置文件里,定义一个复杂的JAVA实例Class,对应数据库中一个复杂的视图table,并指定在这个复杂视图中,多个表之间的one-to-one, one-to-many, many-to-many关系,和指定哪个字段作为关联条件。而在复杂的java实例中,根据一对一还是一对多的关系,创建其他表的实例作为成员变量,接收其他表的查询结果。既查询一次这个复杂的java实例,就等于关联查询了好多张表。

该文件的命名,一般以XXXX.hbm.xml结尾。

<?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,通过注解的方式,来完成数据库的增删改查。使用这个方式,类的成员属性,都需要加上注解,标识这个成员属性,对应表的哪个字段,是否是主键,是否是关联条件。同样的,实体类新增了成员变量,而改变量不对应表的字段时,也要加上注解,标识该字段与表无关。

在多表关联查询的时候,父类查询结果,持有子类查询结果时,还要在父类中还需要持有子查询类的实体类对象,并添加注解,标识改子查询是one-to-one还是one-to-many类型,如果是one-to-many,就需要持有子表实体类的集合作为成员变量。

 

以上,是我在项目中,遇到的hibernate几种用法。

下面,我们来说一下mybatis,实际上mybatis主要有两种用法:

1.基于注解的,在dao文件中,定义SQL方法,而在每个自定义的SQL方法上,编写mybatis的注解,来对数据库进行操作。但是缺点是多表关联查询,需要编写的SQL比较复杂,使用注解的方式,会更复杂。所以我们一般不用。

2.基于配置文件,基于配置文件的mybatis用法比较常见,有点是,适合编写复杂,超长的sql语句,而且配套的动态sql子句,用起来很好用。

转载于:https://my.oschina.net/xiaoyoung/blog/3013175

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值