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 有没有生产力高一点的工具,或者有没有优秀一点的替代品?
13021 次点击
所在节点    Java
68 条回复
uugklp
2017-05-18 20:23:27 +08:00
incompatible
2017-05-18 20:54:22 +08:00
姿势错了。
resultMap 并非是必要的,你可以在<select/>里写 resultType="java bean fqcn",sql 里写 select *或者 select column_name as javaBeanPropertyName,这样 mybatis 就可以自动做影射。
另外如果你的数据库表的 column_name 跟 java bean 的 propertyName 完全一致只不过前者用了 under_score 后者用了 camelCase,你还可以在 mybatis-config.xml 中指定 settings.setting.mapUnderscoreToCamelCase=true 来让 mybatis 自动完成 under_score 和 camelCase 的互相映射。
changhe626
2017-05-18 21:02:32 +08:00
那个什么自己封装一个 JDBC 呗
qiyuey
2017-05-18 21:09:35 +08:00
用注解
changdy
2017-05-18 21:11:01 +08:00
感觉问题并不是处在 mybatis 上面,而是数据库的频繁改动吧.
hcymk2
2017-05-18 21:19:42 +08:00
感觉是个反的, 应该是模型的变化再反应到数据库表结构的改变。
reeco
2017-05-18 21:22:29 +08:00
对于这种需要频繁变动表结构的,hibernate 挺合适的。
darrenfang
2017-05-18 21:32:56 +08:00
一直用 hibernate,最近在学 spring data jpa
abcbuzhiming
2017-05-18 21:36:05 +08:00
@incompatible 啊,谢谢,但是我还有个问题,如果我的数据库字段名和 java bean 的字段名是完全一致的话,那其实就 mapUnderscoreToCamelCase=true 都不用了,直接完全映射了是吗?
abcbuzhiming
2017-05-18 21:36:50 +08:00
@changdy 除非你的公司是大型企业,从事的项目都是大型商业项目,否则我见没见过需求变动不剧烈的,越是中小型公司,越是互联网企业,需求变动越剧烈
incompatible
2017-05-18 21:59:29 +08:00
@abcbuzhiming 没错,这种情况就不需要 mapUnderscoreToCamelCase 了。
另外,实体变动频繁的话,更好的方式是开发阶段 spring-data-mongo + mongodb。上线时把 spring-data-mongo 切成 spring-data-jpa + rdbms 就好了。
xliao
2017-05-18 22:06:27 +08:00
spring data jpa+1, 有个项目在用,感觉很好用。原来一个项目在开发中发现 Mybatis 在一些场景下局限性,很后悔当时选择了它,然而现在换己经来不及了。
CFO
2017-05-18 22:13:23 +08:00
确实有这个问题 我解决的方式是不用 xml 全部用注解 然后不直接用生成的 mapper 自己写个 mapper 继承自动生成的 整个过程都使用自己写的这个 mapper 这样就算重新生成后 改动也会小很多
nonesuccess
2017-05-18 22:19:18 +08:00
@CFO 注解是把 sql 写到 java 类里面的那种方法吗
paragon
2017-05-18 22:41:53 +08:00
mybatis 不是写好数据库基本 CRUD 都可以用生成器生成么?
slixurd
2017-05-18 22:42:06 +08:00
@nonesuccess 是.在 Annotation 中直接写 SQL 即可
遇到复杂的 SQL,用 SelectProvider,*Provider 之类的方法 workaround 一下就好了....
除非特别复杂的 SQL,一般都不用 XML....
WispZhan
2017-05-18 22:53:17 +08:00
JOOQ ?
abcbuzhiming
2017-05-18 22:56:53 +08:00
@paragon 基本 crud 压根没卵用,查询只能针对主键 id,很多场景都是针对特定字段的
abcbuzhiming
2017-05-18 22:58:59 +08:00
@CFO 你的意思是注解 SQL 语句到 mapper 的接口方法上吗,然后你的 mapper 是动态生成的?
fifman
2017-05-18 23:03:52 +08:00
强烈推荐 spring data jpa。默认集成 hibernate,不需要你写 orm 映射配置,实体类通过注解直接和表关联。DAO 方法只需要定义接口,实现自动生成

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

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

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

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

© 2021 V2EX