mybatisli逆向工程

mybatisli逆向工程

viEcho Lv5

新做项目,怎么能少得了crud;之前有写过mybatis-plus的逆向工程,那么如果你正在搞新项目,并且你的项目还是用的mybatis,那么有必要折腾下mybatis的逆向工程;废话不多说开干!

引入依赖

1
2
3
4
5
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>

添加generatorConfig.xml配置文件

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
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<context id="MySqlTables" targetRuntime="MyBatis3" defaultModelType="flat">
<plugin type="com.local.demo.util.MybatisGeneratorPlugin">
</plugin>

<commentGenerator>
<!--是否去除自动生成的注释 true:是; false:否-->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接信息:驱动类、链接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/local_demo?characterEncoding=utf-8"
userId="root" password="123456">
<!--以下配置解决mysql 8.0版本以上时,mybatis在逆向生成时xml会生成重复的标签内容-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<javaTypeResolver>
<!--类型解析器-->
<!-- 默认false,把jdbc decimal 和 numeric 类型解析为integer -->
<!-- true,把jdbc decimal 和 numeric 类型解析为java.math.bigdecimal-->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>

<!-- 生成实体类及Example类的包名和位置-->
<javaModelGenerator targetPackage="com.local.demo.entity"
targetProject="src/main/java">
<!-- 是否让schema作为包后缀-->
<property name="enableSubPackages" value="true" />
<!-- 从数据库返回的值被清理前后的空格-->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成映射文件xml的包名和位置-->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<!-- 是否让schema作为包后缀-->
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成Dao接口的包名和位置-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.local.demo.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>

<!-- 用于自动生成代码的数据库表;生成哪些表-->
<table tableName="bug_t"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>

上面的配置除了包路径外,劝你别动;因为我已经踩过坑了,你拿去用就好;如果要自行研究,请随意

引入插件

最上面我们引入了自定义的插件,对应的代码如下:

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/**
* mybatis生成器插件
*
* @author echo
* @date 2024/03/08
*/
@Slf4j
public class MybatisGeneratorPlugin extends PluginAdapter {
/**
* 当前git用户名
*/
private static String CURRENT_GIT_USER_NAME = "Your name";

/**
* main 方法
*
* @param args args
*/
public static void main(String[] args) {
args = new String[] { "-configfile", System.getProperty("user.dir")+"/src/main/resources/mybatis-generator.xml", "-overwrite" };
ShellRunner.main(args);
}

static{
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("git", "config", "--global", "user.name");
try {
Process process = processBuilder.start();
// 读取标准输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
CURRENT_GIT_USER_NAME = reader.readLine();
} catch (IOException e) {
log.error("MybatisGeneratorPlugin 获取当前git用户名异常");
}
}


/**
* 验证
*
* @param list 列表
* @return boolean
*/
@Override
public boolean validate(List<String> list) {
return true;
}

/**
* 实体类生成时添加注释
*
* @param topLevelClass
* @param introspectedTable
* @return boolean
*/
@Override
public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
// 添加import
topLevelClass.addImportedType("lombok.Data");
// 添加注解
topLevelClass.addAnnotation("@Data");
if (StringUtility.stringHasValue(introspectedTable.getRemarks())) {
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
topLevelClass.addJavaDocLine(" *");
topLevelClass.addJavaDocLine(" * @author " + CURRENT_GIT_USER_NAME);
topLevelClass.addJavaDocLine(" * @date " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
topLevelClass.addJavaDocLine(" */");
} else {
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(" * TODO 请添加类注释");
topLevelClass.addJavaDocLine(" *");
topLevelClass.addJavaDocLine(" * @author " + CURRENT_GIT_USER_NAME);
topLevelClass.addJavaDocLine(" * @date " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
topLevelClass.addJavaDocLine(" */");
}
return true;

}

/**
* 字段生成时添加注释
*
* @param field
* @param topLevelClass
* @param introspectedColumn
* @param introspectedTable
* @param modelClassType
* @return boolean
*/
@Override
public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
field.addJavaDocLine("/**");
field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
field.addJavaDocLine(" */");
}
return true;
}

/**
* mapper生成时添加注释
*
* @param var1 var1
* @param var2 var2
* @return boolean
*/
@Override
public boolean clientGenerated(Interface var1, IntrospectedTable var2){
var1.addJavaDocLine("import org.apache.ibatis.annotations.Mapper;");
var1.addJavaDocLine("\n");
var1.addJavaDocLine("/**");
var1.addJavaDocLine(" * TODO 请添加类注释");
var1.addJavaDocLine(" *");
var1.addJavaDocLine(" * @author "+CURRENT_GIT_USER_NAME);
var1.addJavaDocLine(" * @date " + new SimpleDateFormat("yyyy/MM/dd").format(new Date()));
var1.addJavaDocLine(" */");

var1.addAnnotation("@Mapper");
return true;
}

/**
* 去掉生成getter方法
*
* @param method
* @param topLevelClass
* @param introspectedColumn
* @param introspectedTable
* @param modelClassType
* @return boolean
*/
@Override
public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
return false;
}

/**
* 去掉生成setter方法
*
* @param method
* @param topLevelClass
* @param introspectedColumn
* @param introspectedTable
* @param modelClassType
* @return boolean
*/
@Override
public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
return false;
}

/**=====以下方法是去掉mapper及xml中不必要的DML操作方法,使得生成的代码保持干净=====*/
@Override
public boolean clientInsertSelectiveMethodGenerated(Method var1, Interface var2, IntrospectedTable var3){
return false;
}

@Override
public boolean clientInsertSelectiveMethodGenerated(KotlinFunction kotlinFunction, KotlinFile kotlinFile, IntrospectedTable introspectedTable) {
return false;
}

@Override
public boolean clientUpdateByExampleSelectiveMethodGenerated(Method var1, Interface var2, IntrospectedTable var3){
return false;
}

@Override
public boolean clientUpdateAllColumnsMethodGenerated(Method var1, Interface var2, IntrospectedTable var3){
return false;
}

@Override
public boolean sqlMapInsertSelectiveElementGenerated(XmlElement var1, IntrospectedTable var2){
return false;
}

@Override
public boolean sqlMapUpdateByExampleSelectiveElementGenerated(XmlElement var1, IntrospectedTable var2){
return false;
}

@Override
public boolean clientDeleteByPrimaryKeyMethodGenerated(Method var1, Interface var2, IntrospectedTable var3){
return false;
}

@Override
public boolean clientDeleteByPrimaryKeyMethodGenerated(KotlinFunction kotlinFunction, KotlinFile kotlinFile, IntrospectedTable introspectedTable) {
return false;
}

@Override
public boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement var1, IntrospectedTable var2){
return false;
}
}

生成的效果图



  • Title: mybatisli逆向工程
  • Author: viEcho
  • Created at : 2024-03-07 23:31:16
  • Updated at : 2024-03-27 23:17:33
  • Link: https://viecho.github.io/2024/0307/mybatis-lixiang.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments