文档章节

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

流浪汉8023
 流浪汉8023
发布于 2017/10/11 11:10
字数 1032
阅读 2179
收藏 82
点赞 4
评论 8

    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有很多概念等等,大家可以自行百度或去官网查看文档。

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

欢迎加入qq群讨论:461964997

© 著作权归作者所有

共有 人打赏支持
流浪汉8023
粉丝 13
博文 5
码字总数 3726
作品 0
厦门
后端工程师
加载中

评论(8)

哎码
哎码
支持支持,对手写插件的帮助很大。
当然有个叫free mybatis plugin的功能已经很不错了,而且是免费的
黑子鱼咖
黑子鱼咖
学习学习!有兴趣了
光蓝
光蓝

引用来自“ddatsh”的评论

支持下
现已收费的mybatis plugin貌似是最好用的?

引用来自“流浪汉8023”的评论

哈,还不知道有这个插件,查了下功能好像很多,不过好像是收费。
这个插件有破解版
流浪汉8023
流浪汉8023

引用来自“久久0二”的评论

可以可以
谢谢谢谢
久久0二
久久0二
可以可以
李嘉图
李嘉图
正好,以后我学习一下
流浪汉8023
流浪汉8023

引用来自“ddatsh”的评论

支持下
现已收费的mybatis plugin貌似是最好用的?
哈,还不知道有这个插件,查了下功能好像很多,不过好像是收费。
ddatsh
ddatsh
支持下
现已收费的mybatis plugin貌似是最好用的?
IntelliJ IDEA插件——冷门神器分享

IntelliJ IDEA就不必介绍了,至今还能保持IDE前三的神器,如今java程序员的首选,今天介绍几款冷门但绝对是神器的IDEA插件。 前言 IDEA自不必说,IDEA插件是开发中必备的神器,相信大家对常见...

IT米粉
04/03
0
0
Spring boot Mybatis 整合(完整版)

个人开源项目 springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页、个人作品、个人博客) 朋友自制的springboot接口文档组件swagger2 更多干货 SpringBoot系列目录...

舒运
07/09
0
0
IntelliJ IDEA2016.3.3 常用设置

本篇内容为大家提供的是IntelliJ IDEA2016.3.3 常用设置配置。感兴趣的同学可以参考学习下,具体内容如下: 1常用设置 1.1代码提示 IntelliJ IDEA 的代码提示和补充功能有一个特性:区分大小...

paascloud
2017/02/05
0
0
springBoot 整合mybatis

springBoot 整合mybatis s使用IDEA开发,为了提高效率,推荐使用插件: 说明:上述插件可以在低版本的IDEA中找到破解版 项目结构 说明: mapper/UserMapper.xml 是与接口 对应的mapper文件 UserMa...

黄威
07/06
0
0
洋葱头1519/tramp

tramp 准备: 1.通过git或者下载导入idea; 2.(选做)安装 srcmainresourcesresourcessqlgenerator-core-1.0-SNAPSHOT.jar 到maven仓库(用于代码生成,节省开发时间) 采用maven插件形式来生成...

洋葱头1519
2017/12/05
0
0
IDEA找齐Eclipse中的快捷键

鼠标浮在方法名上就能看注释(这个功能的名称叫quick documentation,快捷键是F2或Ctrl+Shift+Space) 设置成自动显示,方法如下: There is nice feature which shows quick documentation wh...

cyper
2015/01/30
0
6
IntelliJ IDEA 13 + Genymotion 2.3 开发环境搭建

【声明】 本文来自:http://www.cnblogs.com/smyhvae/p/4013535.html 【有修改】 【正文】 【开发环境】 物理机版本:Win 7旗舰版(32位) Java SDK版本:jdk1.8.0_20(32位) Android SDK版...

Lofo
2014/10/26
0
0
Intellij IDEA 的使用

前言: 为什么我要选择intellij idea呢?原因有三 1.以前公司的项目 在myeclipse10中不稳定 myeclipse说不定什么时候就崩溃卡死了 而intellij很稳定 2.界面高端洋气 用我朋友的话说 看着跟搞...

蛙牛
2013/11/17
0
11
IntelliJ IDEA使用技巧——插件的安装及使用方法

IntelliJ IDEA 支持非常多的插件,熟练的使用插件,能够有效提高我们的开发效率以及用户体验。 首先,进入插件安装界面: Mac: -> -> ; Windows: -> -> . 标注 1:显示 IntelliJ IDEA 的插...

发芽的土豆丶
2017/11/02
0
0
IntelliJ IDEA 特性集合

在这篇文章中,我想向您展示 IntelliJ IDEA 中最棒的 20 个代码自动完成的特性,可让 Java 编码变得更加高效。对任何集成开发环境来说,代码的自动完成都是最最重要的一项功能,它根据你输入...

thomas1111
2013/12/15
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
33分钟前
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
36分钟前
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
53分钟前
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
58分钟前
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
0
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
今天
1
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
今天
1
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部