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

对比 MyBatis,你看出什么端倪?

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

    项目地址: https://github.com/braisdom/ObjectiveSql

    1 简单查询

    @DomainModel
    public class Blog {
        private Long id;
        private String title;
        private Integer state;
        @Relation(relationType = RelationType.BELONGS_TO)
        private Author author;
    }
    

    根据单字段查询

    MyBatis ObjectiveSQL
    public interface BlogMapper {
      @Select("SELECT * FROM blog WHERE id = #{id}")
      Blog selectBlog(int id);
    }
    ...
    BlogMapper mapper = session.getMapper(BlogMapper.class); 
    Blog blog = mapper.selectBlog(i);
    
    Blog blog = Blog.queryByPrimaryKey(1);
    

    稍微复杂一点的查询

    MyBatis ObjectiveSQL
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
      <select id="findByTitle" resultType="Blog">
        select * from Blog where title like  '%#{title}%'
      </select>
    </mapper>
    ...
    BlogMapper mapper = session.getMapper(BlogMapper.class); 
    Blog blog = mapper.findByTitle("标题");
    
    public static Blog queryByTitle(String title) {
         Query<Blog> query = createQuery();
         query.where("title like ?",  "%" + title + "%");
         return query.queryFirst();
    }
    ...
    Blog blog = Blog.queryByTitle(1);
    

    2 复杂查询

    动态查询

    MyBatis ObjectiveSQL
    <select id="findActiveBlogLike"
         resultType="Blog">
      SELECT * FROM BLOG
      WHERE
      <if test="state != null">
        state > #{state}
      </if>
      <if test="title != null">
        AND title like #{title}
      </if>
      <if test="author != null and author.name != null">
        AND author_name like #{author.name}
      </if>
    </select>
    ...
    BlogMapper mapper = session.getMapper(BlogMapper.class); 
    Blog blog = mapper.findActiveBlogLike(...);
    
    Blog.Table blog = Blog.asTable();
    Select select = new Select();
    LogicalExpression eternalExpression = new EternalExpression();
    if(state != null)
         eternalExpression = eternalExpression.and(blog.state > state);
    if(title != null)
         eternalExpression = eternalExpression.and(blog.title.like(title));
    if(author != null && author.name != null)
         eternalExpression = eternalExpression.and(blog.author.like(author.name));
    return select.from(blog).where(eternalExpression).execute();
    

    关联查询

    MyBatis ObjectiveSQL
    <mapper>
      <resultMap type="Blog" id="blog">
        <id column="id" property="id" />
        ...
        <association property="author" javaType="Author">
          ...
        </association>
      </resultMap>
      <select id="findBlog" parameterType="int" resultMap="blog">
        ...
      </select>
    </mapper>
    ...
    BlogMapper mapper = session.getMapper(BlogMapper.class); 
    Blog blog = mapper. findBlog(...);
    
    Blog blog = Blog.queryByPrimaryKey(1, 
                        Blog.BELONGS_TO_AUTHOR)
    
    103 条回复    2020-12-14 14:47:03 +08:00
    1  2  
    cmlanche
        1
    cmlanche  
       363 天前
    不错
    putaozhenhaochi
        2
    putaozhenhaochi  
       363 天前
    为啥不用 JPA?
    Braisdom
        3
    Braisdom  
    OP
       363 天前
    @putaozhenhaochi JPA 和 MyBatis 差别不大,
    Braisdom
        4
    Braisdom  
    OP
       363 天前
    @cmlanche 支持一下项目,感谢
    qmzhixu
        5
    qmzhixu  
       363 天前   ❤️ 1
    简单查询用 MyBatisPlus 可以解决
    wr516516
        6
    wr516516  
       363 天前
    看上去和 MyBatisPlus 差不多?
    brucewuio
        7
    brucewuio  
       363 天前
    自己写,这种声明式的确是很爽,但是如果是公司,人员经常流动,mybatis 这种 xml 可能阅读性高一点。
    Braisdom
        8
    Braisdom  
    OP
       363 天前
    @brucewuio 哈哈,Java 代码竟然比 xml 易读??
    Braisdom
        9
    Braisdom  
    OP
       363 天前
    @wr516516 MyBatisPlus 依然无法摆脱 xml,可以进去详细了解一下: https://github.com/braisdom/ObjectiveSql
    w292614191
        10
    w292614191  
       363 天前
    现在大部分语句都是生成了。
    复杂的要手写,你这个也要手写。
    Kirsk
        11
    Kirsk  
       363 天前 via Android
    这不就是 active record 模式么 没必要自己实现 直接在 orm 上自定义就好了 要不在 jpa 上封装一套 unit of work activeRecord 各种模式可选 狗头
    Jeb
        12
    Jeb  
       363 天前
    if 后面没有大括号看着有点不习惯了
    sheeta
        13
    sheeta  
       363 天前
    laravel orm 才是真的爽
    cheng6563
        14
    cheng6563  
       363 天前
    eternalExpression.and(blog.state > state);

    这个大于判断怎么做到的?
    Kirsk
        15
    Kirsk  
       363 天前 via Android
    @Kirsk 不过有缺陷 搭配充血就不合适 能够良好分离职责没问题
    Braisdom
        16
    Braisdom  
    OP
       363 天前
    @Jeb Java 代码习惯问题
    @cheng6563 运算符重载
    @Kirsk 面向对象设计问题,最关键我是不用写的
    fengpan567
        17
    fengpan567  
       363 天前
    我现在都是首选 mybatis-plus 了,右边的感觉很像 JPA,但是复杂 sql 还是写到 xml 比较好
    okayan
        18
    okayan  
       363 天前
    还是感觉 MyBatis 的 XML 更易读
    easylee
        19
    easylee  
       363 天前   ❤️ 1
    只要是不用 xml,看起来就很舒服。
    Braisdom
        20
    Braisdom  
    OP
       363 天前
    @fengpan567
    @okayan
    @easylee 你们看到的只是一小部分特性,这次发的不够好,
    cheng6563
        21
    cheng6563  
       363 天前
    @Braisdom 我火星了吗 Java 哪来的运算符重载
    taogen
        22
    taogen  
       363 天前
    试着对比一下这个 sql 呢?下面是 mybatis 写法

    SELECT name, value
    FROM (
    SELECT b.site AS name, COUNT(*) AS value
    FROM task AS a
    left join task_for_development AS b ON b.task_id=a.id
    WHERE a.delete_flag=FALSE AND a.category="development" AND b.site IS NOT NULL AND b.site != ''
    <trim prefix="and" suffixOverrides="and">
    <if test="beginTime != null">
    DATE(a.create_time) <![CDATA[ >= ]]> #{beginTime,jdbcType=TIMESTAMP} and
    </if>
    <if test="endTime != null">
    DATE(a.create_time) <![CDATA[ <= ]]> #{endTime,jdbcType=TIMESTAMP} and
    </if>
    </trim>
    GROUP BY b.site
    ) AS temp2
    ORDER BY value desc limit 10
    ychost
        23
    ychost  
       363 天前
    看着和 tk.mybatis 一样呢,另外 JPA 的 SpecificationExecutor 和 Example 用起来也很简单,不过还是喜欢 .NET 的 LINQ 感觉这才是最好用的
    Ayanokouji
        24
    Ayanokouji  
       363 天前
    和 ebean jooq 比有啥优势( jooq 非开源的收费)
    qwerthhusn
        25
    qwerthhusn  
       363 天前
    '%#{title}%' 这样如果没校验,分分钟 SQL 注入
    lishen226
        26
    lishen226  
       363 天前
    sql 可读性更强些
    Kirsk
        27
    Kirsk  
       362 天前 via Android   ❤️ 1
    @Braisdom 设计的挺好的 不过条件查询上是怎样个用法 看起来有点接近 sql 拼接了 应该可以用下 example spec 的思路 example 没实现条件表达
    miao1007
        28
    miao1007  
       362 天前
    这个人员流动大时,控制不住质量
    VeryZero
        29
    VeryZero  
       362 天前
    支持一下,不过看着跟 JPA 类似啊,有什么这个能做,JPA 不能做的特性吗?
    Braisdom
        30
    Braisdom  
    OP
       362 天前
    @cheng6563 看我的代码,我实现了运算符重载


    @taogen 你想要的通过这种方式很容易实现

    Member.Table member = Member.asTable();
    Order.Table order = Order.asTable();

    Select select = new Select();

    select.project(member.no, member.name, count().as("order_count"))
    .from(member)
    .leftOuterJoin(order, order.memberId.eq(member.id))
    .groupBy(member.no, member.name);

    List<Member> members = select.execute(Member.class);
    Braisdom
        31
    Braisdom  
    OP
       362 天前
    @VeryZero 下面的复杂表达式计算,现有的所有 ORM 框架都做不到,但却很实用。

    ```
    Order.Table orderTable = Order.asTable();
    Select select = new Select();

    select.project((sum(orderTable.amount) / sum(orderTable.quantity) * 100).as("unit_amount"))
    .from(orderTable)
    .where(orderTable.quantity > 30 &&
    orderTable.salesAt.between("2020-05-01 00:00:00", "2020-05-02 23:59:59"))
    .groupBy(orderTable.memberId);

    List<Order> orders = select.execute(Order.class);

    ```
    adguy
        32
    adguy  
       362 天前   ❤️ 2
    手写 sql 是对我这个 crud 仔最后的尊重
    Braisdom
        33
    Braisdom  
    OP
       362 天前
    @adguy 哈哈,可能我要把基础的 CRUD 变为 Java API 了
    kylix
        34
    kylix  
       362 天前 via iPhone
    恕我眼拙,没看出来
    sprite82
        35
    sprite82  
       362 天前
    很好,可我还是选择 mybatis plus
    Jrue0011
        36
    Jrue0011  
       362 天前   ❤️ 1
    那如果需要使用一些函数比如 Oracle 的 partition by 呢,毕竟框架如果没提供,要么就直接写 SQL,要么就只能通过框架的扩展能力自己实现,这样想想还是写 SQL 好维护一些。
    rockyou12
        37
    rockyou12  
       362 天前
    你这实现的……我用 jpa+querydsl 都完全能做啊,优势在哪……
    casillasyi
        38
    casillasyi  
       362 天前
    mybatis 和 jpa 的优势在于,开发者知道自己最终的 sql 是什么
    zmxnv123
        39
    zmxnv123  
       362 天前
    可惜我用 SqlAlchemy
    nc4697
        40
    nc4697  
       362 天前
    看起来 MyBatisPlus 更易用。但是也说明楼主的项目潜力还是很大,加油
    murmur
        41
    murmur  
       362 天前
    mybatis 的特点就是可以完全控制 sql,尤其是做复杂报表特别好使
    zsl199512101234
        42
    zsl199512101234  
       362 天前
    https://mybatis.org/mybatis-dynamic-sql/docs/quickStart.html
    感觉官方的这个更香,打算新项目试一试这个框架
    sagaxu
        43
    sagaxu  
       362 天前 via Android
    拿 dsl 拼 sql ?我还不如手写 sql,代码量差不多,是个后端就能秒上手,不用学。
    micean
        44
    micean  
       362 天前 via Android   ❤️ 1
    楼主最近推广很密集哇
    其实现在 idea 做的已经很好了,连上数据库就能用脚本生成一切,写 sql 用 language inject 就可以用上自动完成字段了,还带校验的
    重载操作符确实是亮点,但是对于 dsl 写 sql 来说还不够
    Braisdom
        45
    Braisdom  
    OP
       362 天前
    一个时代的发展前期,总是充满质疑,很正常,等真相大白的一天,各位可以反思一下今天的质疑。
    我对比过现有的所有 ORM 框架,才决定做 ObjectiveSQL,以我 15 年编程的经验对比了各种优缺点。

    我是做零售系统的大数据分析的,零售业也是最早将数据应用到生产过程中的行业之一,其中的 SQL 与 Java 之间磨合了很多年。我也在其中痛苦了很年。感谢各位支持,你们的质疑也是对我分析优缺点的补充。


    @micean
    @sagaxu
    @zsl199512101234
    @nc4697
    @casillasyi
    @rockyou12
    @sprite82
    @kylix
    Braisdom
        46
    Braisdom  
    OP
       362 天前
    @micean idea 做的是不错,但需求是无限增长的
    Braisdom
        47
    Braisdom  
    OP
       362 天前
    @micean 推广的积极,也就说明项目的成熟度在提升,需要兄弟们支持,需要各位通过实际的行动进行投票。就像优秀的企业是靠客户的钞票投票,而不同情,一味的寻求国产支持,一直靠扶的项目或公司走不远。
    justin2018
        48
    justin2018  
       362 天前
    ![WFq6nZv]( )

    v2 显示 bug 嘛?
    Braisdom
        49
    Braisdom  
    OP
       362 天前
    @justin2018 感觉是的,但我的用法不太对呀。应该通过滚动条的。哈哈
    xiangyuecn
        50
    xiangyuecn  
       362 天前   ❤️ 1
    @qwerthhusn #25 用了这种框架的基本上不存在 sql 注入的问题,#格式是参数化查询( like 字符串虽然也是个表达式,但只是模式而已),除非不明白机制的前提下手贱用$

    jdbc 手写参数化查询太麻烦,因此直接拼接 sql 字符串多简单😂 要是易用大部分项目也就没这些要写 xml 的框架什么鸟事了(没错就是那些连接池都用不上的项目)
    zsl199512101234
        51
    zsl199512101234  
       362 天前   ❤️ 1
    @Braisdom 有你这样的心态和实力,肯定会成功,我会持续关注的
    wg20080215
        52
    wg20080215  
       362 天前
    看起来很优秀,可能业务没那么复杂需要 DSL 和 SQL 嵌套着来,我还是继续用 JPA 。
    Braisdom
        53
    Braisdom  
    OP
       362 天前
    @wg20080215 ObjectiveSQL 有长的长处,也有其短处,不可能覆盖所有场景的使用

    JPA 代表的是一种编程模式,以动态代理的编程,ObjectiveSQL 则是以另一种静态生成代码的形式,属于另一个流派,有人喜欢,有人讨厌,这是个人偏好问题。用心做好自己的事,不断进步。
    sweetsorrow211
        54
    sweetsorrow211  
       362 天前
    @qmzhixu #5 +1
    tydl
        55
    tydl  
       362 天前 via Android
    比起 php 落后 写这么多代码
    Braisdom
        56
    Braisdom  
    OP
       362 天前
    @tydl 好问题,每个语言优秀的地方都是可以借鉴的。
    Braisdom
        57
    Braisdom  
    OP
       362 天前
    @sweetsorrow211 @qmzhixu 有兴趣,可以深入聊一下两者,MyBatis MyBatis-Plus 我用了好多年的,正是因为它们有太做做的不好的地方,我才开始 ObjectiveSQL 项目的。
    hantsy
        58
    hantsy  
       362 天前
    10 多年没接触 Batis,实在没法比较,自进入 Apache 就没用过了,后来又被 Apache 踢出去了。

    >下面的复杂表达式计算,现有的所有 ORM 框架都做不到,但却很实用。

    这个吹得有点过了。

    如果与 JPA 比较,从 Type Safe 角度考虑, 我首选用 JPA Criteria API ( Criteria 操作可似代替复杂的 JPQL ),不用 Spring Data 的话,自己写个通用接口,https://github.com/hantsy/helidon-sample/blob/master/mp-jpa/src/main/java/com/example/Repository.java 复杂的自己定义一下 Criteria Predicate 。

    从软件设计的角度,Domain 为中心已经不再关心 Table 了,SQL 还是 NoSQL 。
    Braisdom
        59
    Braisdom  
    OP
       362 天前
    @hantsy 现有的框架当然支持复杂表达式了,只不过支持的方式不同而已,
    以同环比的投影表达式为例:
    SQL:(sum(t1.current) - sum(t1.last)) / sum(t1.last) * 100
    ObjectiveSQL: (sum(sales.current) - sum(sales.last)) / sum(sales.last) * 100

    // sales 为 Order.asTable() 方法生成,该方法包括内部的所有字段均为怎么生成

    我的项目几乎和 SQL 一模一样,你猜其它项目会怎么做呢?字符?还是 lambda
    Braisdom
        60
    Braisdom  
    OP
       362 天前
    @hantsy 除了这些比较简单的表达式,下面的表达式呢?

    过滤:where (t1.amount > 1000 and t1.product_code = '0001') and (t1.state = 1 or t1.state = null)

    ObjectiveSQL: order.where((order.amount > 1000 && order.product_code.eq('0001'))
    && order.state.eq(1) || order.state.isNull() )

    您是大佬,能看出我的 API 设计吗?为什么要做这件事,其它的 ORM 框架对于上述表达式什么怎么做?
    lower
        61
    lower  
       362 天前
    那个说的操作符重载 是怎么弄的?看了代码没太看懂
    类似这样:eternalExpression = eternalExpression.and(blog.state > state);
    shanghai1998
        62
    shanghai1998  
       362 天前
    php 既视感,支持下,感觉 php 更简单点,请继续努力:

    $blog = db('blog')->find(1);

    $res = db('blog')->whereLike('title', $title)->select();

    if ($state) $where['state'] = ['>', $state];
    if ($title) $where['title'] = ['like', $title];
    $res = db('blog')->where($where)->select();

    $blog = db('blog')->with('author')->find(1);
    Braisdom
        63
    Braisdom  
    OP
       362 天前
    @shanghai1998 简单的表达式,每个框架和语言差别不大,一个项目中存在大量复杂表达式,那些都是关键,php 的复杂表达式写起来估计那没这么美观。

    你写的这些每个语言,或者 ORM 框架都差不了太多,最多的就是对符号的偏好不同罢了。


    @lower 那块比较复杂,不是简单能说清楚的。有兴趣加我微信:braisdom
    hantsy
        64
    hantsy  
       362 天前
    @Braisdom 为了 SQL 看起来更清楚,不必要的条件就直接过滤掉,不喜欢用 Or 把所有条件考虑都加进去。
    https://github.com/hantsy/helidon-sample/blob/master/mp-jpa/src/main/java/com/example/PostRepository.java#L38
    Braisdom
        65
    Braisdom  
    OP
       362 天前
    @hantsy 只是一个示例,算术表达式,比较表达式,逻辑表达式、函数调用 这几种在 SQL 中是最为常用的,也是每个语言都有的,但不同语言的表现形式是不一样的。

    我只是使的 Java 中的上述表达式 能够直接转换,保持统一的编码样式,而不是通过其它形式的封装,大部分 ORM 框架,包括 Spark SQL, Flink SQL 等 SQL 编程都是通过函数来实现,例如:plus(a, b), minus(a, b) 等,这种形式会使得代码可读性极差。
    lispczz
        66
    lispczz  
       362 天前
    这个项目我挺喜欢。但是我想说,我已经在 V2EX 首页看到至少三次这个项目了,感受都快有点像知乎看到 圆胖肿 或者 微博看到 阚清子 了。
    sagaxu
        67
    sagaxu  
       362 天前 via Android
    mybatis 不是 orm,只是个裸 query builder,选用它的人,大概率是嫌弃 orm 的,可能不需要一个更好的 orm 。

    任何 dsl 都有学习成本,在 dsl 和 sql 之间来回翻译,需要对 dsl 内部非常熟悉,否则稍微复杂一点点的逻辑就会卡住不知道怎么下手。还有一些时候要用到 db 特有的功能,没有比裸写 sql 更简单的办法了。
    Braisdom
        68
    Braisdom  
    OP
       362 天前
    @lispczz 哈哈,现在才刚刚开始,项目已经初步的稳定,但未来的路还很长,需要更多的人认可,并能参与进来。

    v2ex 是个很好的平台,是我在推广过程中,回复和评论最多的一个平台,与大家在一起讨论,收获颇多,感谢各位的支持,希望得到更多批评与挑战。
    young1lin
        69
    young1lin  
       362 天前
    主要是 MyBatis 是个会写 SQL 的人都能上手,JPA 和 Hibernate 比较难一点点,还有历史遗留问题。
    felixin
        70
    felixin  
       362 天前 via Android
    怎么用函数呢?比如 postgres 里面的 json 操作函数,能给个例子看看吗
    beidounanxizi
        71
    beidounanxizi  
       362 天前
    写过 Go 原生 和 gorm 以及 mybatis 最舒服 最 instinct 的还是原生的
    不想用 orm 的原因是因为 写数据库的查询 用原生 sql 优化也方便
    Braisdom
        72
    Braisdom  
    OP
       362 天前
    @young1lin 这要去研究一下 SQL 和 ORM 的发展史了,你就能明白为什么会有 ORM 这种形式的框架,为什么数据库不像 TCP/IP,HTTP,SMTP 等交换协议一样,泛泛的讨论框架的区别没有太大意义,每个框架的出现代表一个时代的认知水平,人的认知随时间一直在变的。ObjectiveSQL 的出现也是基于前人的认知升级而已。
    quan01994
        73
    quan01994  
       362 天前
    下面的复杂表达式计算,现有的所有 ORM 框架都做不到。。
    你是指 java 的 orm 吗。

    C# 还是有很多能做到的。
    kran
        74
    kran  
       362 天前 via Android
    很喜欢这个项目。也很佩服楼主的技术和沟通能力。

    就是没看懂那个运算符重载。。。
    NeinChn
        75
    NeinChn  
       362 天前
    这不就是简单场景没必要,复杂场景学习成本高么

    举个例子,我们线上数据库都是同一套,因此要做线上隔离全靠表名区别

    以 members 为例,staging 环境的表名是 members_staging

    你这个文档写的真的不清不楚,根本没办法通过文档决定怎么开发

    简单看了下代码,DomainModel 的 tableName 或者 class 的 getSimpleName 。

    那我一个 domain 用在多个表上还要搞 2 个类么?

    真的有时间,建议完善下文档,至少做到 MyBatis 的文档水平,再做宣传。

    想让别人做什么事情都看源代码解决是不现实的事情,有的是太菜看不懂源代码,有的是太忙没有时间花在读这种代码上。
    Braisdom
        76
    Braisdom  
    OP
       361 天前
    @quan01994 .net 的 entity framework 我参考了很多,表达式这块它可以做的,但有很多做了。
    Braisdom
        77
    Braisdom  
    OP
       361 天前
    @NeinChn 兄弟,不同部署环境应该通过数据库区分,例如:开发环境 development, 测试环境 test,生产环境 production, 我实在不明白,你为什么用表名去区分不同的部署环境,
    Braisdom
        78
    Braisdom  
    OP
       361 天前
    @kran 私下交流,请加我,Java 的运算符重载是个特殊的应用,加我微信: braisdom
    NeinChn
        79
    NeinChn  
       361 天前
    @Braisdom 你这是没见过 staging 么.....
    Braisdom
        80
    Braisdom  
    OP
       361 天前
    @NeinChn 我理解你的意思了,如果数据是暂时存储,一般通过内存数据库 Redis 类型的,如果是数据库的中间状态可以通过继承的方式存在,数据库中理论上不应该存在一模一样的表结构。

    我的理解不一定正确,如果有问题,恳请你明示,感谢支持。
    bbao
        81
    bbao  
       361 天前
    楼主的项目,经过线上项目以及压力的考验么?
    Braisdom
        82
    Braisdom  
    OP
       361 天前
    @bbao 我的项目刚上线 2 个月不到,以经有很多兄弟在尝试,应该没有商用项目在用。
    你这问题很像一个刚毕业找工作的人被某一个公司问,你有工作经验吗?你应该能体会其中的含义
    bbao
        83
    bbao  
       361 天前
    @Braisdom
    朋友,你的攻击欲望挺强呀,你这应该不是第一次在 v2 里面推广自己的框架了,之前看到过,不容的别人说一点不好。
    首先,推广自己的框架和思想是值得赞同的。
    其次,开源框架和基础工具都是经过全方面的压力测试的,是被证实过的。

    面试的时候没有工作经验,但是我可以有实习经验,项目经验,学习过程中的成果,拿得出来的结果来证明我「行」;
    我的问题也就是想了解,你怎么证明你的框架「行」「能解决各种问题」「性能也能保证」
    xcstream
        84
    xcstream  
       361 天前
    我觉得拼装 sql 这种工作并不酷

    感觉就像看别人都用手搬砖,我有新技巧用脚搬砖一样。
    Braisdom
        85
    Braisdom  
    OP
       361 天前
    @bbao 兄弟误会了,所有的批评和挑战我都乐意接受,所有项目都有开始的时候。

    另外证明一个开源框架项目是否可以行,代码就是最好证明,总共加起来也没有多少行,如果我使用一个框架都不能理解代码和基础原理,我肯定不会用,所以证明我行不行,通过代码就可以。

    估计兄弟应该没有看过我的项目,里面所各种数据库的 Example,看了 Example 就能证明能不能解决了。
    quan01994
        86
    quan01994  
       361 天前
    @Braisdom entityframework 还是差点,你可以去参考 linq2db 。这个是一个开源的第三方 orm,支持数据库函数,视图,自定义函数,等等。
    Braisdom
        87
    Braisdom  
    OP
       361 天前
    @quan01994 我看过,ObjectiveSQL 支持数据库函数,自定义函数,后期会支持内存表,视图没有必要支持
    zypy333
        88
    zypy333  
       361 天前
    现在有用这个工具搭的脚手架吗
    Braisdom
        89
    Braisdom  
    OP
       361 天前
    @zypy333 不好意思,目前还没有,脚手架通常是业务类的 framework,我这块应该是脚手架的一部分而已
    zypy333
        90
    zypy333  
       361 天前
    感觉很多新手接触 mybatis 都是直接从脚手架开始的,如果有的话可能会更方便推广吧,创意挺好的,希望未来能看到有很多落地的项目
    Braisdom
        91
    Braisdom  
    OP
       361 天前
    @zypy333 建议不错,如果是脚手架,也是 SpringBoot 或其它项目应用程序框架项目的脚手架,可以搞一个,哈哈
    zhuangzhuang1988
        92
    zhuangzhuang1988  
       361 天前
    还是 C# linq or F# query 好看
    Braisdom
        93
    Braisdom  
    OP
       361 天前
    @zhuangzhuang1988 是的,代码的简洁,美观很重要,而且不能只覆盖简单场景,复杂场景下也能适应。
    mysunshinedreams
        94
    mysunshinedreams  
       360 天前
    之前调研过 JOOQ,感觉 JOOQ 也挺好用,就是建模太重。
    Braisdom
        95
    Braisdom  
    OP
       360 天前
    @mysunshinedreams jooq 的设计想法很有创意,由于 java 的限制,无法发挥到极致
    liuhuan475
        96
    liuhuan475  
       360 天前
    想推荐自己的代码,不一定要攻击另一个
    coderwl
        97
    coderwl  
       360 天前
    这运算符重载的实现,IDE 不会一片飘红吗,如果非要这么灵活的 SQL DSL,用 ruby 的 active record 不香吗
    Braisdom
        98
    Braisdom  
    OP
       360 天前
    @coderwl 兄弟,我开发了一个 idea 的插件,有兴趣体验呀。
    Braisdom
        99
    Braisdom  
    OP
       360 天前
    @liuhuan475 请看一下我前面的讨论,我只是客观的分析优缺点而已,每个项目能够留下来总有它存在的意义,也代表着一代程序员的认识水平。进步和发展的本身就是要推翻旧的技术,找他们的弱点进行攻击,不攻击,也就不存在进步和发展
    Still4
        100
    Still4  
       360 天前
    如果涉及到联表怎么办,我自己搭建的框架里面也有类似的功能,查询条件通用化和规范化,重复逻辑也可以提取出通用方法,对外提供接口的时候也很方便,遵循相同的标准即可

    但是联表就很痛苦,我现在没有好的解决办法只能是部分 sql 部分 model,返回数据的使用也比较蛋疼
    1  2  
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2852 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:02 · PVG 19:02 · LAX 03:02 · JFK 06:02
    ♥ Do have faith in what you're doing.