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部分 辞职待业青年就是有很多时间来写博客,以前在传统行业技术强度相对不大,不处理大数据,也不弄高并发 ...
随机推荐
- hdu 1846 Brave Game (博弈)
Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- BZOJ3876 [Ahoi2014&Jsoi2014]支线剧情 【有上下界费用流】
题目 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最少 ...
- ACM-The Coco-Cola Store
题目: Once upon a time, there is a special coco-cola store. If you return three empty bottles to the s ...
- 笔记:CS231n+assignment2(作业二)(三)
终于来到了最终的大BOSS,卷积神经网络~ 这里我想还是主要关注代码的实现,具体的CNN的知识点想以后在好好写一写,CNN的代码关键就是要加上卷积层和池话层. 一.卷积层 卷积层的前向传播还是比较容易 ...
- bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...
- 多目录,多可执行文件的Makfile的编写
1.前言 在目前的工作中,我遇到这样的一个工作情景,可以认为我要开发一个库,这个库的有多个模块,每个模块的.c放到src中,.h放到include中,这应该是个标准做法. drwxr-xr-x. ro ...
- xen 保存快照的实现之 —— device model 状态保存
xen 保存快照的实现之 —— device model 状态保存 实现要点: 设备状态保存在 /var/lib/xen/qemu-save.x 文件这个文件由 qemu-dm 产生,也由 qemu- ...
- 流畅的python第九章笔记 python风格的python
9.1对象表示形式 __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员. 我们打印下面的A是默认输出这个对象的类型,我们对B进行了修改_ ...
- POCO库中文编程参考指南(1)总览
POCO库中文编程参考指南(1)总览 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -> @) ...
- 基于UDT connect连接通信以及文件传输--客户端
上面一篇文章中提出了服务端的,其实这里没有严格意义的服务端和客户端之分,因为我在代码中是基于UDP的,不存在服务端与客户端,两个都是对等的,只是我这里进行一下简单的区分而已.在这里,客户端所进行的主要 ...