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