基于mybatis-generator代码生成工具改(链式方法实体版)

概述

一直以来使用原生mybatis-generator的我发现有一个地方很不方便,即它生成的实体类的set方法返回值是void,而目前比较流行的则是链式set的写法,即set方法返回值不再是void而是这个类本身,这样的好处是你可以连写,比如demo.setA().setB().setC(),对此,我对它进行了改动,改动的思路比较简单,它底层代码我看不太懂,但我采用了一个简单的方法,即将它生成后的原生实体类通过文件操作改为链式实体类。

详细

代码实现过程

首先说下我的思路,我是将其生成的java文件读取其内容,然后查找到相应的位置,找到目标代码,替换为自己的代码,最后将其写入该java文件。

其核心代码可以说就是一个类处理器,不依赖任何框架(当然也不依赖mybatis-generator)。

下面来看几个核心的类。

1、文件工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.zs.tools;
 
public class FileUtils {
 
    /**
     * 得到项目根路径
     * 比如:E:/Workspaces/eclipse/mybatis-zs-tool/
     * @return
     */
    public static String getRootPath(){
        String str=FileUtils.class.getResource("/").getFile().toString().substring(1);
        String rootPath=str.replaceAll("target/classes/", "");
        return rootPath;
    }
}

这个比较简单,就是取得项目根路径。

2、实体处理工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package com.zs.tools;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 2018-1-25
 * 该类的作用是将一个生成的类的setget方法中的set方法改为:返回值为该类
 * 比如:
 * public As setB(String b) {
        this.b = b;
        return this;
    }
 * @author it023
 *
 */
public class EntityUtils {
 
     
    public static String handleSetTransVoidToClass(File file) throws IOException{
        if (!file.isDirectory()) {
            String tmp="";
            FileReader fr=new FileReader(file);
            BufferedReader br=new BufferedReader(fr);
            String str;
            while ((str = br.readLine()) != null) {              
                tmp=tmp+str+"\r\n";
            }
            //找到类名
            String className=tmp.substring(tmp.indexOf("class")+5+1, tmp.indexOf("{")-1);
            //先切开
            String ss[]=tmp.split("set");
            List<String> litmp=new ArrayList<String>();//容器备用,之所用用它是因为它是变长的
            //如果不满足这个条件,说明找错了,那么就将相邻的两个合并
            for (int i=0;i<ss.length-1;i++) {
                /*条件1:切了之后最后一个字符是空格
                 *条件2:最后一个字符之前的四个字符是“void”
                 *如果满足上面两个条件,说明我们找到了,将其处理好,然后放入容器
                 *如果不满足上面两个条件,就将它与之后的一个合并,并放入容器
                 */
                String s=ss[i];
                String snext=ss[i+1];
                if (s.substring(s.length()-1, s.length()).equals(" ") && s.substring(s.length()-1-4, s.length()-1).equals("void")) {
                    //开始处理
                    String a1=s.substring(0, s.length()-5)+className+" ";
                    ss[i+1]=snext.substring(0, snext.indexOf(";"))+";\r\n        return this;"+snext.substring(snext.indexOf(";")+1, snext.length());
                    litmp.add(a1);
                }else{
                    litmp.add(s);
                }
            }
            litmp.add(ss[ss.length-1]);
            String result="";
            for (String s : litmp) {
                result=result+s+"set";
            }
            result=result.substring(0, result.length()-3);
            PrintWriter out=new PrintWriter(file);
            out.write(result);
            //-关闭流-
            fr.close();
            br.close();
            out.flush();
            out.close();
        }
        return "修改成功";
    }
     
}

其重点就在于如何准确找到set方法的地方,代码注释中有写。

3、启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.zs.main;
 
import java.io.File;
import java.io.IOException;
import org.mybatis.generator.api.ShellRunner;
import com.zs.tools.EntityUtils;
import com.zs.tools.FileUtils;
 
public class App
{
    public static void main( String[] args ) throws IOException{
        App.work();
    }
     
    public static void work() throws IOException {
        String[] args = new String[] { "-configfile", "resources\\generatorConfig.xml", "-overwrite" };
        ShellRunner.main(args);
        String beanPath=FileUtils.getRootPath()+"resources/com/zs/entity";
        File filedir=new File(beanPath);
        File files[]=filedir.listFiles();
        for (File file : files) {
            EntityUtils.handleSetTransVoidToClass(file);
        }
    }
}

调用App.work()即可启动。

 

项目文件结构截图

QQ截图20180126102928.png

 

演示效果

image.png

最终可以看到,实现了我想要的效果。

 

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

 

posted on   demo例子集  阅读(585)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示