举个 c#的例子
var table="";
string Sql =String.Fomat(@"
select
* from
{0}
",table)
这样子就可以了。
而在 java 里写 Sql 模板 sting Sql= "" + "" + ,或 append() ,非常令人难受。。
1
ccpp132 140 天前
也不太行吧,比如这句你得考虑你的 table 有没有特殊字符,放到 sql 里要不要转义
|
2
miaotaizi 140 天前
写到 XML 里面不就好了
|
3
ccpp132 140 天前
sql 注入就是早年大家自己拼字符串留下来的经典漏洞
|
4
dif 140 天前
也不是吧,mybatis 能火主要是 SQL 能够直观地写出来,便于所谓的调优,另外就是也确实有些业务时 hibernate 无法实现的,必须通过编写 SQL 去解决。
我做过一个 python 项目,便遇到了类似的问题,因为没有 mybatis ,但 SQL 的拼装又非常复杂,所以最后实现的代码看起来就是依托答辩。但反观用 java mybatis 实现起来 相对来说,清晰了一点。 就我个人而言,一旦遇到数据分析之类的项目,首选肯定时 mybatis, cms 之类的会用 jpa 。 当然根据实际情况混用一下也不是不可以。反正最后都是一座屎山。 |
5
lucasj 140 天前
"One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities."
https://mybatis.org/mybatis-3/dynamic-sql.html if, choose, when, otherwise, trim, where, set |
6
dbpe 140 天前
1. java14 之前,多行文本支持度不行,一堆“”+“”
2. 字符串模版木有。。。 |
7
ZZ74 140 天前
java 也有 string format 的.....
主要原因大家都说了 |
8
lisongeee 140 天前
可能他们还在用已经发布 10 年的 java8 ,另外我每天都能看到学习 java8 新语法 API 的文章
最新的 java 早就支持多行文本语法了 https://docs.oracle.com/en/java/javase/22/text-blocks/index.html |
10
2024 140 天前
现在不都是 orm 吗,为什么还要拼接? 根据 ide 点着下去不就好了。
user, has := admin2.NewOrmAdminUsers().WhereUsername(req.Username).First() |
11
sagaxu 140 天前 1
是的,mybatis 存活的两个前提:
1. 缺乏良好的多行文本模板支持 2. 领导老爱提 JPA 不太方便实现的需求 |
12
ZGame OP |
13
Peachl 140 天前
拼 sql 很容易有注入 安全问题中 sql 注入的危害太大了 就算限定参数还是有很多绕过手段 而且查询 sql 和代码逻辑分开可以让逻辑清晰很多
|
14
RandomJoke 140 天前
最后不就是.java 和.xml 的区别,你把拼接,验证的过程剥离,不就 daoimpl ,再把验证的过程剥离,不就变成了里面只有类似 xml 里面的语句了。
|
15
dif 140 天前
@2024 CMS 没问题,数据报表不行的,很多开窗函数,特殊业务是不支持的。上百行的 SQL ,还是 mybatis 支持度好一点,语法只要能匹配你连接的驱动( hive 、impala 等)就行。
|
16
ma836323493 140 天前
我现在用 mybatis plus , 只有复杂查询我才写 sql
|
17
chendy 140 天前
缺少建模能力或者没有建模需求
倒腾 jpa entity 那点功夫,mybatis 一把梭早就完事了 另外,你这起码还有个 mybatis ,前几天不是还有个帖子问能不能直接 Map |
18
JoJoWuBeHumble 140 天前 2
国内需求千奇百怪,数据库设计水平设计又不够。
用 JPA 很容易就坐牢,不如 mybatis 缝缝补补接着用 |
19
txzh007 140 天前
sql 注入啊,单纯的字符串拼接的 sql 肯定是不能用的
|
20
cstj0505 140 天前
orm 框架难道不是取代 jdbc 原生的一坨代码出现的嘛,和支不支持多行文本有啥关系
|
21
james122333 140 天前 via Android
mybatis 也很彆扭 主要的确是 java 字串操作功能太差 变量插入以及 here document 都没有 连 shell 字串处理功能都可以完爆 java 当然都不只是 java 如此 go 也差不多顶多好点 其它更多语言都是一个样
php 确实写字串也是很快的 所以草创很好用 |
22
ThinkCat 140 天前
要考虑维护性,mybatis 有一个很好的地方是,展现的是 sql ,并且统一在 xml 中的话,后期进行优化或者查阅之类的,直接在 xml 中统一去找。
|
23
james122333 140 天前 via Android
|
24
cheng6563 140 天前
SQL 本身也是个特殊场景,不能直接往字符串里拼参数而是要拼占位符。
|
25
cheng6563 140 天前
而且唯一能拯救的 Java21 的字符串模板也砍掉了要回炉重造
|
26
WDATM33 140 天前
统计报表的 sql 不用 xml 直接写 sql 太蛋疼了,动不动就关联十几张表,巨多的字段。 要是用 mybatis-plus 这种一个一个单表查出来在 service 层拼接数据,那维护和调试起来真是血压拉满,有些功能直接用 sql 的功能函数实现方便的多得多。反正最终目的都是为了完成业务需求,没必要用折磨自己的方式来做,怎么快 怎么简单怎么来。xml 还有个好处就是 线上环境 sql 有问题可以直接去线上环境修改文件不用编译 这点挺方便的
|
27
Nosub 140 天前 via iPhone
@chendy 这位说的在理,搞 jpa 那一套要对面向对象建模有比较深刻的理解,本质上是先有表再有对象,还是先有对象再有表的问题,难度在于对象建模和关系建模不匹配,jpa 要把 hibernate 那一套搞清楚,真的有难度。
|
28
totoro52 140 天前
扪心自问,拼接的方式最后的结果是什么,就是变成一坨根本没办法维护的、看一次要几分钟甚至几十分钟才能完全看懂的 SQL ,像牛皮癣一样贴在那里, 里面还藏了各种变量拼接。
|
29
potatowish 140 天前 via iPhone
有 mybatisplus 是不是没必要再用 jpa 了,单表上代码,多表 xml
|
30
yidinghe 140 天前 via Android
不是,它火是因为动态 SQL 拼接的方式在当时是独一份。至于多行字符串,mybatis 的 SQL 一般是写在 XML 配置文件里面的,跟 Java 多行字符串表达式没关系。
|
31
ChoateYao 140 天前 1
@potatowish #29 多表可以用 MyBatis Plus Join 。
在复杂的点不想写 XML 或者在 Mapper 定义的话,可以使用 MyBatis Plus 的 SqlRunner 来处理 |
32
iminto 139 天前 via Android
年轻人还是太年轻,见过和写过的 SQL 太幼稚,才会质疑 mybatis 的能力
|
33
james122333 139 天前 via Android
|
34
jaylee4869 139 天前
Java 代码:
var str = """ i am multiline """; |
35
yechentide 139 天前 via iPhone
比起 MyBatis ,我更喜欢用 Doma2
|
36
cheng6563 139 天前
@james122333 主要是字符串模板,都填占位符了,字符串模板也没啥意义了,当涉及到动态添加条件就会很繁琐。
比如 Mybatis XML 里面写一些查询方法 SQL 经常会这样操作: select columns from table where 1=1 <if test="status0"> and status0=#{status0} </if> <if test="status1"> and status1=#{status1} </if> <if test="status2"> and status2=#{status2} </if> 这种逻辑用编程来处理就是很烦,要同时拼接 SQL 占位符和填充参数. |
37
james122333 138 天前 via Android
@cheng6563
当然有意义 占位符并不是万能的 而 mybatis 的填充字串还不如直接写代码 填充字串还包含填充占位符 动态 query 语句还是非常必要的 然而 java 下写法就会非常糟糕 |
38
lingalonely 137 天前
不是,xml 是麻烦,但是强约束,强约束意味着开发之后少麻烦
|