Hibernate与Mybatis

Hibernate

一:核心API介绍

HibernateAPI一共有6个 :session,sessionFactory,transaction,query,criteria,configuration.。通过这些接口可以对持久化对象进行存取、事务控制

Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。

SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory

Transaction

Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

Configuration

Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

 

二:操作Hibernite的api

1 new一个configuration  :  Configuration定位hibernate.cfg.xml 把对象和数据库表的对应关系关联起来。

2 .buildsessionfactory  :  创建SessionFactory对象,这是二级缓存 ,这个对象中封装着很多session对象,session是我们的一级缓存。

3 .opensession  :  session的实现类是sessionimpl ,这个类里面封装了 jdbc的connection , ClassMetadata类去生成 sql语句与hbm配置文件和数据库相关联。

4 session进行save操作的时候要在上边进行session的beginTransaction,下边进行transaction的commit操作   :  transaction 接口有一个实现类叫 JDBCTransaction,hibernateBeginTranscation方法其实是调用了JDBCTransaction中的  begin 方法,他在 session中封装了jdbcContext.connection().setAutoCommit(false) , 我们的 transactionCommit只不过是让 jdbc的connection进行了commit提交的操作

 

三:配置文件解析 

1  Configration.configure.config(hibernate.cfg.xml)   这个方法把配置文件里的对象转换成了stream流对象。同时命名了一个与参数名相同的字符串。

2  Configration.doconfig(stream,resouce)  这个方法把上面的Stream流对象解析成document对象,然后继续通doconfig(document)把document对象里的子节点全部进行封装,封装的时候是通过parseSessionFactory类进行的封装。

3  Configration.buildSessionFactory()  创建一个sessionFactory工厂 会把document对象转换成 PersistentClass

4  sessionFactory.open() 创建一个会话
 

四:配置对象转sql

ClassMetadata.SingleTableEntityPersister 把 PersistentClass 对象组装成sql语句

hibernate生成的sql语句存在

AbstractEntityPersister.getSQLIdentityInsertString()

AbstractEntityPersister.postConstruct

AbstractEntityPersister.generateInsertString(boolean[] includeProperty, int j)

 

五:sql 执行

AbstractBatcher.getPreparedStatement 帮hibernate去执行sql语句

org.hibernate.jdbc.util.SQLStatementLogger 用来打印sql语句的,我们所有的sql提示都是在这里打印

 

六:Hibernate的优化(粗略总结)

1、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量时,可以使用session. clear()或者session. evict(Object) ,在处理过程中,清除全部的缓存或者清除某个对象。

2、通过使用Hibernate的一级缓存,二级缓存,查询缓存等来提高性能

3、Hibernate可以通过设置hibernate.jdbc.Batch Size等属性,对Hibernate进行优化。批量进行操作。

4、使用数据库连接池(如C3P0,DBCP等)

5、在开发环境中开启日志的debug模式,但在生产环境中要注释掉,从而提高程序的性能。

 

七:关于缓存

一级缓存:session级别

二级缓存:sessionFactory级别。类级别的缓存class-cache(以id作为缓存的key) 和 查询缓存query-cache(以查询条件作为缓存的key)。在项目中,我们一般不太实用hibernate原生的缓存机制,原因是不好管理。更多时候,我们在业务层使用自己写的cache

三级缓存:查询缓存,针对普通属性结果集的缓存,对实体对象的结果集只缓存id。对query.list起作用,query.iterate不起作用。在执行query.list()之前,调用query.setCacheable(true);

 

Mybatis

一:配置文件解析

Mybatis有两个配置文件

核心配置文件config.xml : 配置数据源连接池的信息 和 引入sql映射文件的信息

<transactionManager type="JDBC">
	<dataSource type="DBCP">
			<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
			<property name="JDBC.ConnectionURL"
				value="jdbc:mysql://localhost:3306/sqltest?characterEncoding=UTF-8" />
			<property name="JDBC.Username" value="root" />
			<property name="JDBC.Password" value="" />
			<property name="Pool.MaximumActiveConnections" value="10" />
			<property name="Pool.MaximumIdleConnections" value="5" />
			<property name="Pool.MaximumWait" value="60000" />
			<property name="Pool.LogAbandoned" value="false" />
			<property name="Pool.RemoveAbandoned" value="false" />
			<property name="Pool.RemoveAbandonedTimeout" value="50000" />
	</dataSource>
</transactionManager>

<sqlMap resource="demo/ibatis/entity/User.xml" />
	

sql映射文件sqlMap.xml : 针对具体的表配置的一些预编译语句,以及语句的输入参数和返回结果类型

 

二:spring 配置文件 + mybatis

 <beans xmlns="http://www.springframework.org/schema/beans"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:context="http://www.springframework.org/schema/context"  
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- 配置数据源 BasicDataSource -->
    <bean  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property value="root" name="username" />
		<property value="123" name="password" />
		<property value="jdbc:mysql://localhost:3306/test" name="url" />
		<property value="com.mysql.jdbc.Driver" name="driverClassName" />
		<!-- 初始化链接 -->
		<property value="10" name="initialSize" />
		<!-- 最大活动链接 -->
		<property value="100" name="maxActive" />
		<!-- 最大链接 -->
		<property value="1000" name="maxIdle" />
		<!-- 最小链接 -->
		<property value="150" name="minIdle" />
		<!-- 超时时间 -->
		<property value="100" name="maxWait" />
	</bean>
      
    <!-- 二级缓存SqlSessionFactoryBean -->
    <!-- 添加mybaits与spring的结合包mybaits-spring 1.2.0.jar
         mybaits-spring 1.2.0.jar 中要配置的是mapperLocations加载 mybatis配置文件
         ref 到 datasource -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      	<property name="dataSource" ref="dataSource"/>
      	<property name="mapperLocations" value="classpath:com.test.mapper.*.xml"/>
    </bean>
      
    <!-- mapperScannerConfig -->
    <!-- value 到 SqlSessionFactoryBean -->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
      	<property name="basePackage" value="com.test.mapper"/>
    </bean>
</beans>

 

 

Hibernate和Mybatis两种ORM框架对比

两者各自优势

MyBatis可以进行更为细致的SQL优化,可以减少查询字段。

MyBatis仅实现了SQL语句和对象的映射,需要针对具体的数据库写SQL语句,应对数据库变化能力较强,SQL语句优化较为方便。

MyBatis容易掌握,而Hibernate门槛较高。

Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。

Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。

Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳,更新操作不能指定刷新指定记录,会清空整个表,但是也可以使用第三方缓存。

Hibernate 封装性好,屏蔽了数据库差异,自动生成SQL语句,应对数据库变化能力较弱,SQL语句优化困难。

 

============待更新===========

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章