各位的代码里还在用 SQL 语句吗?怎么管理的

2018-11-11 14:51:38 +08:00
 magicdu
如题,大家或者大家的公司怎么处理业务逻辑复杂的 SQL 语句呢,用 mybatis 呢?还是干脆舍弃了 SQL 呢,采用其他的方式呢?
14859 次点击
所在节点    Java
104 条回复
TommyLemon
2018-11-12 12:20:56 +08:00
@TommyLemon #68 楼 和 #32 楼
buhi
2018-11-12 12:56:58 +08:00
楼上疯狂打广告真的辛苦了
kslr
2018-11-12 13:20:39 +08:00
ORM 方便啊,API 都可以直接抽象出来,性能以后可以慢慢优化
GiantHard
2018-11-12 13:44:53 +08:00
简单的增删改查就直接 EF Core,方便快捷,复杂的,就直接 Dapper 手撸 SQL 或者存储过程
ohoh
2018-11-12 13:59:17 +08:00
@TommyLemon 你的项目出发点很好,可是这个用 star 数来和其他项目做比较性是不恰当的吧! issues 数少的可怜说明用的人太少,做贡献的也太少了,现在哪个公司不是在追赶业务速度,你这个项目任重而道远
Arcy
2018-11-12 14:10:27 +08:00
@linbiaye #50 2.1.2 从 git 上下载下来,无法加载配置,win 10 + idea 2018.2.5
zhangalong69
2018-11-12 14:12:44 +08:00
手写 sql
TommyLemon
2018-11-12 14:46:19 +08:00
@ohoh 使用率确实没有 Hibernate 高,毕竟它从 07 年开源到现在都快 12 年了,APIJSON 才 2 年多一点。
哪个开源库的 star/issue 等不是从 0 开始的呢?
如果都是你这种想法,Hibernate,Mybatis,OKHTTP,Vue.js 等非 大厂 /名人 出的开源库也不会流行起来了。

Hibernate 都关掉 issue 了。
你可以说 issue 数量多反映使用率高,
我也可以认为 issue 数量相对少体现 bug 少及简单易用,
才没有大量的 issue 来提交 bug、咨询使用方法 /文档 等。

越是追赶业务,越要用简单易用、快速实现功能的工具啊,
Hibernate 等一堆 ORM 库都是要针对每个接口写一堆 封装对象 或 注解传 SQL、写 XML 的代码,
APIJSON 提供了自动化的 CRUD 接口个,就能做到不写代码,
前端传一个 JSON,后端自动转 SQL 并连接数据库执行,然后返回结果,
当需求更改时,也不用后端修改或新增代码,前端把 JSON 改一下数据或结构就行。
linbiaye
2018-11-12 14:53:16 +08:00
@Arcy 方便+我 qq 么 Mjg3MDgwOTQ1Cg==
TommyLemon
2018-11-12 15:05:16 +08:00
@TommyLemon
Star 虽然不代表使用率,但也能在比较大的程度上反映 Repo 在开源社区的受欢迎程度,可以看下这个趋势图
https://www.timqian.com/star-history/#TommyLemon/APIJSON&hibernate/hibernate-orm
ojoehao
2018-11-12 15:07:09 +08:00
@gowk 说的这么绝对呀 各有千秋吧 虽然我也比较偏 mybatis
gsralex
2018-11-12 15:21:28 +08:00
你可以用下,我写的
https://github.com/gsralex/gdata
决心要把 sql 从 java 代码中消除,个人觉得是错误的想法。用 mybatis 的 xml 来替代 java 控制 sql,就好比你把原来的鼠标去掉,换用 thinkpad 的指点杆,你要知道 xml 表达能力很弱,完全不适合在里面加入 ifelse 的语句。
xiangyuecn
2018-11-12 15:47:15 +08:00
手撸了几个类拼接 sql 语句发给数据库执行,这种不知道算不算手写 sql

```
//读取数据
FieldRead read=new FiledRead(Table.User);
read.Long("id");
read.String("name");
read.Date("time")

//生成:select top 100 id,name from userTable where 1=1 order by id desc
read.List(100,new SQL().Cmd("1=1 order by id desc"));//[{id:123,name:"name",time:123456789},...100]
//生成:select top 1 id,name from userTable where id=123
read.One(new SQL().Cmd("id=").Long(RequestUserID));//{id:123,name:"name",time:123456789}

//修改数据
FieldSave save=new FieldSave(Table.User);
save.Long("id",newUID());
save.String("name","来搞我啊");
save.Date("time", Now())
//save.Update(new SQL().Cmd("id=").Long(123));
//生成:insert into userTable(id,name,time) values(123,'transform 搞你妹','8102-11-12 15:45')
save.Insert();
```
xipushi
2018-11-12 16:02:32 +08:00
select,insert,update 单表 JPA 挺爽, 带条件的分页查询,只有 Example.of 用着爽
select * from table where a in(1,2,3) and b in(2,3,4) limit 1,10, 条件是动态的,谁知道 JPA 怎么做得比较爽?这种还是拼 SQL 爽
Hibernate 怎么用 MySql 批量插入语法? MySql 原生语法 1 秒 insert 几千条,Hibernate 1 秒几十条
passerbytiny
2018-11-12 17:07:26 +08:00
@xipushi Hibernate 有 batchInsert 方法,另外如果你开启了事务,几千条之内的插入,它有可能会自动缓存然后批量插入。

JPA 的动态查询(其实还是 Hibernate 的)要用到 Criteria API,或者 Spring 提供的 JpaSpecificationExecutor<T>,但是比较重量级,需要先理解对象型数据(而非关系型数据)的查询原理(跟 SQL 或 HQL 完全不一样)。

有一点很关键,如果脑袋还有 SQL 的概念,那么用 JPA/Hibernate 回很吃力。Hibernate 的合理分工应该是,Java 人员只负责定义实体类,Hibernate 框架负责自动生成表,DBA 负责优化数据库和映射关系。当然,如果已经能达到上面的分工了,那么异步编程、事件编程、领域驱动设计这些概念估计也已经用上了。
xipushi
2018-11-12 18:48:59 +08:00
@passerbytiny 刚看了下 QueryDSL,动态分页查询,感觉还是搞事。

我说的 MySql 的批量 insert, 不是批量提交。是 insert table()values(),(),(), 一条 SQL 语句插入多条数据,batchInsert 是多条 insert 语句, 数据库的特性,批量提交比一条语句要慢点。

Hibernate 的合理分工是理想状态,现实中我没看到只用 HQL, 不用 native SLQ。还是要有 SQL 概念,不然前人留下的代码你就看不懂了。
feverzsj
2018-11-12 19:10:49 +08:00
不用 sql 用什么?二进制格式协议速度是最快的
V2XEX
2018-11-12 19:19:53 +08:00
@TommyLemon
看你推广 apijson 挺久了,不过你能说下你这玩意比 Spring Data Rest 有声明绝对优势?
TommyLemon
2018-11-12 19:24:47 +08:00
@V2XEX 不用写代码
TommyLemon
2018-11-12 19:25:32 +08:00
@TommyLemon
为什么要用 APIJSON ?前后端 10 大痛点解析
github.com/TommyLemon/APIJSON/wiki

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

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

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

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

© 2021 V2EX