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

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

我想了想大体思路

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

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

评论区

快乐的蹦豆子

2018-12-20 21:59

有几个问题还没想好
1.用哪个model去getsqlpara
2.返回值怎么组装

山东小木

2018-12-21 10:36

JFinal直接Db.getSqlPara("namespace.sqlname")就行了 更方便

Ghai、海

2018-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;
}

Ghai、海

2018-12-21 11:09

model namespace的命名为model首字母小写, 方法名与sql语句名一致

JFinal

2018-12-22 12:46

jfinal 用模板引擎来管理 sql 比 mybatis 用 XML 管理 sql 要简洁方便得多,这里有详细的使用方法:
https://www.jfinal.com/doc/5-13

快乐的蹦豆子

2018-12-24 10:30

@Ghai、海 你这是重写了getpara方法啊,只是省了手工敲入key的操作,稍微省点操作

快乐的蹦豆子

2018-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层的查询
}

JFinal

2018-12-24 10:43

@快乐的蹦豆子 这么玩也可以,因为 jfinal 的 sql 管理本质上是可以独立运作的