Hibernate
一:核心API介绍
Hibernate的API一共有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语句优化困难。
============待更新===========