最近在改造一个项目,之前由于作为其他软件的插件,使用mybatis会有冲突,所以并没有使用mybatis,而是使用的spring的springjdbc。现在决定要脱离那个设计软件,进而需要将之前大段的sql转换到mybatis中。本篇文章主要针对一段代码,分享一下如何快速的转换,这里会结合sublime(notepad++也可以)和excel处理。当然,目前已经有很多自动生成代码的工具,这是一种思路,希望对大家有所帮助。
CREATE TABLE IDS_PIN (
ID INT(11) PRIMARY KEY AUTO_INCREMENT,
CONN_ID INT(11),
PIN_CODE VARCHAR(20),
DIRECTION VARCHAR(32),
TYPE VARCHAR(64),
CODE VARCHAR(64),
SIGNAL_CONTENT VARCHAR(128),
LOAD_CHARACTER VARCHAR(64),
LOAD_VOLTAGE VARCHAR(64),
LOAD_CURRENT VARCHAR(64),
TWIN_TWIST VARCHAR(64),
SHIELD VARCHAR(64),
SHIELD_GROUND VARCHAR(64),
COLOR VARCHAR(64),
LINENUMBER VARCHAR(64),
REMARK VARCHAR(128),
IS_IGNORE INT(1),
FILE_LIST_ID VARCHAR(20) NOT NULL,
MAIN_ATTRID VARCHAR(20),
PIN_LEVEL INT(1),
LASTREPLACEDPINID VARCHAR(20),
FROM_ATTRID VARCHAR(20),
TO_ATTRID VARCHAR(20),
PRIO_LEVEL INT(1),
PRIMARY_ATTR VARCHAR(255)
);
CREATE TABLE IDS_CONNECTOR (
ID INT(11) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(128)
);
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "CONN_ID", pin.getConn().getId());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "PIN_CODE", pin.getPinCode());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "DIRECTION", pin.getDirection());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "TYPE", pin.getType());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "CODE", pin.getCode());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "SIGNAL_CONTENT", pin.getSignalContent());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "LOAD_CHARACTER", pin.getLoadCharacter());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "LOAD_VOLTAGE", pin.getLoadVoltage());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "LOAD_CURRENT", pin.getLoadCurrent());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "TWIN_TWIST", pin.getTwinTwist());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "SHIELD", pin.getShield());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "SHIELD_GROUND", pin.getShiledGround());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "COLOR", pin.getColor());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "LINENUMBER", pin.getLineNumber());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "REMARK", pin.getRemark());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "IS_IGNORE", pin.getIsIgnore());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "FILE_LIST_ID", pin.getFileListId());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "MAIN_ATTRID", pin.getMainAttrId());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "PIN_LEVEL", pin.getPinLevel());
SqlUtil.fillSqlFieldAndSqlValue(sqlSb, sqlValueSb, "LASTREPLACEDPINID", pin.getConnId());
这里大家不要关心这段代码处理什么逻辑,我只是对齐进行封装了一下,主要方便生成insert或者update语句的sql。现在我们需要关注的是方法体中的第三个参数(数据库表字段)和第四个参数(对象属性名)。
现在我们要生成insert语句,先要考虑insert语句需要几部分。他的语法是INSERT INTO IDS_PIN () VALUES(),其中“INSERT INTO IDS_PIN”和“VALUES”耗时不大,我们可以手动书写,现在的问题是括号里的如何快速实现,一个是需要列出逗号隔开的列名,一个是IdsPin对象的属性。那么我们就用上面的java代码生成这两部分内容。
为了方便后面的update语句,我们先将这两列数据提取一下。通过上面我们发现一个规律,就是数据字段是用双引号包裹的,对象属性是最后的字符串,那么我们可以通过sublime快速将无用的信息删除掉。
3.2.1 打开sublime,将内容复制到软件中
3.2.2 按【ctrl+H】打开查找替换对话框
3.2.3 点击左侧.*图标,即支持正则表达式查找替换,如下图
3.2.4 在find和replace对话框输入内容,如上图。
.*"(.*)",(.*)
\1\t\2
3.2.5 我们分析一下这个表达式,这里对正则表达是熟悉的可以先学习一下
3.2.4执行查找替换
3.2.5 接下来我们要将pin.get/get删除,将括号删除,并且将get后面的第一个字母变成大写字母。
\\将pin.get删除,并且将get后面的大写字母变成小写字母
find:pin.get(.)
replace:\L\1\E
\\删除括号以及括号后面的分号
find:\(\)(\);)?
replace:
\\将剩下的get删除,并且将get后面大写字母编程小写字母
find:get(.)
replace:\L\1\E
3.2.6 最终数据格式如下图。
3.2.7 我们将其拷贝到excel中,由于前面字段和后面的使用制表字符,所以会自动成为两列。
根据sql语法规则,列表应该是用逗号隔开,所以我们需要做如下处理。
4.1.1 在C列输出A列的值+","。选中C1:C20,按快捷键ctrl+e。效果如下:
4.1.2 这样我们将列名直接拷贝到Sql语句的Insert into ids_pin()values()的第一个括号中。
4.2.1 对于mybatis框架,获取值应该是#{对象属性名},所以我们通过excel公式将其变成需要的格式。输入一下公式:
="#{"&B1&"},"
4.2.2 将值拷贝到第二个括号内。至此,Insert的sql语句生成成功。注意,这里刚才B列收个字母为空格,可以查找替换调。
对于update语句,主要格式为:
update ids_pin set column = value[,column2 = value2] where id = idValue。
而在mybatis应该是如下形式:
UPDATE IDS_PIN
,TYPE = #{type}
WHERE ID = #{id}
通过上面的分析我们知道其实问题的关键是set里的一些if判断。所以问题的重心就是生成这一系列if判断。
=","&A1&" = #{"&B1&"} "