intellij idea 插件开发--快速定位到mybatis mapper文件中的sql
intellij idea 插件开发--快速定位到mybatis mapper文件中的sql
流浪汉8023 发表于2个月前
intellij idea 插件开发--快速定位到mybatis mapper文件中的sql
  • 发表于 2个月前
  • 阅读 1644
  • 收藏 82
  • 点赞 4
  • 评论 8

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 在使用mybatis开发的时候,常常需要查看对应方法的sql,经常是双击shift,然后搜索mapper文件,再找到对应的sql语句。开发久了,感觉很累,自己写个小插件得了。通过快捷键,可以快速定位到sql

    intellij idea 提供了openApi,通过openApi我们可以自己开发插件,提高工作效率。这边直接贴个链接,可以搭个入门的demo;http://www.jianshu.com/p/2427e4cfd3e9,也可以自己网上找,文章比较多。。本人用的intellij idea 2017,jdk需要1.8以上。

    第一步:new project,选择IntelliJ Plaltform Plugin 如图,

然后点击下一步,填写项目名,点击finish,项目结构如下:

plugin.xml是插件的配置文件;

第二步:鼠标点击src文件夹,然后Alt+Insert 快捷键,选择action,如图:

然后填写相关信息,这边分组到JavaGenerateGroup1,快捷键为Ctrl+Shift+X(即此快捷键执行这个action的代码)

点击ok后,将创建名为GoToMapperAction的java类,以及plugin.xml中出现对应配置信息,如下图:

到此,执行快捷键Ctrl+Shift+X,就会执行actionPerformed方法了;接下来就是写具体逻辑代码了;

第三步:方法actionPerformed 中的参数AnActionEvent很有用,携带了交互的当前上下文信息,要检索活动project、选中的文件、编辑器中选中状态等IDE的当前状态信息,可以使用AnActionEvent.getData()方法。DataKeys类中定义了可以传递给此方法的不同数据键值;

1.获取方法名:

PsiElement psiElement = e.getData(PlatformDataKeys.PSI_ELEMENT);//鼠标所在的元素,这里就是方法
if (psiElement == null) {
   return;
}
String methodName = psiElement.toString().replace("PsiMethod:", "");//获取到方法名

2.获取方法所在的类名:

PsiElement psiElementParent = psiElement.getParent();//获取方法的父元素
if (psiElementParent == null) {
   return;
}
PsiFile containingFile = psiElementParent.getContainingFile();//获取到文件,这里是java类
String className = containingFile.getName();//获取到类名

3.到这里,我们已经获取到了类名,方法名,,那就可以确定对应的mybatis mapper文件的id=“方法名”的sql位置;我的项目中命名比较有规律,所以对应mapper文件的名称可以这样确定:

String mapperName ;
if (className.endsWith("Service.java")) {
    mapperName = className.replace("Service.java", "Mapper.xml");
}
else if (className.endsWith("Dao.java")) {
    mapperName = className.replace("Dao.java", "Mapper.xml");
}
else {
    return;
}

当然,还可以通过mapper的命名空间找到;

4.打开xml

Project project = e.getProject();
//查找名称为mapperName的文件
PsiFile[] files = PsiShortNamesCache.getInstance(project).getFilesByName(mapperName);
if (files.length == 1) {
    XmlFile xmlFile = (XmlFile) files[0];
    String xml = xmlFile.getDocument().getText();//获取mapper xml字符串
    //判断mapper是否存id="methodName"的sql,存在就打开对应的mapper xml
    //这里判断比较简单,不严谨。可以通过XmlFile遍历节点判断是否存在
    if (StringUtil.isNotEmpty(xml) && xml.contains("id=\"" + methodName + "\"")) {
        toMapper(project, methodName, files[0].getVirtualFile(), xml);
    }
}
/**
 * 进入mapper
 * @param project
 * @param methodName
 * @param mapperFile
 * @param xml
 */
private void toMapper(Project project, String methodName, VirtualFile mapperFile, String xml) {
    //打开xml文件
    OpenFileDescriptor openFileDescriptor = new OpenFileDescriptor(project, mapperFile);
    Editor editor = FileEditorManager.getInstance(project).openTextEditor(openFileDescriptor, true);
    
    //获取sql所在的行数,这里用了比较笨的方法。api找了很久没找到有什么方法可以获取行号,希望有大神指点
    String[] split = xml.split("\n");
    int lineNumber = 0;
    for (int i = 0; i < split.length; i++) {
        String line = split[i];
        if (StringUtil.isNotEmpty(line) && line.contains(methodName)) {
            lineNumber = i;
            break;
        }
    }
    //定位到对应的sql
    CaretModel caretModel = editor.getCaretModel();
    LogicalPosition logicalPosition = caretModel.getLogicalPosition();
    logicalPosition.leanForward(true);
    LogicalPosition logical = new LogicalPosition(lineNumber, logicalPosition.column);
    caretModel.moveToLogicalPosition(logical);
    SelectionModel selectionModel = editor.getSelectionModel();
    selectionModel.selectLineAtCaret();
}

5.至此,代码完成,现在可以测试下了,点击右上角运行,会打开一个新的idea进行调试

然后在新的idea中打开项目,把鼠标聚焦在你要找的方法中,然后快捷键Ctrl+Shift+X,跳到xml,这样就是成功了。

6.发布,生成jar文件,然后就可以安装到idea使用了

 

最后:这里只是说明了大体逻辑,你还可以判断xml是否有这个sql,没有就自动创建一个tag等等,openapi有很多概念等等,大家可以自行百度或去官网查看文档。

下图是本人最近写的插件功能,只适用自己的项目,就不上代码了,更多有意思功能可以自己开发。

欢迎加入qq群讨论:461964997

共有 人打赏支持
粉丝 13
博文 5
码字总数 3726
评论 (8)
ddatsh
支持下
现已收费的mybatis plugin貌似是最好用的?
流浪汉8023

引用来自“ddatsh”的评论

支持下
现已收费的mybatis plugin貌似是最好用的?
哈,还不知道有这个插件,查了下功能好像很多,不过好像是收费。
李嘉图
正好,以后我学习一下
久久0二
可以可以
流浪汉8023

引用来自“久久0二”的评论

可以可以
谢谢谢谢
光蓝

引用来自“ddatsh”的评论

支持下
现已收费的mybatis plugin貌似是最好用的?

引用来自“流浪汉8023”的评论

哈,还不知道有这个插件,查了下功能好像很多,不过好像是收费。
这个插件有破解版
黑子鱼咖
学习学习!有兴趣了
哎码
支持支持,对手写插件的帮助很大。
当然有个叫free mybatis plugin的功能已经很不错了,而且是免费的
×
流浪汉8023
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: