Mybatis和hibernate比较

spring spring mvc 分别整合 hibernate mybatis 简单的增删改例子 Demo 本人手打的项目 里面包含spring整合当下流行框架的例子和整理好的jar 包含的例子:Spring+SpringMVC+Hibernate,Spring+SpringMVC+Mybatis spring+jdbc 立即下载
java程序对持久层的操作,有两大主流的框架,Mybatis和hibernate,他们两个都是非常常见的持久层框架,各有优略,通过以往的使用和在网上搜集的资料,对两个框架进行了一些比较。

一、序言

   最近一直用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:
属性:int id,String name,String password;
方法配置:
getStudentByName; //通过name查找
getStudentById //通过id查找
insertStudent //添加Student
updateStudent //更改Student
deleteStudent //通过id删除Student
deleteStudentById //通过name伤处Student
selectStudentmohu //通过name模糊查询
Mybatis:
总配置文件:mybatisConfig.xml

<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>

l 实体类映射文件:StudentMap.xml(一个或多个)

<mapper namespace="com.niit.model.StudentMap">
<select id="getStudentByName" resultType="Student"
parameterType="string">
select * from student where name=#{name}
</select>

<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>

<delete id="deleteStudentById" parameterType="int">
delete from student where id=#{id}
</delete>

<select id="selectStudentmohu" parameterType="String"
resultType="Student">
select * from student where name like "%"#{name}"%"
</select>
</mapper>  

Hibernate:
l 总配置文件:hibernate.cfg.xml

     <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>

l 实体类配置文件:Student.hbm.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
l select by name

public void test() throws IOException
{
String resource = "mybatisConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);  
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);  
SqlSession session = sessionFactory.openSession();  
        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:
 //select by id 
Configuration cfg = new Configuration().configure(); 
    SessionFactory sf = cfg.buildSessionFactory();  
    Session session = sf.openSession(); 
Session.get(Student.class,id); 
 //select by name 
session.createQuery("from Student as s where s.name =’a’").list();
 //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 '%"+str+"%'").list();
5、与Spring的整合

Mybatis:
配置数据源文件

<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>

配置sqlsessionfactory(将数据源注入)

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:MyBatis-Configuration.xml"></property>
        <property name="dataSource" ref="dataSource" />
    </bean>

在Dao实现层中通过spring Ioc 愉快使用SqlSessionFactory

    <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.mybatis.UserDao"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

spring整合mybatis需要的jar包

Hibernate:
配置数据源文件

    <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(将数据源注入)
  <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>

配置hibernatetemplete(将SessionFactory注入)

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sf"></property>
</bean>
6、注解支持

mybatis:
启用注解并注入testMapper
1.@Repository(“testBaseDAO”)
2. @Autowired
public void setTestMapper(@Qualifier(“testMapper”) TestMapper testMapper)
{
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要把那些sql mapping的地方一一修改。
    9.以数据库字段一一对应映射得到的po和hibernte这种对象化映射得到的po是截然不同的,本质区别在于Mybatis这种po是扁平化的,不像hibernate映射的po是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
    10.hibernate现在已经是主流o/r mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于Mybatis。

四、总结

mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动

LS-DYNA壳单元冲击仿真中的5个关键设置:以方管碰撞为例(含沙漏控制参数) 本文以方管碰撞为例,深入解析了LS-DYNA壳单元冲击仿真中的五个关键设置。重点探讨了沙漏控制参数(如IHQ=4)的选择逻辑、自接触算法优化、能量监控方法、材料模型(MAT_24)的真实应力-应变曲线与应变率效应设置,以及单元公式的选取。这些核心设置共同决定了仿真的精度与效率,是确保方管冲击仿真结果可靠性的基石。 阅读详情

相关推荐

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2067

Hibernate与 MyBatis的比较

最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处。 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网:ht

JIYAYUN 软件开发之路 44万+

Pcileech(DMA)开源项目简述

希望大DMA家能正确认识FPGA,正确使用DMA技术,对于市场上各类伪装成花里胡哨设备的FPGA板卡它的本质是不会变的,不要上当受骗。

2301_79773847的博客 5961

Mybatis 和 Hibbernate 的区别:

Mybatis 和 Hibbernate 的区别:          1:首先 MYbatis 是一个半自动化的 框架;             Hibbernate 是一个全自动化的框架 ;        2:  MYbatis 是一个半自动化的 框架 它的 sql 语句我们自己 编写 ,sql 语句的 好坏可以控制;               Hibbernate 是一个全自动化的框架  ...

幸运女神在微笑! 1764

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 594

科大讯飞(1): 环形6麦语音唤醒—驱动板上的接口

介绍环形麦阵列驱动板上的接口,及其疑问

bing_feilong的博客 1175

Hibernate与MyBatis的比较

最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处。 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网:

romantic_PK的专栏 1051

Livox-avia+FAST-LIO麻瓜使用教程

激光雷达 SLAM Fastlio 安装

aaaaaaaaaww12的博客 3675

mybatis总结和与hibernate比较

#{}和${}   #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。 如果接收简单类型,#{}中可以写成value或其它名称。 #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。   ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。 ${}接收输入参数,类型可以是简单类型

哎幽的成长 1491

Autosar MCAL-S32k324 Crypto配置-基于EB

NXP官网提供了免费的HSE固件,同时也提供了对应的协议栈。本文以算法为例,介绍MCAL相关的配置及在代码中的集成与使用。使用HSE计算,比软件算法确实方便许多。后面会完善更多的算法测试。

赞的博客 2435

详细推导波特图增益和相位曲线

最近因为项目需求,在回看波特图方面的内容。大三那会,《自动控制原理》这本书里面就讲过这些东西,但是那时候总感觉学这些没啥用,反正以后也用不到,对这种课程的重视度不是很高。 工作后发现,只要你从事的是和本专业相关的工作,大学学过的很多理论课程在后面大概率都会用到。曾经那些我们在学校以为用不上的东西,熟不知在后面用处还多着呢。所以啊,仅仅只是我们的以为而已! 现在还在学校的同学,对待《自动控制理论》、《信号与系统》、《通信原理》这样的核心专业课,建议还是好好学习一下,认真听听课。哪怕是考试完以后就会忘掉,但当我

D_Katter的博客 3936

数据库操作与 ORM 框架:JDBC、Hibernate、MyBatis 比较

JDBC 是 Java 提供的数据库访问 API,允许 Java 应用程序与多种数据库进行交互。它提供了一套标准的接口和类,以执行 SQL 语句、获取结果集并处理数据库连接。Hibernate 是一个开源的 ORM 框架,它通过将数据库表映射为 Java 对象,简化了数据库操作。开发者可以通过对象操作而不是直接执行 SQL 来访问数据库。MyBatis 是一个半自动的 ORM 框架,它提供了 SQL 映射的能力,允许开发者编写原生 SQL,并通过 XML 或注解的方式进行映射。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 955

第4-4课:状态压缩与动态规划

什么是状态压缩 动态规划问题中重要的一环就是确定状态的定义,在大多数情况下,状态中所包含的信息并不多,比如线性规划问题的状态一般表示为 d[i,j](i 表示状态的位置,j 表示状态的阶段),算法实现时可用二维数组保存计算过程中的状态。但是也有一些问题,它的状态中包含的信息很多,比如它的状态可能是一个集合中各个元素的情况,或者是像铺瓷砖问题这样,是某一行的覆盖状态。如果沿用简单的状态表示方法,则可...

oRbIt 的专栏 700

hibernate与mybatis异同与比较

文章目录1 hibernate与mybatis异同1.1 引言1.2 具体运用上的不同1.2.1 所需的jar包1.2.2 映射关系1.2.3 配置文件1.2.4 基本用法(增删改查模糊)1.2.4.1 Mybatis1.2.4.2 Hibernate1.2.5 与Spring的整合1.2.5.1 Mybatis1.2.5.2 Hibernate1.2.6 注解支持1.2.6.1 mybatis1.3 各种效果上的不同1.4 总结 1 hibernate与mybatis异同 1.1 引言 最近一直用myba

上善若泪 675

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

比较hibernate和mybatis优缺点

首要声明,该篇文章的编写是依据其他多篇文章汇总整理而来。并非完全原创,只为加深自己的理解的同时方便大家,侵权必删! 首先从orm(object relation mapping)等级来讲,hibernate和mybatis都属于orm框架,hibernate属于4级(顶级),mybatis属于2级。从此可见,hibernate比mybatis更强大一些,强大的体现在于: ●开发速度与工作量。 ...

花落惊夜雨的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Hibernate和MyBatis的区别比较

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!0)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84049001的博客 1063

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

(转)Mybatis和hibernate的优缺点比较

cleble的专栏 202

mybatis与hibernate比较

最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处。 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网:http...

lt200819的专栏 148

Mybatis和hibernate的优缺点比较

Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。 Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。 具体从几个方面说一下两者的区别: 1.两者最大的区别: 针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。 针对高级查...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 3万+

hibernate和mybatis的比较

1. 简介: hibernate对jdbc进行了较为完整的封装,实现了JavaBean和数据库之间的映射,以及SQL的自动生成和执行 mybatis实现了JavaBean和SQL之间的映射,将SQL所需的参数以及返回的结果字段映射到指定的Bean,相对Hibernate O/R Mapping来说,mybatis是一种sql Mapping的框架 2. 开发速度: mybatis

技术人生 1141

【MyBatis】MyBatis与Hibernate比较

1. Mybatis与Hibernate区别 1.1 表格比较 功能 MyBatis Hibernate 开发速度 上手容易 相对掌握困难 开发工作量 手写SQL语句 也可以手写SQL语句,但破坏了Hibernate封装和简洁性 扩展性 因为是手写SQL,所有扩展性好,但迁移性差 数据库关系关联都在XML中,所以HQL对是什么数据库不关心 移植性 不好,针对不同的数据库...

LewinLea的技术博客 177

Hibernate 与 MyBatis 比较

例如,在处理复杂的多表联合查询时,开发者可以根据数据库的特性(如MySQL的索引使用、Oracle的分析函数等)编写最适合的SQL。例如,当需要执行一些数据库特有的函数(如MySQL的 `GROUP_CONCAT`)或者复杂的存储过程时,使用Hibernate会比较麻烦,需要通过一些复杂的配置或者自定义函数来实现。例如,在一个大型的企业级项目中,如果需要对某个数据查询功能进行优化,只需要找到对应的Mapper XML文件,就可以对SQL语句进行调整,而不会影响到其他的业务逻辑代码。1. SQL优化灵活性。

chinansa的博客 1048
上一篇: 你没见过的通俗spring mvc~~~有好戏
下一篇: json 在java 中的应用
Codegeek_jfl
博客等级 码龄11年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值