JFinal

登录 注册

像mybatise那样调用接口就能调用模板中的sql

mybatise只定义了接口就能访问xml中的sql很是方便,有没有哪位实现了类似的功能。

我想了想大体思路

  1. sql模板命名规范起来,namespace是interface名字,sql名字是方法名

  2. 通过增加拦截器,在执行interface方法时自动去执行sql模板旳sql

评论

  • 12-20 21:59
    有几个问题还没想好
    1.用哪个model去getsqlpara
    2.返回值怎么组装
  • 12-21 10:36
    JFinal直接Db.getSqlPara("namespace.sqlname")就行了 更方便
  • 12-21 11:08
    加一个BaseModel, 通过堆栈获取信息

    /**
    * 获取sql模板语句
    * @param data
    * @return
    */
    public SqlPara getSqlPara(Map data) {
    StackTraceElement[] stacks = (new Throwable()).getStackTrace();
    SqlPara sqlPara = _getConfig().getSqlKit().getSqlPara(getSqlParaKey(stacks), data);
    if (sqlPara == null) {
    sqlPara = _getConfig().getSqlKit().getSqlPara(getSqlParaKeyTwo(stacks), data);
    }

    return sqlPara;
    }

    private String getSqlParaKey(StackTraceElement[] stacks) {
    /*Parameter[] parameters = null;*/
    String[] classNames = stacks[1].getClassName().split("\\.");
    String className = StrUtil.removeAll(classNames[classNames.length - 1], "Dao");
    String methodName = stacks[1].getMethodName();
    if (StrUtil.containsIgnoreCase(methodName, "ByModel")) {
    methodName = "queryByModel";
    }
    /* for (Method method: ClassLoaderUtil.loadClass(stacks[1].getClassName()).getMethods()) {
    if (method.getName().equals(methodName)) {
    parameters = method.getParameters();
    break;
    }
    }*/
    String key = StrKit.firstCharToLowerCase(className) + "." + methodName;

    return key;
    }

    private String getSqlParaKeyTwo(StackTraceElement[] stacks) {
    String[] classNames = stacks[1].getClassName().split("\\.");
    String className = StrUtil.removeAll(classNames[classNames.length - 1], "ServiceImpl");
    String methodName = stacks[1].getMethodName();
    if (StrUtil.containsIgnoreCase(methodName, "ByModel")) {
    methodName = "queryByModel";
    }

    String key = StrKit.firstCharToLowerCase(className) + "." + methodName;

    return key;
    }
  • 12-21 11:09
    model namespace的命名为model首字母小写, 方法名与sql语句名一致
  • 12-22 12:46
    jfinal 用模板引擎来管理 sql 比 mybatis 用 XML 管理 sql 要简洁方便得多,这里有详细的使用方法:
    https://www.jfinal.com/doc/5-13
  • 12-24 10:30
    @Ghai、海 你这是重写了getpara方法啊,只是省了手工敲入key的操作,稍微省点操作
  • 12-24 10:35
    @JFinal 其实我的想法是,sql模板还是jfinal的,不用xml,但是dao层借鉴mybatise的,只是定义接口,service层调用接口就能完成对dao的操作。
    其中sql模板的namespace为接口的名字,sql名为方法名。
    比如
    DAO层
    interface UserManager{
    public List getUserList();
    }
    sql 模板
    #namespace("UserManager")
    #sql("getUserList")
    ......
    #end
    #end
    Service层
    @Inject
    UserManager userManager;
    public xx(){
    userManager.getUserList();//完成了对Dao层的查询
    }
  • 12-24 10:43
    @快乐的蹦豆子 这么玩也可以,因为 jfinal 的 sql 管理本质上是可以独立运作的
  • 发送