ZGame
V2EX  ›  Java

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

  •  1
     
  •   ZGame · Aug 8, 2024 · 7233 views
    This topic created in 820 days ago, the information mentioned may be changed or developed.

    举个 c#的例子

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

    这样子就可以了。

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

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

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

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

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

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

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

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

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

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

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

    当然有意义 占位符并不是万能的 而 mybatis 的填充字串还不如直接写代码 填充字串还包含填充占位符 动态 query 语句还是非常必要的 然而 java 下写法就会非常糟糕
    lingalonely
    lingalonely
    Aug 11, 2024
    38
    不是,xml 是麻烦,但是强约束,强约束意味着开发之后少麻烦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2169 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 130ms · UTC 12:52 · PVG 20:52 · LAX 04:52 · JFK 07:52
    ♥ Do have faith in what you're doing.