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

重新定义 Mybatis 动态 SQL,新模式下不再推荐 XML 了

  •  1
     
  •   olOwOlo · 2018-02-07 20:54:41 +08:00 · 7359 次点击
    这是一个创建于 2241 天前的主题,其中的信息可能已经有所发展或是发生改变。

    快速了解这是什么:

    • 全新的 ByExample 方法

      List<Employee> employees = mapper.selectByExample()
          .where(id, isLessThan(10), and(employed, isEqualTo("foo")))
          .or(occupation, isLike("b%"))
          .orderBy(id.descending())
          .build()
          .execute();
      // where (id < ? and employed = ?) or occupation like ? order by id DESC
      
    • 可构造任意 SQL

      SelectStatementProvider selectStatement = select(id, firstName, lastName, birthDate, employed, occupation)
          .from(employee)
          .where(firstName, isEqualTo("Bob"), or(firstName, isEqualTo("Alice")))
          .build()
          .render(RenderingStrategy.MYBATIS3);
      
      List<Employee> employees = mapper.selectMany(selectStatement);
      

    这是一个新库的说,至少:

    • 需要额外依赖 mybatis-dynamic-sql

      <dependency>
        <groupId>org.mybatis.dynamic-sql</groupId>
        <artifactId>mybatis-dynamic-sql</artifactId>
        <version>1.0.0</version>
      </dependency>
      
    • Java 8 及以上

    • MyBatis 3.4.2 及以上

    MyBatis Generator (>= 1.3.6) 也已经提供支持,只需要将 context 的 targetRuntime 属性更改为 MyBatis3DynamicSQL 即可生成新的动态 SQL。

    <generatorConfiguration>
      ...
      <context ... targetRuntime="MyBatis3DynamicSQL" ...>
        ...
      </context>
    </generatorConfiguration>
    

    该模式下不再生成 XML,不再生成 Example 类。文档里也推荐:join 操作要用到的 resultMap 应该是 XML 文件中的唯一元素。

    话说个人还是挺偏好 XML 的 ╮( ̄▽ ̄)╭ ,不知道各位老司机怎么看?


    写了一篇文章简单介绍一下基本的使用 Mybatis Dynamic SQL - 重新定义 Mybatis 动态 SQL (〃ノωノ)

    25 条回复    2018-02-22 16:03:08 +08:00
    Cbdy
        1
    Cbdy  
       2018-02-07 21:05:28 +08:00 via Android   ❤️ 1
    这不是。。jooq 吗
    xiaoyangsa
        2
    xiaoyangsa  
       2018-02-07 21:30:05 +08:00
    咋整,用了国产的了~~
    复杂的宁愿丢 xml 里。简单的这样搞搞差不多
    nita22
        3
    nita22  
       2018-02-07 21:36:14 +08:00
    XML 里面直接写 SQL 语句才是最直观的吧,用这个动态 SQL 反而使得 SQL 语句跟业务代码糅杂起来了
    jorneyr
        4
    jorneyr  
       2018-02-07 21:36:33 +08:00
    写了这么多,有 SQL 清晰么
    l00t
        5
    l00t  
       2018-02-07 21:43:14 +08:00 via Android
    改成这样有什么好处吗?
    iyaozhen
        6
    iyaozhen  
       2018-02-07 22:04:09 +08:00 via Android
    一直不喜欢.where 这种写法,业务稍微复杂点就懵逼了。一个多月不写就忘了。还是 sql 直接
    kran
        7
    kran  
       2018-02-07 22:04:22 +08:00 via iPhone
    好处是类型安全吧
    Rickkkkkkk
        8
    Rickkkkkkk  
       2018-02-07 22:13:14 +08:00
    sql 还绑在代码里不恶心吗

    xml 多简洁
    lonenol
        9
    lonenol  
       2018-02-07 23:00:27 +08:00
    ...那还不如用 JPA...
    yejinmo
        10
    yejinmo  
       2018-02-07 23:04:50 +08:00
    折腾来折腾去本质不还是 sql 么。。真是搞不懂非要简单问题复杂化
    lhx2008
        11
    lhx2008  
       2018-02-07 23:15:55 +08:00 via Android
    挺好的,但是关联查询,自动装配好像都没有
    iyangyuan
        12
    iyangyuan  
       2018-02-08 08:54:50 +08:00 via iPhone
    这样不仅损失性能,也增加了复杂 sql 维护难度,又徒增了学习成本
    NullException
        13
    NullException  
       2018-02-08 10:06:26 +08:00
    @iyangyuan 看到他那种用法让我想起 myBatis Plus,写写简单的 sql 还可以,复杂的还是自己来
    CtrlSpace
        14
    CtrlSpace  
       2018-02-08 10:26:30 +08:00
    Android 转 Java 的觉得,xml 真是很难看,不如代码。
    CtrlSpace
        15
    CtrlSpace  
       2018-02-08 10:30:27 +08:00
    喜欢 xml 的只是习惯了 xml,对于没接触过的人来说,代码(或许)是最舒服的。
    bobuick
        16
    bobuick  
       2018-02-08 11:13:34 +08:00
    我猜,因为喜欢封装。
    itll
        17
    itll  
       2018-02-08 11:35:35 +08:00
    就是不习惯 jpa 才用 Mybatis,还是直接 sql 方便
    0Kelvin
        18
    0Kelvin  
       2018-02-08 14:36:08 +08:00
    emmm. Java 的一套怎么感觉在慢慢的向 C#靠近呢。
    olOwOlo
        19
    olOwOlo  
    OP
       2018-02-08 16:21:00 +08:00
    (〃ノωノ) 感觉不怎么受欢迎的样子呢~~
    olOwOlo
        20
    olOwOlo  
    OP
       2018-02-08 16:21:59 +08:00
    @Cbdy #1 请教了一下 Google 老师,发现你说的这个成熟多了。。
    olOwOlo
        21
    olOwOlo  
    OP
       2018-02-08 16:22:37 +08:00
    @lhx2008 #11 关联查询有的啊。自动装配是指依赖注入么,这个跟以前的 mapper 没啥区别啊,只不过增加了一种构造 SQL 的方法罢了
    olOwOlo
        22
    olOwOlo  
    OP
       2018-02-08 16:24:18 +08:00
    @iyangyuan #12 别的不好说,拼接个字符串而已,哪里会损失什么性能嘛
    xiangR
        23
    xiangR  
       2018-02-08 16:42:23 +08:00
    有的时候调试 sql 语句,直接把 xml 上的东西复制到 navicat 中,运行查看结果。
    写在代码里面,好像只能使用启动工程的形式调试了。
    而且对于大 sql,用这种方式,简直了...
    kzzhr
        24
    kzzhr  
       2018-02-18 15:07:11 +08:00
    正在造轮子: https://github.com/Kretech/Loulan#quick-start
    不过更强调复杂查询下的查询复用
    LeeSeoung
        25
    LeeSeoung  
       2018-02-22 16:03:08 +08:00
    - -不如 xml 写 sql 来的直接
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3347 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 13:39 · PVG 21:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.