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部分 辞职待业青年就是有很多时间来写博客,以前在传统行业技术强度相对不大,不处理大数据,也不弄高并发 ...
随机推荐
- SqlHelper——数据库小助手
SqlHelper其实就是一个类. 早就听说过"SqlHelper"这个名词,也查过相关的资料,但还是一头雾水.当真的去实践去用它时,就会发现其实它没那么神秘. 当敲第一个窗体的时 ...
- CSS 的Hack 问题
1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的,CSS hack就是让你记住这个标准),以 ...
- 网站前后台分离 图片 flash 视频 等文件的共享问题
在网上找了,没有说到点子上的,不详细 问了有经验的同事,要建立 文件服务器,就是一个IIS 下的新网站,网站是共享图片 文件使用的专用网站 后台上传的图片保存在 文件服务器即 文件共享专用的网站目录地 ...
- [SDOI2015][bzoj4518] 征途 [斜率优化dp]
题面 传送门 思路 把$vm^2$展开化一下式子,可以得到这样的等价公式: $vm^2=m\sum_{i=1}^m a_i^2-\sum_{i=1}^m a_i$ 那么我们要最小化的就是$\sum_{ ...
- 【BZOJ 2809 dispatching】
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4393 Solved: 2246[Submit][Status][Discuss] Descript ...
- 关于PDA、GPS等动态资源的几种GIS解决方案
关于PDA.GPS等动态资源的几种GIS解决方案(原创) 今年来GIS发展迅速,特别是实时监控中引入了GPS,PDA等动态资源,使得GIS在各个行业的应用更为广泛. 1.在这些动态资源资源的监控中主要 ...
- 口红游戏 插口红游戏 h5页面开发
目前火热的口红机游戏,需要在设备前参与,然后成功后即可赢得口红,作为平台运营者来说还是比较重资产的,目前我们将它搬到了线上.每个人都可以远程玩这样的口红机游戏了.直接在手机微信里试玩,成功后,后台即可 ...
- HCNA--tcp/ip基础
1.OSI七层参考模型 应用层 7 表示层 6 高层:负责主机之间的的数据传输 会话层 5 传输层 4 主机之间端到端的连接 tcp /udp segment 网络层 3 路由 寻址 packet ...
- 插件安装:包管理器——Package Control
首先,按CTRL+`,打开控制台 粘贴下面的代码,之后回车 如果是sublime3 ? 1 import urllib.request,os,hashlib; h = '7183a2d3e96f1 ...
- 使序列有序的最少交换次数(minimum swaps)
交换相邻两数 如果只是交换相邻两数,那么最少交换次数为该序列的逆序数. 交换任意两数 数字的总个数减去循环节的个数?? A cycle is a set of elements, each of wh ...