一、序言
最近一直用mybatis做开发,以前用过hibernate,能感受到一些它们在使用上的区别,不过总想抽出时间来好好比较比较弄弄清楚它们各自的优劣,以便更好进行选择和深入的了解。
网上也看了很多资料,结合自己的使用体会,粗率地概括和总结了一下,以供大家参考。
二、具体运用上的不同
1、所需的jar包
Mybatis:只需要3个(mybatis-3.1.1.jar,mybatis-3.1.1-javadoc.jar,mybatis-3.1.1-sources.jar)
Hibernate:根据功能不同大概需要十几个
2、映射关系
Mybatis:实体类与sql之间的映射
Hibernate:实体类与数据库之间隐射
3、配置文件
Student:
属性:intid,Stringname,Stringpassword;
方法配置:
getStudentByName;//通过name查找
getStudentById//通过id查找
insertStudent//添加Student
updateStudent//更改Student
deleteStudent//通过id删除Student
deleteStudentById//通过name伤处Student
selectStudentmohu//通过name模糊查询
Mybatis:
总配置文件:mybatisConfig.xml
<configuration>
<typeAliases>
<typeAliasalias="Student"type="com.niit.model.Student"/>
</typeAliases>
<environmentsdefault="development">
<environmentid="development">
<transactionManagertype="JDBC"/>
<dataSourcetype="POOLED">
<propertyname="driver"value="com.mysql.jdbc.Driver"/>
<propertyname="url"value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<propertyname="username"value="root"/>
<propertyname="password"value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapperresource="com/niit/model/StudentMap.xml"/>
</mappers>
</configuration>
l实体类映射文件:StudentMap.xml(一个或多个)
<mappernamespace="com.niit.model.StudentMap">
<selectid="getStudentByName"resultType="Student"
parameterType="string">
select*fromstudentwherename=#{name}
</select>
<selectid="getStudentById"resultType="Student"parameterType="int">
select*fromstudentwhereid=#{id}
</select>
<insertid="insertStudent"parameterType="Student">
insertintostudent(id,name,password)value(#{id},#{name},#{password})
</insert>
<updateid="updateStudent"parameterType="Student">
updatestudentsetname=#{name},password=#{password}whereid=#{id}
</update>
<deleteid="deleteStudent"parameterType="String">
deletefromstudentwherename=#{name}
</delete>
<deleteid="deleteStudentById"parameterType="int">
deletefromstudentwhereid=#{id}
</delete>
<selectid="selectStudentmohu"parameterType="String"
resultType="Student">
select*fromstudentwherenamelike"%"#{name}"%"
</select>
</mapper>
Hibernate:
l总配置文件:hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<propertyname="connection.username">root</property>
<propertyname="connection.url">jdbc:mysql://127.0.0.1:3306/sample</property>
<propertyname="dialect">org.hibernate.dialect.MySQLDialect</property>
<propertyname="connection.password">123</property>
<propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="hibernate.show_sql">True</property>
<mappingresource="com/niit/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
l实体类配置文件:Student.hbm.xml(一个或多个)
<hibernate-mappingpackage="com.niit.model.">
<classname="Student"table="student">
<idname="id"column="id"type="int"><generatorclass="identity"/></id>
<propertyname="name"type="java.lang.String">
<columnname="name"length="20"not-null="true"/>
</property>
<propertyname="password"type="java.lang.String">
<columnname="password"length="20"not-null="true"/>
</property>
</class>
</hibernate-mapping>
4、基本用法(增删改查模糊)
Mybatis:
@Test
lselectbyname
publicvoidtest()throwsIOException
{
Stringresource="mybatisConfig.xml";
Readerreader=Resources.getResourceAsReader(resource);
SqlSessionFactorysessionFactory=newSqlSessionFactoryBuilder().build(reader);
SqlSessionsession=sessionFactory.openSession();
session.selectOne("com.niit.model.StudentMap.getStudentByName","b");
}
lselectbyid
session.selectOne("com.niit.model.StudentMap.getStudentById",2);
linsert
session.insert("com.niit.model.StudentMap.insertStudent",student);
l//update
session.insert("com.niit.model.StudentMap.updateStudent",student);
l//deletebyname
session.insert("com.niit.model.StudentMap.deleteStudent","wl");
l//deletebyid
session.insert("com.niit.model.StudentMap.deleteStudentById",3);
l//selectmuhu(模糊查询)
session.selectList("com.niit.model.StudentMap.selectStudentmohu","b");
Hibernate:
l//selectbyid
Configurationcfg=newConfiguration().configure();
SessionFactorysf=cfg.buildSessionFactory();
Sessionsession=sf.openSession();
Session.get(Student.class,id);
l//selectbyname
session.createQuery("fromStudentasswheres.name=’a’").list();
l//insert
session.save(Student);
l//update
Session.update(Student);
l//deletebyname
Session.delete(Student);
l//deletebyid
Useruser=newUser();
user.setId(1);
session.delete(user);
l//selectmuhu(模糊查询)
session.createQuery("fromStudentasswheres.namelike'%"+str+"%'").list();
5、与Spring的整合
Mybatis:
配置数据源文件
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="driverClassName"value="com.mysql.jdbc.Driver"></property>
<property
name="url"value="jdbc:mysql://127.0.0.1:3306/spring?useUnicode=true&characterEncoding=UTF-8>
</property>
<propertyname="username"value="root"></property>
<propertyname="password"value="1234"></property>
<propertyname="maxActive"value="100"></property>
<propertyname="maxIdle"value="30"></property>
<propertyname="maxWait"value="500"></property>
<propertyname="defaultAutoCommit"value="true"></property>
</bean>
配置sqlsessionfactory(将数据源注入)
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<propertyname="configLocation"value="classpath:MyBatis-Configuration.xml"></property>
<propertyname="dataSource"ref="dataSource"/>
</bean>
在Dao实现层中通过springIoc愉快使用SqlSessionFactory
<beanid="userDao"class="org.mybatis.spring.mapper.MapperFactoryBean">
<propertyname="mapperInterface"value="com.mybatis.UserDao"></property>
<propertyname="sqlSessionFactory"ref="sqlSessionFactory"></property>
</bean>
spring整合mybatis需要的jar包
Hibernate:
配置数据源文件
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertyname="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<beanid="dataSource"destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="driverClassName"value="${jdbc.driverClassName}"/>
<propertyname="url"value="${jdbc.url}"/>
<propertyname="username"value="${jdbc.username}"/>
<propertyname="password"value="${jdbc.password}"/>
</bean>
配置sessionfactory(将数据源注入)
<beanid="sf"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="packagesToScan">
<list>
<value>com.niit.model</value></list>
</property>
<propertyname="hibernateProperties">
<props>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<propkey="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
配置hibernatetemplete(将SessionFactory注入)
<beanid="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate">
<propertyname="sessionFactory"ref="sf"></property>
</bean>
6、注解支持
mybatis:
启用注解并注入testMapper
1.@Repository("testBaseDAO")
2.@Autowired
publicvoidsetTestMapper(@Qualifier("testMapper")TestMappertestMapper)
{
this.testMapper=testMapper;
}
@SelectProvider(type=TestSqlProvider.class,method="getSql")或@Select("select*from....")(SelectBuilder/SqlBuilder)
@InsertProvider(type=TestSqlProvider.class,method="insertSql")
@DeleteProvider(type=TestSqlProvider.class,method="deleteSql")
@Options(flushCache=true,timeout=20000)
@UpdateProvider(type=TestSqlProvider.class,method="updateSql")
@Param("id")
@Result(id=true,property="id",column="test_id")
Hibernate:
比较基础不解释
三、各种“效果”上的不同(10点)
1.Hibernate是全自动ORM框架,而Mybatis是半自动的。hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
2.hibernate数据库移植性远大于mybatis。hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。
3.hibernate拥有完整的日志系统,mybatis则欠缺一些。hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
4.缓存方面都可以使用第三方缓存,但是Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存,而Mybatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
4.Mybatis非常简单易学,hibernate相对较复杂,门槛较高。
5.二者都是比较优秀的开源产品
6.当系统属于二次开发,无法对数据库结构做到控制和修改,那Mybatis的灵活性将比hibernate更适合
7.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标,在这种情况下Mybatis会有更好的可控性和表现,可以进行细粒度的优化。
8.Mybatis需要手写sql语句,也可以生成一部分,hibernate则基本上可以自动生成,偶尔会写一些hql。同样的需求,Mybatis的工作量比hibernate要大很多。类似的,如果涉及到数据库字段的修改,hibernate修改的地方很少,而Mybatis要把那些sqlmapping的地方一一修改。
9.以数据库字段一一对应映射得到的po和hibernte这种对象化映射得到的po是截然不同的,本质区别在于Mybatis这种po是扁平化的,不像hibernate映射的po是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
10.hibernate现在已经是主流o/rmapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于Mybatis。
四、总结
mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动
转载请注明—作者:Java我人生(陈磊兴)原文出处:http://blog.csdn.net/chenleixing/article/details/43818611