hibernate,mybatis,beetlsql 全面比較
这是我的一个综合评分。总共分为12个单项。每一个单项最高5分。最低0分。
注意。评价仅仅包括这些软件提供的标准功能,不包括第三方提供的功能,如代码生成等。

开发效率
hibernate 能获取数据库metadata。因此简单的sql操作。如插入。更新,删除,翻页等。都能够自己主动完毕。但由于概念复杂,常常会导致开发者会写sql,能写java,但不会写hibernate情况出现(关系配置或者hql)。导致开发效率反而减少。
session.save(user);
String hql= "from bank.Person person where person.id.country = 'AU' "
Query query = sessin.createQuery(hql);
mybatis 必须手工写sql,效率较低。有第三方工具能自己主动生成才勉强提高了开发效率
beetlsq l
相同具有hibernate 的功能,但不要求配置或者annotation。
所以觉得开发效率比hibernate高,是由于beetlsql 本身使用不easy出错,不像hibernate那样概念复杂,easy使用错误。导致实际开发速度减少. 在写sql文件的时候,基于MD+beetl的也比myabtis 的xml 要快非常多.
sqlManager.save(user);
List<User> list = sqlManager.select("user.queryMaxAgeUser",User.class,paras);
//or UserDao是一个开发人员定义的接口。通过代理实现DAO
UserDao dao = sqlManager.getMapper(UserDao.class);
List<User> list dao.queryMaxAgeUser(paras)
跨多种数据库
hibernate 支持差点儿全部数据库,通过自己主动生成的sql(插入,删除。翻页等),hql,来完毕跨数据库操作。但对于数据库之间确实不同地方,hibernate无力处理,所以仅仅有4分
mybatis 差点儿没有考虑过跨数据库功能,配置文件中能够通过if标签来做推断,但这样的技术鸡肋的非常。
beetlsql 。眼下支持Oracle,Mysql,Postgres,SQLServer,SQLLite,H2。相同提供了自己主动生成sql完毕插入,删除,翻页等跨数据库的功能,beetl脚本来完毕一些跨数据库操作。
另外。beetlsql独立管理sql文件。sql放在根文件夹下,特定数据库sql放在以数据库命名的子文件夹下。假设数据库sql确实有一样地方,能够用特定数据库sql覆盖默认的sql。
维护性
hibernate :
hibernate本生复杂性导致了维护比較难。对于一些简单的重构,hibernate代码不须要修改。对于复杂的sql(hql)修改,hibernate比較费劲
mybatis :能够适应复杂的sql修改,但表重构等,必须修改mapper
配置文件中的sql。
beetlsql :
同一时候具备hibernate 和 myabtis 在维护性方面的长处。支持重构,支持代码外维护sql。 beetlsql的md格式使得维护sql像读文档一样。同myabtis一样。支持将sql文件的sql语句自己主动映射成dao方法。

系统启动耗时
hibernate :启动须要载入数据库的metadata,载入pojo,载入配置文件。然后校验等操作,启动非常耗时
mybatis :
须要做一个主要的配置文件载入。以及各个mapper文件载入,系统第一次訪问的时候会慢
beetlsql :仅仅简单的载入了数据库的metadata,不做不论什么校验,启动差点儿不消耗时间
错误提示
hibernate 因为本生ORMapping的复杂性.所以提示也非常复杂。另外不管是xml配置还是annotation配置,假设有出错提示,也非常难明确错误提示意思。HQL
也是这样,错误提示也并不理想
mybatis :
myabtis 错误提示最难搞懂,由于他基于xml解析和ognl 表达式都不是他自己的,所以我们会看到各种莫名其妙的提示。
例如以下。本来应该是resultType,但写成resultMap
<select id="getGrantCount" resultMap="Integer" parameterType="Map">
错误提示虽然能够理解,但很不直观。没有告诉你哪行错了。你仅仅能配置文件全部地方才干排查这个手误
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for cn.xxx.IGiftStatisticCacheService.Integer
beetlsql :
基于beetl模板语言,哪个配置文件哪行错了,错误原因是什么。提示的很清楚。并且是中文的
例如以下一个sql配置,if语句多了一个d
|
1
2
3
4
|
select * from User where 1 =1 @if(isNotEmpty(age)d){and age = #age#@} |
错误提演示样例如以下
>>11:14:10:缺少符号(PARSER_MISS_ERROR):d 位于2行 资源:user.queryUser_page
多余输入 'd' 期望 RIGHT_PAR
1|select * from User where 1 =1
2|@if(isNotEmpty(age)d){
3|and age = #age#
4|@}
模型支持
hibernate ,仅仅支持pojo,并且因为有关系约束,导致开发不够快捷
mybatis :pojo和map都支持,map支持能够高速支持一些小的功能开发
beetlsql :pojo和map都支持,另外混合模型,使用较少的pojo完毕大量的查询操作而无需为模型添额外的属性,因此模型支持比myabtis要好。
List<User> list = sqlManager.select("user.queryXXX",User.class,paras);
List<Map> list = sqlManager.select("user.queryXXX",Map.class,paras);
//假设user继承了Tail接口,支持混合模型.例如以下样例能够通过user.get("roleName ") 訪问角色名,这对于web项目来说,非常好用
List<User> list = sqlManager.excute("select u.*,r.name roleName from user u,role r ... ",User.class,paras);
学习曲线
hibernate 毫无疑问最难掌握的是hibernate,这是公认的,他的别扭之处是明明就是个sql
操作,非要让开发者先转成对象,然后再转成sql(实际上,sql语言已经屏蔽了操作数据库的复杂性了),看看hibernate有多少书和文档就知道他的复杂性
myabtis :
非常easy。除了写mapper文件。可能须要学一下怎么写,但大概也就3-5天时间。myabtis作者当时的出发点也是写一个“不要一本书来说明的dao工具”,他做到了,但做的还不够好。
beetlsql :
API只在SQLManager里,一看就明确。sql文件採用md格式,去除了xml那种繁琐,而且使用beetl作为模板语言,很easy,1天就能全然掌握。 对于数据库这样的訪问技术来说,本不应该出现所谓的“砖家”。但hibernate有,这是不正常的。
所以,hiberante评分最低,beetlsql最高。
对DBA友好
hibernate :
此工具是仇视DBA的,自然DBA也不喜欢hibernate。在这就不谈了。
myabtis :sql文件单独管理,採用xml方式。相对友好。但xml方式过于繁琐了,像常见的"<"
符号,myabtis不得不专门处理
beetlsql :
sql 既能够出如今代码里,也能够在sql文件中,因为採用md+beetl 格式,比myabtis更好,DBA看beetlsql的sql文件,就像阅读文档一样
与其它工具友好
hibernate :因为是採用容器管理bean,因此在容器里使用第三方工具。和容器外使用第三方工具,效果不一样,比方hibenate独有的Open
Session In View 问题。还有 Session Has Closed ...
myabtis :无容器管理。所以怎么用都顺手
beetlsql :同myabtis,对其它工具非常友善
性能
没有详细比較过,但考虑三者工具都涉及到sql模板解析,MetaData 获取和分析。ResutlSet 的Mapping操作,java反射等。因此,性能几乎相同。我将在以后给出详细性能对照。
再考虑到数据库操作,dao基本上能够忽略不计,所以性能都给予5分
数据库主从支持
hibernate :
不支持,须要借助第三方路由中间件
myabtis :
支持。但须要做一些简单的编码。以切换数据源
beetlsql :支持数据库主从配置,无需开发者编码。
beetlsql默认依据sql是查询还是更新决定去主从库,也能够依据事务决定数据库主从,如仅仅读事务就去从库。
beetlsql
既能适合一个初创项目,也适合项目飞速发展的巨大用户量情况。
当然。超大用户量,这就超出了beetlsql的功能了。
OR Mapping
hibernate :
实体,关系都通过配置完毕OR Mapping,包括了一对多。多对多,继承等各种关系的实现。
但正如我在一篇文章里吐槽过OR Mapping那样,虽然hibernate此项做的很好。但没什么用。
myabtis :
实体。关系也通过配置来完毕。但由于这是后期加的功能,所以用的并不好
beetlsql :支持实体映射,不支持关系映射。未来考虑增加简单的关系映射
BeetlSQL一分钟介绍
因为beetlsql 是个新工具。所以简单用一个样例说明beetlsql
//初始化部分。通过跟框架结合,如通过spring ioc直接注入SqlManager
MySqlStyle style = new MySqlStyle();
MySqlConnectoinSource cs = new MySqlConnectoinSource();
SQLLoader loader = new ClasspathLoader("/org/beetl/sql/test");
SQLManager sql = new SQLManager(style,loader,cs,new DefaultNameConversion(), new Interceptor[]{new DebugInterceptor()});
//直接使用sqlmanager 的api操作
User user = ....;
sql.insert(user);
User query = new User();
query.setStatus(1);
List<User> list = sql.template(User.class,query);
// 查询user.sql 文件的mySelect sql模板
List<User> list = sql.select("user.mySelect",User.class。query) ;
beetlsql 也封装了SqlManager。提供了dao 接口
public interface UserDao extends BaseMapper<User> {
public User findById(@Param("id") Integer id);
public int getCount();
public void setUserStatus(User user);
public Integer setAge(@Param("id") Integer id,@Param("age") Integer age);
}
然后,在业务逻辑里能够这么使用。使得dao更easy维护
UserDao dao = sql.getMapper(UserDao.class);
dao.insert(user); //使用BaseMapper 内置的方法
dao.setAge(12, 18); // 调用user.sql文件中的 setAge sql模板
user.sql 是一个md格式文件
setAge
===
* 更改用户年纪
update user set age = #age# where id=#id#
hibernate,mybatis,beetlsql 全面比較的更多相关文章
- 我对hibernate和mybatis框架的比較
系统在选择操作数据库的框架上面,究竟是选择hibernate,还是mybatis. 首先说下两者的原理,假设你要关联几张表做查询,查出20条记录: 1.假设是mybatis SELECT * FR ...
- jdbc hibernate myBatis比较
jdbc hibernate myBatis比较 jdbc 优点:性能高,易掌握 缺点:代码繁琐 hibernate 优点:不用写sql,代码简洁 缺点:性能不好 自动生成的sql效率低下(复杂业务) ...
- jpa,jdbc,hibernate/mybatis,数据库驱动
JPA是规范,hibernate/mybatis是对规范的实现,hibernate/mybatis是对jdbc的封装,也就是说hibernate/mybatis还是会调用jdbc. 我们平时使用 ...
- atitit.动态加载数据库配置in orm hibernate mybatis
atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象, ...
- spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件
这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器 ...
- jpa hibernate mybatis
jpa: entityManagerFactory: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean hibern ...
- Hibernate&MyBatis
ORM程序技术 概念:ORM是对象(Object).关系(Relational).映射(Mapping)的缩写. 作用:用于替代JDBC 用法:数据库类名与表名对应:字段名和属性名对应: 优势: 更方 ...
- 【JAVA框架】Hibernate 与Mybatis 区别
Hibernate Mybatis 简介 区别 与联系 欢迎提出见解及转载. 1 简单简介 1.1 Hibernate 框架 Hibernate是一个开放源代码的对象关 ...
- SpringMVC,Spring,Hibernate,Mybatis架构开发搭建之SpringMVC部分
SpringMVC,Spring,Hibernate,Mybatis架构开发搭建之SpringMVC部分 辞职待业青年就是有很多时间来写博客,以前在传统行业技术强度相对不大,不处理大数据,也不弄高并发 ...
随机推荐
- 【SPOJ220】Relevant Phrases of Annihilation (SA)
成功完成3连T! 嗯没错,三道TLE简直爽到不行,于是滚去看是不是模版出问题了..拿了3份其他P党的模版扔上去,嗯继续TLE...蒟蒻表示无能为力了... 思路像论文里面说的,依旧二分长度然后分组 ...
- [poj] 3041 Asteroids || 最小点覆盖=最大二分图匹配
原题 本题为最小点覆盖,而最小点覆盖=最大二分图匹配 //最小点覆盖:用最少的点(左右两边集合的点)让每条边都至少和其中一个点关联. #include<cstdio> #include&l ...
- Vue组件中的单项数据流
当子组件中的input v-model 父组件的值时不能直接绑定props的值要使用计算属性,向下面的写法,因为props是单项数据流,子组件不能改变父组件的状态,直接绑定会报错. 还可以这样写:但是 ...
- spring in action学习笔记十六:配置数据源的几种方式
第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-r ...
- 7月9日day1总结
今天的学习过程和小结 上午学习了前端包括html,CSS,js等基本内容 前端10.25.134.187 html js css 1.块元素 ---默认占满整行,如果设置了高度和宽度都有效,如果不设置 ...
- 51nod 1851 俄罗斯方块
玩过俄罗斯方块?那你知道俄罗斯方块共有七种吧(其实只有五种) 给一个黑白图,每次能将某些区域的格子黑白反转,至于某些区域的意思嘛,就是俄罗斯方块形状的区域咯(可水平翻转.上下翻转.旋转) 求能否将图变 ...
- C++ emplace_back
在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发.在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的pus ...
- 非MFC工程中使用MFC库
目录(?)[-] 需求说明 常见问题 问题分析 参考解决方法 我的解决方案 Stdafxh的原理 需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console A ...
- Linux安转scala
1. 创建目录 > mkdir /opt/scala > cd /opt/scala 2. 下载scala压缩包到上述目录 scala-2.12.6.tgz 3. 解压缩.建立软连接 ...
- 请求路径@PathVariable与请求参数@RequestParam的区别
转自:http://www.iteye.com/problems/101566: http://localhost:8080/Springmvc/user/page.do?pageSize=3& ...