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

2020-12-11 16:34:54 +08:00
 Braisdom

项目地址: 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)
9972 次点击
所在节点    Java
103 条回复
bbao
2020-12-12 22:48:04 +08:00
楼主的项目,经过线上项目以及压力的考验么?
Braisdom
2020-12-12 23:25:44 +08:00
@bbao 我的项目刚上线 2 个月不到,以经有很多兄弟在尝试,应该没有商用项目在用。
你这问题很像一个刚毕业找工作的人被某一个公司问,你有工作经验吗?你应该能体会其中的含义
bbao
2020-12-13 00:30:50 +08:00
@Braisdom
朋友,你的攻击欲望挺强呀,你这应该不是第一次在 v2 里面推广自己的框架了,之前看到过,不容的别人说一点不好。
首先,推广自己的框架和思想是值得赞同的。
其次,开源框架和基础工具都是经过全方面的压力测试的,是被证实过的。

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

感觉就像看别人都用手搬砖,我有新技巧用脚搬砖一样。
Braisdom
2020-12-13 08:33:37 +08:00
@bbao 兄弟误会了,所有的批评和挑战我都乐意接受,所有项目都有开始的时候。

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

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

但是联表就很痛苦,我现在没有好的解决办法只能是部分 sql 部分 model,返回数据的使用也比较蛋疼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/734572

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX