V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
twogoods
V2EX  ›  分享创造

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

  •  
  •   twogoods · 2017-12-04 14:05:01 +08:00 · 2169 次点击
    这是一个创建于 2574 天前的主题,其中的信息可能已经有所发展或是发生改变。

    出于不喜欢 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 表示鼓励。

    2 条回复    2017-12-05 14:48:11 +08:00
    gejun123456
        1
    gejun123456  
       2017-12-05 12:26:45 +08:00 via Android
    支持下😁
    twogoods
        2
    twogoods  
    OP
       2017-12-05 14:48:11 +08:00 via Android
    @gejun123456 改进了下,正式发个帖,话说看你头像真眼熟😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2563 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:28 · PVG 19:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.