对比 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)
9320 次点击
所在节点    Java
103 条回复
cmlanche
2020-12-11 16:54:05 +08:00
不错
putaozhenhaochi
2020-12-11 16:54:40 +08:00
为啥不用 JPA?
Braisdom
2020-12-11 16:56:17 +08:00
@putaozhenhaochi JPA 和 MyBatis 差别不大,
Braisdom
2020-12-11 16:56:30 +08:00
@cmlanche 支持一下项目,感谢
qmzhixu
2020-12-11 16:57:18 +08:00
简单查询用 MyBatisPlus 可以解决
wr516516
2020-12-11 16:57:59 +08:00
看上去和 MyBatisPlus 差不多?
brucewuio
2020-12-11 17:03:28 +08:00
自己写,这种声明式的确是很爽,但是如果是公司,人员经常流动,mybatis 这种 xml 可能阅读性高一点。
Braisdom
2020-12-11 17:06:51 +08:00
@brucewuio 哈哈,Java 代码竟然比 xml 易读??
Braisdom
2020-12-11 17:07:37 +08:00
@wr516516 MyBatisPlus 依然无法摆脱 xml,可以进去详细了解一下: https://github.com/braisdom/ObjectiveSql
w292614191
2020-12-11 17:12:05 +08:00
现在大部分语句都是生成了。
复杂的要手写,你这个也要手写。
Kirsk
2020-12-11 17:18:11 +08:00
这不就是 active record 模式么 没必要自己实现 直接在 orm 上自定义就好了 要不在 jpa 上封装一套 unit of work activeRecord 各种模式可选 狗头
Jeb
2020-12-11 17:19:54 +08:00
if 后面没有大括号看着有点不习惯了
sheeta
2020-12-11 17:20:25 +08:00
laravel orm 才是真的爽
cheng6563
2020-12-11 17:20:30 +08:00
eternalExpression.and(blog.state > state);

这个大于判断怎么做到的?
Kirsk
2020-12-11 17:20:37 +08:00
@Kirsk 不过有缺陷 搭配充血就不合适 能够良好分离职责没问题
Braisdom
2020-12-11 17:27:27 +08:00
@Jeb Java 代码习惯问题
@cheng6563 运算符重载
@Kirsk 面向对象设计问题,最关键我是不用写的
fengpan567
2020-12-11 17:29:10 +08:00
我现在都是首选 mybatis-plus 了,右边的感觉很像 JPA,但是复杂 sql 还是写到 xml 比较好
okayan
2020-12-11 17:30:47 +08:00
还是感觉 MyBatis 的 XML 更易读
easylee
2020-12-11 17:33:15 +08:00
只要是不用 xml,看起来就很舒服。
Braisdom
2020-12-11 17:34:22 +08:00
@fengpan567
@okayan
@easylee 你们看到的只是一小部分特性,这次发的不够好,

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

https://www.v2ex.com/t/734572

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

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

© 2021 V2EX