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

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

  •  1
     
  •   ZGame · 140 天前 · 3385 次点击
    这是一个创建于 140 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个 c#的例子

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

    这样子就可以了。

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

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

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

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

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

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

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

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

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

    在复杂的点不想写 XML 或者在 Mapper 定义的话,可以使用 MyBatis Plus 的 SqlRunner 来处理
    iminto
        32
    iminto  
       139 天前 via Android
    年轻人还是太年轻,见过和写过的 SQL 太幼稚,才会质疑 mybatis 的能力
    james122333
        33
    james122333  
       139 天前 via Android
    @cheng6563

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

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