idea查看项目pid_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 如图,

cb5eb4486a9fca4777c22f3cb0a6f6b3.png

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

4e16ff684a1a76bfd810ee78263472f2.png

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

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

d307c44532c72e8ab5bb685836e6e329.png

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

a4aa8a76b36a3cd9bd7b9eb21a9841ef.png

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

39a8ff3acf0cafef7ec1c80239d5a887.png

c415e5bd89a5dc971786cd455ac9224f.png

到此,执行快捷键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进行调试

45104411cf1abe417c1f7925e4d113b6.png

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

46662fd5fa4b4f07a70c1dbf81e638a1.png

e2d46bcdd0af6cfd7ceb84881f870e85.png

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

aba9637bf0d99dafce0e8ea6c96c3626.png

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

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

MyBatis mapper文件中的变量引用方式&num;&lbrace;&rcub;与&dollar;&lbrace;&rcub;的差别

MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

&rsqb;&lbrack;mybatis&rsqb;MyBatis mapper文件中的变量引用方式&num;&lbrace;&rcub;与&dollar;&lbrace;&rcub;的差别

转自https://blog.youkuaiyun.com/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加一标识符做个判断,传一个只有我会使用的参数,然后动态 ...

&lbrack;转载&rsqb;MyBatis mapper文件中的变量引用方式&num;&lbrace;&rcub;与&dollar;&lbrace;&rcub;的差别

转载自:http://blog.youkuaiyun.com/szwangdf/article/details/26714603 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement ...

&lbrack;DB&rsqb;&lbrack;mybatis&rsqb;MyBatis mapper文件引用变量&num;&lbrace;&rcub;与&dollar;&lbrace;&rcub;差异

MyBatis mapper文件引用变量#{}与${}差异 默认,使用#{}语法,MyBatis会产生PreparedStatement中.而且安全的设置PreparedStatement參数,这个过 ...

mybatis mapper文件sql语句传入hashmap参数

1.怎样在mybatis mapper文件sql语句传入hashmap参数? 答:直接这样写map就可以

随机推荐

【&period;net 深呼吸】连接Access数据库应注意的几点

本地数据库可以有Y种选择,比如Sqlite.SQL Server Express.SQL Local DB.SQL Server CE.Access等,本文老周选用比较著名的Access本地数据库,在 ...

设置 Unix,Linux环境下的NLS&lowbar;LANG

设置 NLS_LANG 变量 1) 正确配置 LC_ALL 参数 2) 配置 telnet/ssh/SecureCRT 客户端的字符集 linux中可以用locale命令来查看 NLS_LANG设置, ...

windows下使用mysql双机热备功能

一. 准备工作 1. 准备两台服务器(电脑),接入局域网中,使互相ping得通对方 2. 两台服务器都安装mysql-server-5.1,必须保证mysql的版本一致 3. 假设,服务器A:192. ...

关于oracle的准备

作者:Steven Feuerstein 提高编写PL/SQL代码数量及质量的四个简单易行指导方针 我从1990年就开始编写PL/SQL代码.这意味着我已经编写了几万行的软件代码,但我确信,其中的绝大 ...

net SqlBulkCopy拷贝数据的问题

服务器配置:windows 2008 ,sql server 2008, oracle 10g. 在本地和同样配置的其他服务器上同样的程序,数据200万都很快就采集过来了,但是在发布的服务器上,如果b ...

【python】日志模块

# -*- coding: utf-8 -*- """ Created on Thu Jul 09 09:36:59 2015 @author: dapenghuang ...

Android&lowbar;menu&lowbar;SubMenu

menu.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值