有点失落,准备回家咯~不过还是想让自己做的东西见见光,可能也有长期发展这个框架的打算。本人菜鸟一枚,欢迎各种建议。
aHR0cHMlM0EvL2dpdGh1Yi5jb20vU2VwaW5nL0pRTA==
主要功能:这是一个可以让你用 Java 8 以上的方法引用来写 SQL 的框架。例如,假如你要写一句 SQL:SELECT * FROM user WHERE
user.name = "John"
你可以这样来写:JQL.from(User.class) .where((root1, conditionChain) -> { return conditionChain .equal(root1.getAttribute(User::getName), "John"); }); 其中,User 是 user 表对应的实体类,有 get/set 方法。
为什么要用“方法引用”呢?我只能说,初衷是为了能用 IDE 里的自动提示……
部件构成:1、实体类 需要在类上标注 @
Table 注解,表明这是与数据库表对应的实体类。实体类须有 get/set 方法,在 get 方法上可以用 @
Column 注解标明该字段的特殊功能(插入时写默认值,逻辑删除标识等等)。
2、实体类解析器 实体类需要经 EntityResolver 解析,得到实体类的通用抽象 Entity<t>,并存放于 EntityRepository 中。 我默认提供了一个用 ASM 解析的解析器,AnnotationBasicASMResolver。</t>
3、JQL JQL 就是用来写 SQL 的类了。很抱歉,目前只支持 SELECT 语句和 MySQL 的部分语法。。。
4、执行 SQL 在接口 SQLExecutor 中实现,查询结果以 List<CompositeEntity<t>>返回。</t>
5、结果 结果封装为 CompositeEntity<t>的形式。CompositeEntity 是根据查询语句的 join 来封装的,例如,对于以下查询:SELECT * FROM user JOIN city ON
city.name = user.city WHERE
user.name = "John" 然后,得到了一个 CompositeEntity<user>对象 userResult,你可以用 userResult.getJoinEntities(City.class)来获得这条 user 关联的所有 city。 我默认提供了一个较为简陋的实现。</user></t>
再杂谈一下吧。这个框架的具体实现其实很早就做出来了( master )分支,但是发现想扩展一个功能时存在了困难,就着手改造,把部件全部抽象化接口化。这才发现接口化、定义规范是最难的事情。当然,目前的组件结构我也不是很满意,主要在于复合条件链( ConditionChain )这个地方。有兴趣的大佬可以去看看代码,指点迷津一下。
以上,觉得有意思就 star 一下吧~