Java 除了 Mybatis,基于 Sql 的 Dao 还有更好的方案吗?

2017-05-18 20:01:40 +08:00
 abcbuzhiming
两年前用过 Mybatis,被坑了一大把,两年不敢再用,现在又要开始数据层选型,本人还是偏爱 sql 管理 dao 多点,不喜欢 hibernate,所以特来请教。也许是自己当年打开 Myabtis 的方式不对吧;当时有几个非常困扰我的关于 Mybatis 的地方:即使我用了 mybatis 的 mapper 生成工具,维护效率仍然很低,一个困境就是项目的数据库表在初期是经常变动的(哦不,应该说,是整个生命周期都在变动),一旦变动,对应表的 po 就变了,mybatis 里那个用来映射 po 的 resultMap 也得跟着变,于是你就得重新生产一遍这张 Mapper.xml。但是你的 Mapper.xml 里往往有你自己维护的 sql 语句( mybatis 生成的 mapper.xml 里自带的 sql 模板和接口并不能应对复杂情况,所以你仍然需要经常自己写新的 sql )。于是你就得备份旧的 mapper.xml,生成新的后你得从旧 xml 里把 sql 语句拷贝回去。这个过程真是太痛苦了。当时就有个想法,这该死的 resultMap 能否移到别的 xml 文件去,至少和放 sql 语句的 xml 分开啊,重新生成的时候不要互相影响啊。可惜没辙。另外 mybatis 基于 xml 的 sql 模板维护起来真的很头大,也没找到合适的工具。
所以,我现在该咋办呢,mybatis 有没有生产力高一点的工具,或者有没有优秀一点的替代品?
13229 次点击
所在节点    Java
68 条回复
abcbuzhiming
2017-05-18 23:15:10 +08:00
@fifman 我就是不喜欢重 ORM,而且更喜欢 SQL,所以才不选 hibernate 的。
abcbuzhiming
2017-05-18 23:21:49 +08:00
@incompatible 我心里就是不太愿意用重 ORM 工具啊,更喜欢 SQL 的,如果完全是 ORM 映射了,也就没啥意思了呢。
另外我刚才想了,就算不用 resultMap 还是有问题,因为 mybatis 生成的 xml 里,insert 语句和 update 语句都是和表字段有关的,你改一次表,还是得重新生成 xml,但是我 xml 里有我自己编写的针对特定字段进行查询的 sql 语句,于是我又回到过去,我又得把旧 xml 备份一下,把旧 xml 我自己定义的语句拷贝到新 xml 去。有没有一种类似 ide 的工具,能建立一个针对 mybatis 的 xml 模板的项目,我把 sql 写好,它一键根据 sql 生成新的 xml,而且项目保存状态,我写的 sql 不会删除,下次改了表我改改 sql 再生成一次就行了,感觉一般的 mybatis 生成工具都是针对表本身,我需要自定义 sql 的时候就傻了
incompatible
2017-05-18 23:39:13 +08:00
@abcbuzhiming 你扔掉这个鬼工具自己写 sql 或者自己写个简单的模板引擎只怕会更省事一些吧。。

话说回来,sql 里就 select *好了啊,担心表字段太多 select *影响性能说明表的设计有问题,该拆就拆。
Sql 写得太复杂也是设计有问题,等你并发上来了数据库服务器是很难做 scale out 或 scale up 提升性能的。RDBMS 么就拿他当个带事务的 entity store 就好了,永远只做单表查询(利于做缓存和 sharding ),复杂的 entity 关系在应用层写代码处理(利于 scale out )。复杂 sql 那是大厂们去 IOE 之前那个时代的风俗了。
chocotan
2017-05-18 23:39:55 +08:00
mybatis 可以用注解的,不一定需要 xml
laudukang
2017-05-18 23:42:28 +08:00
Spring-Data-Jpa
hcymk2
2017-05-18 23:47:44 +08:00
那干脆换语言算了, 还用什么 java.
yidinghe
2017-05-18 23:55:30 +08:00
本人的项目,用了多年了:
http://git.oschina.net/yidinghe/hydrogen-dao
miracleyao
2017-05-18 23:58:49 +08:00
可以基于 JDBC 根据自己的需求封装一个,我们公司就是基于 JOSN 格式而不是 XML 的类似 mybatis 的一个插件
crossoverJie
2017-05-19 00:01:08 +08:00
谈下目前我们项目的做法吧:

依然用的是 mybatis 的 generator 工具来生成标准的 crud。
对于标准的 crud 不能满足的情况自定义一个 xxxMapperExt.xml。之后自定义的 SQL 都写到这里边,对于数据结构发生改变对这个 xml 并不会覆盖依然该怎么用就怎么用。
YzSama
2017-05-19 00:57:43 +08:00
@chocotan 对于复杂的查询也用注解?
YzSama
2017-05-19 00:58:08 +08:00
@crossoverJie 求参考资料
shot
2017-05-19 01:16:14 +08:00
spring-data-jpa,复杂查询上 QueryDSL

如果被坑,九成几率是数据库表结构设计有问题。
Cbdy
2017-05-19 07:33:25 +08:00
mybatis.tk:通用 mapper ( jpa ),分页插件
好用记得捐款
mewushuang
2017-05-19 08:02:43 +08:00
很早以前被 xml 坑过,前段时间研究 springboot 的时候好像看到 mybatis 出了 springboot 整合版,支持注解 sql
watzds
2017-05-19 08:22:58 +08:00
Mybatis generator, 在 eclipse 里,自动生成,自动合并自己写的和生成的部分。
seelecpt
2017-05-19 08:41:06 +08:00
@watzds 说的没错,用 eclipse 的插件,才能利用 eclipse 的文件管理特性进行合并。根据声称 xml 和 java 代码的注释自动进行重写,对数据库的字段进行重写。自己开发的部分进行合并。

/**
* @mbggenerated automatically generated by MyBatis Generator, do not modify.
*/


<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
-->
lonenol
2017-05-19 08:55:21 +08:00
你可以增强一下生成工具,在生成工具的配置里维护所有的关系,并且支持增量更新,每次表有修改,重新生成一次就 ok 了
phx13ye
2017-05-19 08:55:25 +08:00
spring data jpa,很难写动态 sql 吧,Specifications 和 Querydsl 感觉都很难用。 @OneToMany @ManyToMany 也容易被滥用,建议还是 mybatis,Mybatis generator 不会动你手动写的部分 xml
Michaelssss
2017-05-19 09:02:06 +08:00
= =如果 sql 和转换不通过自己的方法我就觉得很难学,普遍第三方为了场景完备搞出一堆概念,我很不喜欢,都是自己封装一下,把和 jdbc 通信扔给 SpringTemplate
wupher
2017-05-19 09:27:04 +08:00
之前我和楼主一样,也是偏向使用 SQL 来管理,不太喜欢太多依赖于 ORM 框架。(多年开发运营商养成的习惯)最近,给互联网公司做各种短平快的市场试验型项目,开发过程中数据库模型各种变,发现用 Mybatis 实在低效。一个简单的数据库映射层需要由多个 java 和设置文件来组成。现在,主要使用 GORM + SpringBoot,开发语言也由 java shift 到 groovy。一个数据库层仅需一个模型类即可。数据库由 domain 类直接生成。到上线前再由数据库导出建表 schema 手工优化(其实是为了去外键)。楼主可以试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/362303

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX