这个技巧绝对可以提升你的开发效率

1.前言

最近在改造一个项目,之前由于作为其他软件的插件,使用mybatis会有冲突,所以并没有使用mybatis,而是使用的spring的springjdbc。现在决定要脱离那个设计软件,进而需要将之前大段的sql转换到mybatis中。本篇文章主要针对一段代码,分享一下如何快速的转换,这里会结合sublime(notepad++也可以)和excel处理。当然,目前已经有很多自动生成代码的工具,这是一种思路,希望对大家有所帮助。

2.试验数据

2.1 Sql语句

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)
);

2.2 处理程序代码

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。现在我们需要关注的是方法体中的第三个参数(数据库表字段)和第四个参数(对象属性名)。

3.数据处理

3.1 思考

现在我们要生成insert语句,先要考虑insert语句需要几部分。他的语法是INSERT INTO IDS_PIN () VALUES(),其中“INSERT INTO IDS_PIN”和“VALUES”耗时不大,我们可以手动书写,现在的问题是括号里的如何快速实现,一个是需要列出逗号隔开的列名,一个是IdsPin对象的属性。那么我们就用上面的java代码生成这两部分内容。

3.2 数据处理

为了方便后面的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中,由于前面字段和后面的使用制表字符,所以会自动成为两列。

4 生成Insert语句

4.1 生成列名字段

根据sql语法规则,列表应该是用逗号隔开,所以我们需要做如下处理。

4.1.1 在C列输出A列的值+","。选中C1:C20,按快捷键ctrl+e。效果如下:

4.1.2 这样我们将列名直接拷贝到Sql语句的Insert into ids_pin()values()的第一个括号中。

4.2 生成values部分内容

4.2.1 对于mybatis框架,获取值应该是#{对象属性名},所以我们通过excel公式将其变成需要的格式。输入一下公式:

="#{"&B1&"},"

 

4.2.2 将值拷贝到第二个括号内。至此,Insert的sql语句生成成功。注意,这里刚才B列收个字母为空格,可以查找替换调。

5 生成Update语句

5.1 思考

对于update语句,主要格式为:

update ids_pin set column = value[,column2 = value2]  where id = idValue。

而在mybatis应该是如下形式:

<update id="updateIdsPin" parameterType="cn.surpass.skill.model.IdsPin">
     UPDATE IDS_PIN 
     <set>
         <if test="type != null and type != ''">
             ,TYPE = #{type}
         </if>
     </set>
     WHERE ID = #{id}
</update>

通过上面的分析我们知道其实问题的关键是set里的一些if判断。所以问题的重心就是生成这一系列if判断。

5.2 生成if判断字符串,在excel中输入如下公式:

="<if test="""&B1&" != null and "&B1&" != ''"">,"&A1&" = #{"&B1&"}</if>"

5.3 将字符串选择拷贝到对应的位置,格式化代码即可。

发布了88 篇原创文章 · 获赞 97 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/oYinHeZhiGuang/article/details/104875292