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

现在用 mybatis 都不用 xml 了吗

  •  1
     
  •   noble4cc · 2019-03-06 15:11:23 +08:00 · 15239 次点击
    这是一个创建于 2124 天前的主题,其中的信息可能已经有所发展或是发生改变。

    都用注解的形式了吗? 另外有没有更简洁的 orm 用,做不太复杂的项目效率高点的

    41 条回复    2019-03-07 12:58:00 +08:00
    brucewuio
        1
    brucewuio  
       2019-03-06 15:16:39 +08:00
    不复杂的话 尝试一下 go 的 gorm
    hjchjc1993
        2
    hjchjc1993  
       2019-03-06 15:49:03 +08:00   ❤️ 1
    spring data jpa
    cafreeze
        3
    cafreeze  
       2019-03-06 15:52:29 +08:00
    spring data jpa
    yiyi11
        4
    yiyi11  
       2019-03-06 15:58:43 +08:00
    同意楼上,不复杂的话用 spring data jpa。
    daveze
        5
    daveze  
       2019-03-06 15:59:16 +08:00
    mybatis-plus
    TommyLemon
        6
    TommyLemon  
       2019-03-06 16:15:36 +08:00
    TommyLemon
        7
    TommyLemon  
       2019-03-06 16:16:55 +08:00
    不用写代码,自动化接口和文档 ORM 库 APIJSON,5K Star 远超 Java 第二大 ORM 库 Hibernate
    https://www.oschina.net/news/101787/apijson-3-1-0-released#comments
    sonyxperia
        8
    sonyxperia  
       2019-03-06 16:18:44 +08:00   ❤️ 1
    @brucewuio #1 你这种推荐,是让人家把整个项目语言都换了吗?
    TommyLemon
        9
    TommyLemon  
       2019-03-06 16:19:26 +08:00
    lhx2008
        10
    lhx2008  
       2019-03-06 16:19:49 +08:00
    Mybatis 不能算是真 ORM 吧,如果用 Mybatis 的话,XML 还是少不了,写在代码里面有点难看。
    但是现在 SpringBoot 越来越多人用 Spring Data JPA 了,不过灵活性和性能都稍差
    用 Jooq 也可以,不过功能没有 JPA 强大
    TommyLemon
        11
    TommyLemon  
       2019-03-06 16:19:55 +08:00
    Malthael
        12
    Malthael  
       2019-03-06 16:20:11 +08:00
    感觉还是自己手写 sql 比较放心,注解感觉看着难看,尤其是长 sql
    yukiww233
        13
    yukiww233  
       2019-03-06 16:27:28 +08:00
    这一大波硬广。。
    LemonCoo1
        14
    LemonCoo1  
       2019-03-06 16:42:30 +08:00
    mybatis-plus , tk Mapper
    toconoma
        15
    toconoma  
       2019-03-06 16:45:24 +08:00
    用 xml 更方便管理吧,sql 跟代码分离
    rizon
        16
    rizon  
       2019-03-06 17:07:50 +08:00   ❤️ 1
    @LemonCoo1 #14
    @daveze #5
    +1
    mybatis-plus 简直不要更爽,公司新项目我推行的使用这个插件。配合 lambda,写代码就像写诗一样的优雅精致
    codingadog
        17
    codingadog  
       2019-03-06 17:10:08 +08:00 via Android
    射爆科技可还行
    我一直用 xml。。。毕竟灵活啊
    qiyuey
        18
    qiyuey  
       2019-03-06 17:11:51 +08:00
    目前来看 注解 相比 XML 和 ORM,功能性、灵活性、可开发性都是有一定优势的,所以我之前在美团的团队都是使用注解的,后来来了阿里,也带动同事都使用注解了
    TommyLemon
        19
    TommyLemon  
       2019-03-06 17:30:01 +08:00
    @codingadog 射爆科技 是啥?英文错打成汉字了?
    leon0903
        20
    leon0903  
       2019-03-06 17:39:26 +08:00
    我也觉得注解方式比 xml 方式要好啊。。。。看代码一眼就能看到 sql,不需要任何跳转之类,不用分散注意力。
    BCy66drFCvk1Ou87
        21
    BCy66drFCvk1Ou87  
       2019-03-06 17:42:22 +08:00
    受不了 XML
    lihongjie0209
        22
    lihongjie0209  
       2019-03-06 17:50:36 +08:00   ❤️ 1
    @brucewuio 在 java 中如何尝试 go 的 orm ?
    TommyLemon
        23
    TommyLemon  
       2019-03-06 18:33:58 +08:00
    上面提到的各种通用 Mapper 的确做到了 单表 的增删改查,省去了大量的 SQL 或 调用 ORM 方法的代码,
    但即便这样,还是远远不如 APIJSON,因为用 APIJSON 自动化 API 后端都不用写代码!
    更不用说 APIJSON 还支持多表组合、自由嵌套、各种 JOIN 了,
    还有 多字段排序 order by,多字段分组 group by,聚合函数 having 等几乎所有 SQL 的常用功能,
    支持 MySQL, PostgreSQL, Oracle 数据库,可跨数据库、跨模式查询,甚至是 JOIN 查询(APP JOIN),
    以上这些功能全都不用后端写一行代码就能提供给前端 增删改查 的各种 API !
    创作不易,GitHub 右上角点 Star 支持下吧^_^
    github.com/TommyLemon/APIJSON
    TommyLemon
        24
    TommyLemon  
       2019-03-06 18:39:20 +08:00
    @hjchjc1993 @cafreeze @daveze @yiyi11 @lhx2008 @LemonCoo1 @rizon
    Spring Data JPA,Mybatis-Plus,tk Mapper 都是要后端写代码的哦
    blless
        25
    blless  
       2019-03-06 18:47:31 +08:00 via Android   ❤️ 1
    @TommyLemon 推广哥你又来辣
    k9990009
        26
    k9990009  
       2019-03-06 19:02:40 +08:00 via Android
    mybatis-plus +1,在此基础上做请求参数解析,结合这个插件,做个 CURD 的框架,单表的 CURD 完全不用写,只要写前端。要重写的都是多表操作,和特殊的业务。
    9Rubi
        27
    9Rubi  
       2019-03-06 19:05:56 +08:00
    广告太硬
    mango88
        28
    mango88  
       2019-03-06 20:32:04 +08:00 via iPhone
    spring boot + JPA
    zjp
        29
    zjp  
       2019-03-06 20:46:29 +08:00
    注解没有实现全部功能,在注解写 XML 字符串真的难受...
    fkdog
        30
    fkdog  
       2019-03-06 20:55:39 +08:00
    真心觉得那什么 mybatis-plus 也没什么存在的必要,一个功能 N 种风格迥异的 api 用的真是渗的慌。

    mybatis 不好用主要还是由于缺乏通用 mapper 支持,字段多的表 create/update 手写非常复杂。

    自己写个 sqlprovider,以及 crud 通用接口,根据反射获取一下 entity 字段拼接一下 create/update 的 sql 语句就好了。2 个 java 类的事。
    S9Yh4wIFsBG7jnE4
        31
    S9Yh4wIFsBG7jnE4  
       2019-03-06 21:05:45 +08:00
    我从 jpa 才改成了现在的 mybatis 注解形式的 依然是 springboot 所以 jpa 和 mybatis 都会单表的增删查改
    jpa 确实很方便 不需要自己去写 sql 语句,但是你如果想改 也可以在 repository 接口里,覆盖原有的方法,自己写 sql
    jpa 是根据你的实体类去创建表,mybatis 要你先创建好了再对应到实体类
    BBCCBB
        32
    BBCCBB  
       2019-03-06 21:08:44 +08:00
    用 tkmybatis 或者 mybatis-plus, 但是不要用它的其他 api, 只用它单表的增删查改,其他的全部用 mybatis 方式写 sql。
    GTim
        33
    GTim  
       2019-03-06 21:15:16 +08:00
    用啊用啊,注解形式那是简单的还可以,复杂的工程,改一个代码会死人
    gowk
        34
    gowk  
       2019-03-07 08:11:50 +08:00 via Android
    虽然我也是 Go 吹,但不是这么吹的。。
    我建议用 jdbcTemplate,灵活强大,或者 mybatis-plus,个人不喜欢 JPA
    gejun123456
        35
    gejun123456  
       2019-03-07 08:36:30 +08:00 via iPhone
    注解简单的 sql 还行 复杂的写 xml 好 resultmap 好维护 推广一波我开发的 idea 插件 :) mybatis 像 springdatajpa 一样生成 sql 大幅提升效率 https://github.com/gejun123456/MyBatisCodeHelper-Pro

    https://raw.githubusercontent.com/gejun123456/MyBatisCodeHelper-Pro/master/screenshots/mybatisCodeHelper.gif
    liuyibao
        36
    liuyibao  
       2019-03-07 09:52:05 +08:00
    PHPer 都知道再好用也不会有 php 框架的查询构造器厉害😃
    TommyLemon
        37
    TommyLemon  
       2019-03-07 11:40:51 +08:00
    @liuyibao 能做到不写代码吗?/滑稽

    APIJSON 就做到了。
    后端不用写接口、也不用写文档就能提供"接口"和"文档",前端 /客户端不用看"文档"就能调用"接口"。
    https://github.com/TommyLemon/APIJSON/wiki
    TommyLemon
        38
    TommyLemon  
       2019-03-07 11:43:28 +08:00
    @9Rubi 没看到帖子里有广告啊,Mybatis 都这么火了还需要推广嘛
    TommyLemon
        39
    TommyLemon  
       2019-03-07 11:56:52 +08:00
    @zjp @GTim @fkdog @shayang888 @gejun123456
    不管是注解还是调用 ORM 或 Mapper 的方法,都很难做复杂的查询,尤其是连表查询、子查询等,
    而且都要写一堆繁琐的配置,不直观甚至有些还做不了。

    APIJSON 就提供了自动化的各种 JOIN
    #④ "join":"&/Table0/key0@,</Table1/key1@"
    多表连接方式:
    "<" - LEFT JOIN
    ">" - RIGHT JOIN
    "&" - INNER JOIN
    "|" - FULL JOIN
    "!" - OUTTER JOIN
    "@" - APP JOIN
    其中 @ APP JOIN 为应用层连表,会从已查出的主表里取得所有副表 key@ 关联的主表内的 refKey 作为一个数组 refKeys: [value0, value1...],然后把原来副表 count 次查询 key=$refKey 的 SQL 用 key IN($refKeys) 的方式合并为一条 SQL 来优化性能;
    其它 JOIN 都是 SQL JOIN,具体功能和 MySQL,PostgreSQL 等数据库的 JOIN 一一对应,
    "ViceTable":{ "key@:".../MainTable/refKey" }
    会对应生成
    MainTable ... JOIN ViceTable ON ViceTable.key=MainTable.refKey。

    例如
    {
    "[]": {
    "join": "&/User/id@,</Comment/momentId@",
    "Moment": {
    "@order": "date-"
    },
    "User": {
    "@column": "id,name",
    "name~": "t",
    "id@": "/Moment/userId"
    },
    "Comment": {
    "momentId@": "/Moment/id"
    }
    }
    }
    自动生成
    SELECT Moment.*,User.id,User.name,Comment.* FROM Moment
    INNER JOIN User ON User.id = Moment.userId
    LEFT JOIN(
    SELECT * FROM Comment
    ) AS Comment ON Comment.momentId = Moment.id
    WHERE User.name REGEXP 't'
    ORDER BY Moment.date DESC
    LIMIT 10 OFFSET 0


    #还有自动化子查询
    "key@":{
    "range": "ALL",
    "from":"Table",
    "Table":{ ... }
    }
    其中:
    range 可为 ALL,ANY ;
    from 为目标表 Table 的名称;
    @ 后面的对象类似数组对象,可使用 count 和 join 等功能。
    例如
    "id@":{
    "from":"Comment",
    "Comment":{
    "@column":"min(userId)"
    }
    }
    自动生成
    WHERE id=(SELECT min(userId) FROM Comment)

    GitHub 右上角点 Star 支持下吧 ^_^
    https://github.com/TommyLemon/APIJSON/blob/master/Document.md#3.2
    TommyLemon
        40
    TommyLemon  
       2019-03-07 11:59:30 +08:00
    @TommyLemon 都是根据前端传的请求 JSON 自动生成的 SQL,后端不用写一行代码哦
    jasondeepy
        41
    jasondeepy  
       2019-03-07 12:58:00 +08:00 via iPhone
    @rizon spingboot 能用这个么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2361 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.