一款基于 Mybatis 的编译期 SQL 生成器

2017-12-04 14:05:01 +08:00
 twogoods

出于不喜欢 mybatis generator 那种生成代码的方式,于是尝试了另一种基于注解来表达 SQL 的方式:

@Table(name = "T_User")
public class User {
    @Id("id")
    private int id;
    private String username;
    private int age;
}

上面的 model 定义了模型和数据库表的关系,那么下面的方法签名你能猜出 sql 长什么样子吗?

@DaoGen(model = User.class)
public interface UserDao {
    @Select
    @OrderBy("id desc")
    List<User> queryUser(@Condition(criterion = Criterions.EQUAL, column = "username") String name,
                         @Condition(criterion = Criterions.GREATER, attach = Attach.OR) int age,
                         @Limit int limit, @OffSet int offset);

    @Select
    List<User> queryUser2(@Condition(criterion = Criterions.GREATER, column = "age") int min,
                          @Condition(criterion = Criterions.LESS, column = "age") int max);


    @Insert(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @BatchInsert(columns = "username,age")
    int batchInsert(List<User> users);

    @Update
    @ModelConditions({
            @ModelCondition(field = "id")
    })
    int update(User user);

    @Delete
    int delete(@Condition(criterion = Criterions.GREATER, column = "age") int min,
               @Condition(criterion = Criterions.LESS, column = "age") int max);
}

你只需定义一个 model 和一个 mapper 接口,xml 会在编译期自动生成在同一包下。理论上 mybatis generator 能完成的 sql,这个小工具也都可以完成。
如果你喜欢自己手写 xml 里的 sql,那么你一定在方法参数上用过@Param注解,针对@Param的重复性工作,小工具借鉴了 lombok 的方式,增加了一个叫做@Params的注解,它会在编译期修改抽象语法树,自动给每一个方法的参数加上@Param注解。
详情请移步github,如果对你有帮助,欢迎送出 star 表示鼓励。

2157 次点击
所在节点    分享创造
2 条回复
gejun123456
2017-12-05 12:26:45 +08:00
支持下😁
twogoods
2017-12-05 14:48:11 +08:00
@gejun123456 改进了下,正式发个帖,话说看你头像真眼熟😂

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

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

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

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

© 2021 V2EX