hibernate与mybatis的比较
2016-03-14 14:33
405 查看
现在IT行业SSH的三大框架的魄力越来越大,而如何选择适合自己程序的持久层确实需要谨慎思考!下面小编就带着大家一起来治愈持久层框架的“选择恐慌症”:
首先来看小编给大家准备的一幅图,来对这两个持久层框架进行基本了解:
对两个框架有了基本的了解之后,我们一起来看二者在程序中具体应用的不同:
hibernate:根据功能不同,大概需要十几个包
hibernate:实体类与数据库之间的映射
Student.htm.xml:
配置sessionFactory :
② Hibernate和MyBatis都支持JDBC和JTA事务处理。
② MyBatis容易掌握,而Hibernate门槛较高。
② Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
③ Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
④ Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
以上就是小编整理出的mybatis和hibernate两个持久层框架的异同之处,如有问题或者更好建议,请联系小编!
PS:由于篇幅原因,这里只介绍两者的异同,关于二者的缓存比较请关注小编的下篇博客!
首先来看小编给大家准备的一幅图,来对这两个持久层框架进行基本了解:
对两个框架有了基本的了解之后,我们一起来看二者在程序中具体应用的不同:
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两个持久层框架的异同之处,如有问题或者更好建议,请联系小编!
PS:由于篇幅原因,这里只介绍两者的异同,关于二者的缓存比较请关注小编的下篇博客!
相关文章推荐
- hbase shell 常用命令
- 浦发银行梦卡申请经验
- Android分包MultiDex原理详解
- C++ 内存管理
- JSP写入MySQL数据库中出现乱码问题笔记
- freeradius build
- SQLite3命令行窗口常用命令
- 深入浅出 Kubernetes 架构
- Ubuntu上hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程
- mark一个搜索相关技术的博客
- 离别
- Contiki 在STM32 中的移植
- php常见判断
- IIS mime类型 任意类型
- html入门的笔记总结
- MIPI接口LCD屏调试心得
- 基于Flex的裁剪图片功能封装
- 为什么linux驱动要专门有杂项设备呢
- 用JAVA打暴雪星际争霸(1)--搭建开发环境
- IMA: maintain i_readcount in the VFS layer