V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ZGame
V2EX  ›  Java

好奇 Java mybatis 能火是不是因为 Java 编译器对多行文本的扫码解析不友好?

  •  1
     
  •   ZGame · 2024-08-08 15:20:30 +08:00 · 4012 次点击
    这是一个创建于 390 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个 c#的例子

    var table="";
    string Sql =String.Fomat(@"
    select 
    * from
    {0}
    ",table)
    

    这样子就可以了。

    而在 java 里写 Sql 模板 sting Sql= "" + "" + ,或 append() ,非常令人难受。。

    第 1 条附言  ·  2024-08-08 17:11:44 +08:00
    补充一下,不纠结 sql 注入本身。抛砖引玉,java 语言的能力和语法特性的限制,是不是阻碍了一些优质库的诞生?抛开生态来说,java 敲代码的过程体验是不是不如 c#,kotlin 等高级语言。
    38 条回复    2024-08-11 23:37:07 +08:00
    ccpp132
        1
    ccpp132  
       2024-08-08 15:23:29 +08:00
    也不太行吧,比如这句你得考虑你的 table 有没有特殊字符,放到 sql 里要不要转义
    miaotaizi
        2
    miaotaizi  
       2024-08-08 15:24:25 +08:00
    写到 XML 里面不就好了
    ccpp132
        3
    ccpp132  
       2024-08-08 15:24:26 +08:00
    sql 注入就是早年大家自己拼字符串留下来的经典漏洞
    dif
        4
    dif  
       2024-08-08 15:28:01 +08:00
    也不是吧,mybatis 能火主要是 SQL 能够直观地写出来,便于所谓的调优,另外就是也确实有些业务时 hibernate 无法实现的,必须通过编写 SQL 去解决。

    我做过一个 python 项目,便遇到了类似的问题,因为没有 mybatis ,但 SQL 的拼装又非常复杂,所以最后实现的代码看起来就是依托答辩。但反观用 java mybatis 实现起来 相对来说,清晰了一点。 就我个人而言,一旦遇到数据分析之类的项目,首选肯定时 mybatis, cms 之类的会用 jpa 。 当然根据实际情况混用一下也不是不可以。反正最后都是一座屎山。
    lucasj
        5
    lucasj  
       2024-08-08 15:28:05 +08:00
    "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
    dbpe
        6
    dbpe  
       2024-08-08 15:28:14 +08:00
    1. java14 之前,多行文本支持度不行,一堆“”+“”
    2. 字符串模版木有。。。
    ZZ74
        7
    ZZ74  
       2024-08-08 15:29:37 +08:00
    java 也有 string format 的.....
    主要原因大家都说了
    lisongeee
        8
    lisongeee  
       2024-08-08 15:30:48 +08:00
    可能他们还在用已经发布 10 年的 java8 ,另外我每天都能看到学习 java8 新语法 API 的文章

    最新的 java 早就支持多行文本语法了

    https://docs.oracle.com/en/java/javase/22/text-blocks/index.html
    Goooooos
        9
    Goooooos  
       2024-08-08 15:33:45 +08:00
    @lisongeee mybatis 在 java8 之前就火了
    2024
        10
    2024  
       2024-08-08 15:34:19 +08:00
    现在不都是 orm 吗,为什么还要拼接? 根据 ide 点着下去不就好了。
    user, has := admin2.NewOrmAdminUsers().WhereUsername(req.Username).First()
    sagaxu
        11
    sagaxu  
       2024-08-08 15:39:07 +08:00   ❤️ 1
    是的,mybatis 存活的两个前提:

    1. 缺乏良好的多行文本模板支持

    2. 领导老爱提 JPA 不太方便实现的需求
    ZGame
        12
    ZGame  
    OP
       2024-08-08 15:39:25 +08:00
    @miaotaizi 我感觉 xml 在代码阅读的时候有点不友好 ,强行将 Sql 内容和代码结果集割裂开。
    @dif 是的 报表类的需求我感觉 Sql 原生更好。
    @ccpp132 注入题外话了 ,可以通过 限定参数避免。
    Peachl
        13
    Peachl  
       2024-08-08 16:07:56 +08:00
    拼 sql 很容易有注入 安全问题中 sql 注入的危害太大了 就算限定参数还是有很多绕过手段 而且查询 sql 和代码逻辑分开可以让逻辑清晰很多
    RandomJoke
        14
    RandomJoke  
       2024-08-08 16:12:50 +08:00
    最后不就是.java 和.xml 的区别,你把拼接,验证的过程剥离,不就 daoimpl ,再把验证的过程剥离,不就变成了里面只有类似 xml 里面的语句了。
    dif
        15
    dif  
       2024-08-08 16:13:25 +08:00
    @2024 CMS 没问题,数据报表不行的,很多开窗函数,特殊业务是不支持的。上百行的 SQL ,还是 mybatis 支持度好一点,语法只要能匹配你连接的驱动( hive 、impala 等)就行。
    ma836323493
        16
    ma836323493  
       2024-08-08 16:17:05 +08:00
    我现在用 mybatis plus , 只有复杂查询我才写 sql
    chendy
        17
    chendy  
       2024-08-08 16:18:58 +08:00
    缺少建模能力或者没有建模需求
    倒腾 jpa entity 那点功夫,mybatis 一把梭早就完事了

    另外,你这起码还有个 mybatis ,前几天不是还有个帖子问能不能直接 Map
    JoJoWuBeHumble
        18
    JoJoWuBeHumble  
       2024-08-08 16:36:21 +08:00   ❤️ 2
    国内需求千奇百怪,数据库设计水平设计又不够。
    用 JPA 很容易就坐牢,不如 mybatis 缝缝补补接着用
    txzh007
        19
    txzh007  
       2024-08-08 16:58:02 +08:00
    sql 注入啊,单纯的字符串拼接的 sql 肯定是不能用的
    cstj0505
        20
    cstj0505  
       2024-08-08 17:13:52 +08:00
    orm 框架难道不是取代 jdbc 原生的一坨代码出现的嘛,和支不支持多行文本有啥关系
    james122333
        21
    james122333  
       2024-08-08 17:24:44 +08:00 via Android
    mybatis 也很彆扭 主要的确是 java 字串操作功能太差 变量插入以及 here document 都没有 连 shell 字串处理功能都可以完爆 java 当然都不只是 java 如此 go 也差不多顶多好点 其它更多语言都是一个样
    php 确实写字串也是很快的 所以草创很好用
    ThinkCat
        22
    ThinkCat  
       2024-08-08 17:33:42 +08:00
    要考虑维护性,mybatis 有一个很好的地方是,展现的是 sql ,并且统一在 xml 中的话,后期进行优化或者查阅之类的,直接在 xml 中统一去找。
    james122333
        23
    james122333  
       2024-08-08 17:46:35 +08:00 via Android
    @ThinkCat

    xml 就是最丑的格式 绑定输出对象还要另外写
    不能一劳永逸的解决这问题
    cheng6563
        24
    cheng6563  
       2024-08-08 18:03:46 +08:00
    SQL 本身也是个特殊场景,不能直接往字符串里拼参数而是要拼占位符。
    cheng6563
        25
    cheng6563  
       2024-08-08 18:05:38 +08:00
    而且唯一能拯救的 Java21 的字符串模板也砍掉了要回炉重造
    WDATM33
        26
    WDATM33  
       2024-08-08 19:02:20 +08:00
    统计报表的 sql 不用 xml 直接写 sql 太蛋疼了,动不动就关联十几张表,巨多的字段。 要是用 mybatis-plus 这种一个一个单表查出来在 service 层拼接数据,那维护和调试起来真是血压拉满,有些功能直接用 sql 的功能函数实现方便的多得多。反正最终目的都是为了完成业务需求,没必要用折磨自己的方式来做,怎么快 怎么简单怎么来。xml 还有个好处就是 线上环境 sql 有问题可以直接去线上环境修改文件不用编译 这点挺方便的
    Nosub
        27
    Nosub  
       2024-08-08 20:37:55 +08:00 via iPhone
    @chendy 这位说的在理,搞 jpa 那一套要对面向对象建模有比较深刻的理解,本质上是先有表再有对象,还是先有对象再有表的问题,难度在于对象建模和关系建模不匹配,jpa 要把 hibernate 那一套搞清楚,真的有难度。
    totoro52
        28
    totoro52  
       2024-08-08 21:13:43 +08:00
    扪心自问,拼接的方式最后的结果是什么,就是变成一坨根本没办法维护的、看一次要几分钟甚至几十分钟才能完全看懂的 SQL ,像牛皮癣一样贴在那里, 里面还藏了各种变量拼接。
    potatowish
        29
    potatowish  
       2024-08-08 21:48:03 +08:00 via iPhone
    有 mybatisplus 是不是没必要再用 jpa 了,单表上代码,多表 xml
    yidinghe
        30
    yidinghe  
       2024-08-08 22:07:04 +08:00 via Android
    不是,它火是因为动态 SQL 拼接的方式在当时是独一份。至于多行字符串,mybatis 的 SQL 一般是写在 XML 配置文件里面的,跟 Java 多行字符串表达式没关系。
    ChoateYao
        31
    ChoateYao  
       2024-08-08 23:24:22 +08:00   ❤️ 1
    @potatowish #29 多表可以用 MyBatis Plus Join 。

    在复杂的点不想写 XML 或者在 Mapper 定义的话,可以使用 MyBatis Plus 的 SqlRunner 来处理
    iminto
        32
    iminto  
       2024-08-09 07:47:31 +08:00 via Android
    年轻人还是太年轻,见过和写过的 SQL 太幼稚,才会质疑 mybatis 的能力
    james122333
        33
    james122333  
       2024-08-09 10:20:01 +08:00 via Android
    @cheng6563

    然而占位符也是动态的 占位符可以是变量
    但其实可以避免注入 有避免的情况直接插入变量也无不可
    jaylee4869
        34
    jaylee4869  
       2024-08-09 10:28:30 +08:00
    Java 代码:
    var str = """
    i
    am
    multiline
    """;
    yechentide
        35
    yechentide  
       2024-08-09 11:06:36 +08:00 via iPhone
    比起 MyBatis ,我更喜欢用 Doma2
    cheng6563
        36
    cheng6563  
       2024-08-09 11:11:28 +08:00
    @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 占位符和填充参数.
    james122333
        37
    james122333  
       2024-08-09 23:52:54 +08:00 via Android
    @cheng6563

    当然有意义 占位符并不是万能的 而 mybatis 的填充字串还不如直接写代码 填充字串还包含填充占位符 动态 query 语句还是非常必要的 然而 java 下写法就会非常糟糕
    lingalonely
        38
    lingalonely  
       2024-08-11 23:37:07 +08:00
    不是,xml 是麻烦,但是强约束,强约束意味着开发之后少麻烦
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   997 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:59 · PVG 02:59 · LAX 11:59 · JFK 14:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.