intellij idea 插件开发--快速定位到mybatis mapper文件中的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有很多概念等等,大家可以自行百度或去官网查看文档。
下图是本人最近写的插件功能,只适用自己的项目,就不上代码了,更多有意思功能可以自己开发。
intellij idea 插件开发--快速定位到mybatis mapper文件中的sql的更多相关文章
- MyBatis mapper文件中的变量引用方式#{}与${}的差别
MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...
- ][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别
转自https://blog.csdn.net/szwangdf/article/details/26714603 MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使 ...
- MyBatis mapper文件中使用常量
MyBatis mapper文件中使用常量 Java 开发中会经常写一些静态常量和静态方法,但是我们在写sql语句的时候会经常用到判断是否等于 //静态类 public class CommonCod ...
- Mybatis mapper文件中的转义方法
在mybatis中的sql文件中对于大于等于或小于等于是不能直接写?=或者<=的,需要进行转义,目前有两种方式: 1.通过符号转义: 转义字符 < < 小于号 ...
- Mybatis Mapper文件中的一小坑
前几天来一需求,实现过程中需要修改一个底层的查询接口,具体修改就是在where中添加一个条件,由于这个底层SQL使用的地方太多,所以就想着是用if加一标识符做个判断,传一个只有我会使用的参数,然后动态 ...
- [转载]MyBatis mapper文件中的变量引用方式#{}与${}的差别
转载自:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement ...
- [DB][mybatis]MyBatis mapper文件引用变量#{}与${}差异
MyBatis mapper文件引用变量#{}与${}差异 默认,使用#{}语法,MyBatis会产生PreparedStatement中.而且安全的设置PreparedStatement參数,这个过 ...
- mybatis mapper文件sql语句传入hashmap参数
1.怎样在mybatis mapper文件sql语句传入hashmap参数? 答:直接这样写map就可以 <select id="selectTeacher" paramet ...
- Mybatis mapper文件占位符设置默认值
如果要设置占位符默认值的话:需要进行 设置 org.apache.ibatis.parsing.PropertyParser.enable-default-value 属性为true启用占位符默认值处 ...
随机推荐
- java初阶
java的开发工具分成 IDE(integrated developmentenvironment )和JDk(Java Development Kit) 一个.java中只能有一个public类且至 ...
- 转:js闭包
一切都是对象 "一切都是对象"这句话的重点在于如何去理解"对象"这个概念. --当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascr ...
- MyEclipse安装步骤和破解
Myeclipse的安装步骤 MyEclipse简介: MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用 ...
- 团队作业8——第二次项目冲刺(Beta阶段)--5.25 5th day
团队作业8--第二次项目冲刺(Beta阶段)--5.25 fifth day Day five: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完 ...
- 201521123097《Java程序设计》第四周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 在本周的学习中,我知道了在类的定义里,还学习到了抽象类以及抽象方法的使用格式. 2. 书面作 ...
- Python[小甲鱼005Python的数据类型]
一.数值类型 整形 布尔类型 True 和 False 即1和0 浮点型 e记法 e ,例如 1.5e11 = 150000000000 ...
- 201521123057 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 视频转GIF图
1.工具 PS6.0(其他版本也可以) 视频一个(具体格式应该无所谓) 2.步骤 (1)打开PS,点击导入->视频帧到图层 (2)选择视频打开 (3)进行范围选择.由于每隔2帧导入一张图片,每秒 ...
- Hyperledger Fabric 1.0 从零开始(一)——吐槽
在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...
- response对象的使用
使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面.重定向操作支持将地址重定向到不同的主机上,这一点与转发是不同的.在客户端浏览器上将会得到跳转地址,并重新发送 ...