用Emacs编写mybatis
用Emacs编写mybatis
*/-->
code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}
用Emacs编写mybatis
1 效果图
2 配置
现在web开发,最流行的orm框架非mybatis莫属了,它功能强大,编写简单灵活,可以直接编写SQL,也可以添加条件控制。但是,正是因为mybatis采用xml作为结构语言,所以,难免会有大量的xml和sql混杂在一起的代码,对这些代码对语法高亮以及自动缩减就是一个问题。
在Emacs中对xml有web-mode对其提供了非常好的支持,无论是缩进、跳转、剪切、拷贝、折叠等等操作都非常简单高效,远超各种IDE。对SQL也有很好的支持。但是对于mybatis却没有任何支持,用web-mode则sql无法高亮和缩进,用sql则基础xml结构缩减有问题。网上关于Emacs中编写mybatis的也甚少有涉及的,说明用Emacs来进行java开发的还是很少的。于是,只能本人自己思考解决方案了。
我记得之前Purcell大神写了一个mmm-mode,说是可以把多个mode放到一起,不知是作何用,说不定可以让web-mode支持sql语句。于是就在package管理中安装了mmm-mode。然后,配置了web-mode中对sql-mode的支持:
(mmm-add-classes
'((web-sql-select :submode sql-mode
:front "<select[^>]*>[ \t]*\n" :back "[ \t]*</select>")
(web-sql-insert :submode sql-mode
:front "<insert[^>]*>[ \t]*\n" :back "[ \t]*</insert>")
(web-sql-update :submode sql-mode
:front "<update[^>]*>[ \t]*\n" :back "[ \t]*</update>")
(web-sql-delete :submode sql-mode
:front "<delete[^>]*>[ \t]*\n" :back "[ \t]*</delete>")
)) (mmm-add-mode-ext-class 'web-mode nil 'web-sql-select)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-insert)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-update)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-delete)
其实就是根据正则表达式来确定哪些代码是属于指定的submode的,对于mybatis中的sql语句而言,很简单就可以找出哪些是sql语句了。
然后,比较难的是对齐,因为两种语言混杂在一起,用其中任一一种都有问题。经过仔细的思考和试验之后,发现一种配置是相对合理,且实现简单的:
(defun mmm-indent-line-web-sql-submode ()
(web-mode-propertize)
(let (cur-type prev-type)
(save-excursion
(back-to-indentation)
(setq cur-type (get-text-property (point) 'tag-type)))
(save-excursion
(previous-line)
(back-to-indentation)
(setq prev-type (get-text-property (point) 'tag-type)))
(if (or
(not (or prev-type cur-type)) ; both lines sql
(and (not prev-type) (eq cur-type 'start)) ; sql -> xml
)
(sql-indent-line)
(web-mode-indent-line)))) (defun mmm-indent-line-web-sql ()
(interactive)
(funcall
(save-excursion
(back-to-indentation)
(mmm-update-submode-region)
(if (and mmm-current-overlay
(> (overlay-end mmm-current-overlay) (point)))
'mmm-indent-line-web-sql-submode
'web-mode-indent-line)))) (setq mmm-indent-line-function 'mmm-indent-line-web-sql)
如此,只使用mmm-mode用来支持mybatis的话,再加上一些其他的小配置,比如更新之后自动刷新语法高亮等,就很简单了:
(setq mmm-parse-when-idle t)
(setq mmm-global-classes nil)
(setq mmm-classes-alist nil)
(setq mmm-mode-ext-classes-alist nil)
总的配置,可以去我的github上查看,也可以直接拷贝下面的代码:
;;; init-mmm.el --- Summary
;;; Commentary:
;; comments ;;; Code:
(use-package mmm-mode
;; :hook ((web-mode . mmm-mode))
:commands mmm-mode
:config
(defun mmm-indent-line-web-sql-submode ()
(web-mode-propertize)
(let (cur-type prev-type)
(save-excursion
(back-to-indentation)
(setq cur-type (get-text-property (point) 'tag-type)))
(save-excursion
(previous-line)
(back-to-indentation)
(setq prev-type (get-text-property (point) 'tag-type)))
(if (or
(not (or prev-type cur-type)) ; both lines sql
(and (not prev-type) (eq cur-type 'start)) ; sql -> xml
)
(sql-indent-line)
(web-mode-indent-line)))) (defun mmm-indent-line-web-sql ()
(interactive)
(funcall
(save-excursion
(back-to-indentation)
(mmm-update-submode-region)
(if (and mmm-current-overlay
(> (overlay-end mmm-current-overlay) (point)))
'mmm-indent-line-web-sql-submode
'web-mode-indent-line)))) (setq mmm-parse-when-idle t)
(setq mmm-global-classes nil)
(setq mmm-classes-alist nil)
(setq mmm-mode-ext-classes-alist nil)
(setq mmm-indent-line-function 'mmm-indent-line-web-sql) (mmm-add-classes
'((web-sql-select :submode sql-mode
:front "<select[^>]*>[ \t]*\n" :back "[ \t]*</select>")
(web-sql-insert :submode sql-mode
:front "<insert[^>]*>[ \t]*\n" :back "[ \t]*</insert>")
(web-sql-update :submode sql-mode
:front "<update[^>]*>[ \t]*\n" :back "[ \t]*</update>")
(web-sql-delete :submode sql-mode
:front "<delete[^>]*>[ \t]*\n" :back "[ \t]*</delete>")
)) (mmm-add-mode-ext-class 'web-mode nil 'web-sql-select)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-insert)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-update)
(mmm-add-mode-ext-class 'web-mode nil 'web-sql-delete)
) (provide 'init-mmm)
;;; init-mmm.el ends here
Date: 2017-12-16 21:17
Author: WEN YANG
Created: 2017-12-16 Sat 22:02
用Emacs编写mybatis的更多相关文章
- 如何使用emacs编写c语言程序,并编译运行
vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...
- 天哪!手动编写mybatis雏形竟然这么简单
前言 mybaits 在ORM 框架中,可算是半壁江山了,由于它是轻量级,半自动加载,灵活性和易拓展性.深受广大公司的喜爱,所以我们程序开发也离不开mybatis .但是我们有对mabtis 源码进行 ...
- 阶段3 3.SpringMVC·_07.SSM整合案例_07.ssm整合之编写MyBatis框架测试保存的方法
再写一个测试的方法,测试save保存的方法 需要提交事务才能保存到数据库
- 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架
需要先搭建Mybits的环境. 用Mybits的注解的方式.把两个方法的sql语句写完 SqlMapConfig.xml resources下新建xml文档 把约束粘贴过来 两步操作 环境标签叫做en ...
- 移动商城第三篇【搭建Mybatis和Spring环境、编写Dao、Service在Core模块】
Mybatis和Spring环境搭建 由于我们的所编写的dao层.service代码可能前台和后台都需要用到的,因此我们把环境搭建在core模块中 逆向工程 首先,我们要做的就是品牌管理,我们首先来看 ...
- mybatis动态注解sql编写注意事项
最近在编写mybatis的动态注解sql遇到了不少的坑,在网上看到一篇讲的比较详细的文章,记录一下: https://mbd.baidu.com/newspage/data/landingshare? ...
- MyBatis Dao层的编写
传统的dao层编写 以前编写dao层,先新建一个包com.chy.dao,再写接口StudentDao: public interface StudentDao { public void inser ...
- 自己动手编写一个Mybatis插件:Mybatis脱敏插件
1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...
- mybatis-generator-gui--一个mybatis代码自动生成界面工具
mybatis-generator-gui是什么 介绍mybatis-generator-gui之前,有必要介绍一下什么是mybatis generator(熟悉的同学可以跳过这一节).我们都知道,通 ...
随机推荐
- SQL语句分类
SQL Structured Query Language SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 ...
- 阿里P7前端需要哪些技能
原谅我copy过来的,但是这个条理很清楚很有借鉴意义 前言 以下是从公众号的文章中获取到的一位阿里的前端架构师整理的前端架构p7的技能图谱,当然不是最完整.最系统的,所以之后我会一直维护更新这里的内容 ...
- 基于TMS320C6678、FPGA XC5VLX110T的6U CPCI 8路光纤信号处理卡
基于TMS320C6678.FPGA XC5VLX110T的6U CPCI 8路光纤信号处理卡 1.板卡概述 本板卡由我公司自主研发,基于CPCI架构,符合CPCI2.0标准,采用两片TI DSP T ...
- python常用函数 W
with…as with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭.线程中锁的自动获取和释放等.当python执行wi ...
- php session之redis存储
前提:redis已安装好. php代码: <?php ini_set("session.save_handler", "redis"); ini_set( ...
- POJ 3784 Running Median (动态中位数)
题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方 ...
- idhttp.get返回403错误解决办法
在GET之前,先指定UserAgent参数IdHTTP1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Ma ...
- python学习笔记(十五)python操作数据库
1.连接mysql,ip,端口号,密码,账号,数据库 2.建立游标 3.执行sql 4.获取结果 5.关闭连接,关闭游标 游标打开仓库的大门: import pymysql conn=pymysql. ...
- java连接redis5.0单机版报连接超时错误
使用java代码测试redis5.0单机版时,报redis连接超时异常,而linux上的redis能正常访问: redis.clients.jedis.exceptions.JedisConnecti ...
- 20180708-Java变量类型
public class Test{ public void pupAge(){ int age = 0; age = age + 7; System.out.println("Puppy ...