intellij idea 插件開發--快速定位到mybatis mapper文件中的sql

    intellij idea 提供了openApi,經過openApi咱們能夠本身開發插件,提升工做效率。這邊直接貼個連接,能夠搭個入門的demo;http://www.jianshu.com/p/2427e4cfd3e9,也能夠本身網上找,文章比較多。。本人用的intellij idea 2017,jdk須要1.8以上。java

    第一步:new project,選擇IntelliJ Plaltform Plugin 如圖,sql

而後點擊下一步,填寫項目名,點擊finish,項目結構以下:api

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

第二步:鼠標點擊src文件夾,而後Alt+Insert 快捷鍵,選擇action,如圖:app

而後填寫相關信息,這邊分組到JavaGenerateGroup1,快捷鍵爲Ctrl+Shift+X(即此快捷鍵執行這個action的代碼)編輯器

點擊ok後,將建立名爲GoToMapperAction的java類,以及plugin.xml中出現對應配置信息,以下圖:ide

到此,執行快捷鍵Ctrl+Shift+X,就會執行actionPerformed方法了;接下來就是寫具體邏輯代碼了;測試

第三步:方法actionPerformed 中的參數AnActionEvent頗有用,攜帶了交互的當前上下文信息,要檢索活動project、選中的文件、編輯器中選中狀態等IDE的當前狀態信息,可使用AnActionEvent.getData()方法。DataKeys類中定義了能夠傳遞給此方法的不一樣數據鍵值;idea

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

相關文章
相關標籤/搜索