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并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17290021 在http://blog.csdn.net/ns_code/article/ ...
- 第二次项目冲刺(Beta阶段)5.21
1.提供当天站立式会议照片一张 会议内容: ①检查前一天的任务情况,做出自我反省. ②制定新一轮的任务计划. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 王婧 #53实现多对多查重 # ...
- 201521123082 《Java程序设计》第1周学习总结
201521123082 <Java程序设计>第1周学习总结 标签(空格分隔): Java 1. 本周学习总结 0.初步了解Java语言及其发展历史和过程,同时也初步了解了Java具有跨平 ...
- 201521123039 《java程序设计》第八周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 总结: 1.集合可以动态修改大小,但是不可以存放基本数据类型: 2.java中任何对象都是is-a Objec ...
- 201521123104《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: pu ...
- 201521123052《Java程序设计》第7周学习总结
1. 本周学习总结 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Ob ...
- #黑客社会工程学攻防演练#[Chapter 1]
1.1 什么是社会工程学 社会工程学(Social Engineering)是关于建立理论通过自然的.社会的和制度上的途径并特别强调根据现实的双向计划和设计经验来一步一步地解决各种社会问题.社会工程学 ...
- 201521123013 《Java程序设计》第12周学习总结
1. 本章学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. Q ...
- Spring - bean的lazy-init属性(懒加载)
默认情况下,容器初始化的时候便会把bean实例化,通常这样做可以让一些配置或者bean实例化的异常在容器启动的时候就发现,而不是在N久之后.但有时候,我们希望某个可能不会用到但又不是100%不用的be ...
- Spring注解@Qualifier
在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean ...