[置顶] hibernate与mybatis的比较:

        现在IT行业SSH的三大框架的魄力越来越大,而如何选择适合自己程序的持久层确实需要谨慎思考!下面小编就带着大家一起来治愈持久层框架的“选择恐慌症”:

       首先来看小编给大家准备的一幅图,来对这两个持久层框架进行基本了解:


        对两个框架有了基本的了解之后,我们一起来看二者在程序中具体应用的不同:

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.配置文件:

  mybatis:总配置文件 MybatisConfig.xml + 实体类映射文件 StudentMap.xml

  MybatisConfig.xml:

<span style="font-size:18px;"><configuration>
	<typeAliases>
		<typeAlias alias="Student" type="com.niit.model.Student"/>
		</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/niit/model/StudentMap.xml"/>
	</mappers>

</configuration></span>
 StudentMap.xml:

<span style="font-size:18px;"><mapper namespace="com.niit.model.StudentMap"> 
	<select id="getStudentById" resultType="Student" parameterType="int">
		select * from student where id=#{id}
	</select>
	 
	<insert id="insertStudent" parameterType="Student">
		insert into student(id, name, password) value(#{id}, #{name}, #{password})
	</insert>
	 
	<update id="updateStudent" parameterType="Student">
		update student set name=#{name}, password=#{password} where id=#{id}
	</update>
	 
	<delete id="deleteStudent" parameterType="String">
		delete from student where name=#{name}
	</delete>
</mapper></span>

  hibernate :总配置文件:hibernate.cfg.xml  + 实体类配置文件:Student.htm.xml

      hibernate.cfg.xml 

<span style="font-size:18px;">	 <hibernate-configuration>
		  <session-factory>
		  <property name="connection.username">root</property>
		  <property name="connection.url">   jdbc:mysql://127.0.0.1:3306/sample</property>
		  <property name="dialect">org.hibernate.dialect.MySQLDialect </property>
		  <property name="connection.password">123</property>
		  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		  <property name="hibernate.show_sql">True</property>
		  
		   <mapping resource="com/niit/model/Student.hbm.xml" />
		  </session-factory>
	  </hibernate-configuration></span>

    Student.htm.xml:

	<hibernate-mapping package="com.niit.model.">
	    <class name="Student" table="student">
	       <id name="id" column="id" type="int">
	            <generator class="identity"/> 
	       </id>
	       <property name="name" type="java.lang.String">  
	           <column name="name" length="20" not-null="true" />
	       </property>      
	       <property name="password" type="java.lang.String"> 
	           <column name="password" length="20" not-null="true" />
	       </property>  
	   </class>

</hibernate-mapping>

4.增删改查的用法:

    mybatis:

@Test
public void test() throws IOException
{
String resource = "mybatisConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);  
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);  
SqlSession session = sessionFactory.openSession();  
   // select by name 
  session.selectOne("com.niit.model.StudentMap.getStudentByName","b");}
  // select by id 
  session.selectOne("com.niit.model.StudentMap.getStudentById",2);                   
  //insert  
  session.insert("com.niit.model.StudentMap.insertStudent", student);          
  //update
  session.insert("com.niit.model.StudentMap.updateStudent", student);
                       
  //delete by name
  session.insert("com.niit.model.StudentMap.deleteStudent", "wl");
                  
  //delete by id
  session.insert("com.niit.model.StudentMap.deleteStudentById", 3);
          
  //select muhu(模糊查询)
  session.selectList("com.niit.model.StudentMap.selectStudentmohu", "b");

    hibernate:

<span style="font-size:18px;">    Configuration cfg = new Configuration().configure(); 
    SessionFactory sf = cfg.buildSessionFactory();  
    Session session = sf.openSession(); 

  //select by name 
  session.createQuery("from Student as s where s.name =’a’").list();
  //select by id 
  Session.get(Student.class,id); 

 //insert  
 session.save(Student); 
 //update  
 Session.update(Student) ;
 
 //delete by name
 Session.delete (Student) ;
 
 //delete by id
 User user = new User(); 
 user.setId(1);
 session.delete(user); 
 //select muhu(模糊查询)
  session.createQuery("from Student as s where s.name like '%")
	
</span>

5.与Spring的整合

     mybatis: 配置数据源文件+ 配置sessionFactory + 在dao层实现通过Spring  ioc愉快使用sqlsessionFactory

     整合配置数据源文件:
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	        <property name="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>
	        <property name="username" value="root"></property>
	        <property name="password" value="1234"></property>
	        <property name="maxActive" value="100"></property>
	        <property name="maxIdle" value="30"></property>
	        <property name="maxWait" value="500"></property>
	        <property name="defaultAutoCommit" value="true"></property>

         </bean>
      配置sessionFactory :
<span style="font-size:18px;"><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="configLocation" value="classpath:MyBatis-Configuration.xml">    
	</property>
       <property name="dataSource" ref="dataSource" />

</bean></span>
     在dao层实现通过Spring  ioc愉快使用sqlsessionFactory:
<span style="font-size:18px;">	<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.mybatis.UserDao"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
     </bean></span>

    hibernate:配置数据源文件  +  配置sessionFactory + 实现sessionFactory的注入

     配置数据源文件:
           <bean  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">	    
                <property name="locations">
	            <value>classpath:jdbc.properties</value>
	        </property>
          </bean>
	  <bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	  </bean>
    配置sessionFactory(将数据源注入):
<span style="font-size:18px;"><bean id="sf"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan">
			<list><value>
				com.niit.model
			</value></list>
		</property>
		<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
			<prop key="hibernate.show_sql">true</prop>
		</props>
		</property>

</bean></span>
    注入sessionFactory:
<span style="font-size:18px;"><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
	<property name="sessionFactory" ref="sf"></property>
</bean></span>

  总结

   相同之处:

  Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由   SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。 其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
 ②   Hibernate和MyBatis都支持JDBC和JTA事务处理。

   mybatis的优势:

   MyBatis可以进行更为细致的SQL优化,可以减少查询字段。 
②  MyBatis容易掌握,而Hibernate门槛较高。

   hibernate的优势:

 Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
② Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
③ Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
④ Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

以上就是小编整理出的mybatis和hibernate两个持久层框架的异同之处,如有问题或者更好建议,请联系小编!
[置顶] hibernate与mybatis的比较:_第1张图片
      PS:由于篇幅原因,这里只介绍两者的异同,关于二者的缓存比较请关注小编的下篇博客!





你可能感兴趣的:([置顶] hibernate与mybatis的比较:)