引入pom依赖 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator</artifactId> <version>1.3.6</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.6</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
代码生成器xml文件
<?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> <!--classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置 可选 --> <classPathEntry location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar"/> <!-- 一个数据库一个context,defaultModelType="flat" 大数据字段,不分表 --> <context id="MysqlTables" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 --> <property name="autoDelimitKeywords" value="true"/> <!-- 生成的Java文件的编码 --> <property name="javaFileEncoding" value="utf-8"/> <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; --> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <!-- 格式化java代码 --> <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/> <!-- 格式化XML代码 --> <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!-- 自定义lombok插件 --> <!-- 自定义service与controller插件 //额外添加的service和controller配置,配合下面的类用,如果启动不了可以把这个plugin删除掉--> <plugin type="com.example.ServiceAndControllerGeneratorPlugin" > <property name="targetProject" value="./src/main/java"/> <property name="servicePackage" value="com.jzxs.etp.service"/> <property name="serviceImplPackage" value="com.jzxs.etp.service.impl"/> <property name="controllerPackage" value="com.jzxs.etp.controller"/> <!--UserService,该值则为Service--> <property name="serviceSuffix" value="Service"/> <!--Service接口的父接口--> <property name="superServiceInterface" value="org.aurochsframework.boot.commons.service.GeneralService"/> <!--ServiceImpl的父类--> <property name="superServiceImpl" value="org.aurochsframework.boot.commons.service.AbstractGeneralService"/> <!--controller的父类接口--> <property name="superController" value="org.aurochsframework.boot.commons.controller.GeneralCrudController"/> </plugin> <!-- 注释 --> <commentGenerator> <property name="suppressAllComments" value="true"/><!-- 是否取消注释 --> <property name="suppressDate" value="false"/> <!-- 是否生成注释代时间戳--> </commentGenerator> <!-- jdbc连接--> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC" userId="root" password="521521"/> <!-- 类型转换 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成实体类地址 --> <javaModelGenerator targetPackage="com.example.web.entity" targetProject="src/main/java"> <!-- 是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值去掉前后空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成map.xml文件存放地址 --> <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 生成接口dao --> <javaClientGenerator targetPackage="com.example.web.dao" targetProject="src/main/java" type="XMLMAPPER"> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- table可以有多个,每个数据库中的表都可以写一个table,tableName表示要匹配的数据库表,也可以在tableName属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 enableSelectByPrimaryKey相应的配置表示是否生成相应的接口 --> <table tableName="t_integral" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true" enableDeleteByPrimaryKey="true"> <property name="useActualColumnNames" value="true"/> </table> </context> </generatorConfiguration>
添加启动文件
mybatis-generator:generate -e
启动就行了,
service controller类拓展(一般来的自己写就行了,如果报错就把上面对应的plugin去掉)
package com.example; import org.mybatis.generator.api.*; import org.mybatis.generator.api.dom.java.*; import java.util.ArrayList; import java.util.List; import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; import static org.mybatis.generator.internal.util.messages.Messages.getString; public class ServiceAndControllerGeneratorPlugin extends PluginAdapter { // 项目目录,一般为 src/main/java private String targetProject; // service包名,如:com.thinkj2ee.cms.service.service private String servicePackage; // service实现类包名,如:com.thinkj2ee.cms.service.service.impl private String serviceImplPackage; // Controlle类包名,如:com.thinkj2ee.cms.service.controller private String controllerPackage; // service接口名前缀 private String servicePreffix; // service接口名后缀 private String serviceSuffix; // service接口的父接口 private String superServiceInterface; // service实现类的父类 private String superServiceImpl; // controller类的父类 private String superController; // dao接口基类 private String superDaoInterface; // Example类的包名 private String examplePacket; private String recordType; private String modelName; private FullyQualifiedJavaType model; private String serviceName; private String serviceImplName; private String controllerName; @Override public boolean validate(List<String> warnings) { boolean valid = true; /* if (!stringHasValue(properties .getProperty("targetProject"))) { //$NON-NLS-1$ warnings.add(getString("ValidationError.18", //$NON-NLS-1$ "MapperConfigPlugin", //$NON-NLS-1$ "targetProject")); //$NON-NLS-1$ valid = false; } if (!stringHasValue(properties.getProperty("servicePackage"))) { //$NON-NLS-1$ warnings.add(getString("ValidationError.18", //$NON-NLS-1$ "MapperConfigPlugin", //$NON-NLS-1$ "servicePackage")); //$NON-NLS-1$ valid = false; } if (!stringHasValue(properties.getProperty("serviceImplPackage"))) { //$NON-NLS-1$ warnings.add(getString("ValidationError.18", //$NON-NLS-1$ "MapperConfigPlugin", //$NON-NLS-1$ "serviceImplPackage")); //$NON-NLS-1$ valid = false; } */ targetProject = properties.getProperty("targetProject"); servicePackage = properties.getProperty("servicePackage"); serviceImplPackage = properties.getProperty("serviceImplPackage"); servicePreffix = properties.getProperty("servicePreffix"); servicePreffix = stringHasValue(servicePreffix) ? servicePreffix : ""; serviceSuffix = properties.getProperty("serviceSuffix"); serviceSuffix = stringHasValue(serviceSuffix) ? serviceSuffix : ""; superServiceInterface = properties.getProperty("superServiceInterface"); superServiceImpl = properties.getProperty("superServiceImpl"); superDaoInterface = properties.getProperty("superDaoInterface"); controllerPackage = properties.getProperty("controllerPackage"); superController = properties.getProperty("superController"); return valid; } @Override public List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) { recordType = introspectedTable.getBaseRecordType(); modelName = recordType.substring(recordType.lastIndexOf(".") + 1); model = new FullyQualifiedJavaType(recordType); serviceName = servicePackage + "." + servicePreffix + modelName + serviceSuffix; serviceImplName = serviceImplPackage + "." + modelName + serviceSuffix+"Impl"; examplePacket=recordType.substring(0,recordType.lastIndexOf(".")); controllerName=controllerPackage.concat(".").concat(modelName).concat("Controller"); List<GeneratedJavaFile> answer = new ArrayList<>(); GeneratedJavaFile gjf = generateServiceInterface(introspectedTable); GeneratedJavaFile gjf2 = generateServiceImpl(introspectedTable); GeneratedJavaFile gjf3 = generateController(introspectedTable); answer.add(gjf); answer.add(gjf2); answer.add(gjf3); return answer; } // 生成service接口 private GeneratedJavaFile generateServiceInterface(IntrospectedTable introspectedTable) { FullyQualifiedJavaType service = new FullyQualifiedJavaType(serviceName); Interface serviceInterface = new Interface(service); serviceInterface.setVisibility(JavaVisibility.PUBLIC); // 添加父接口 if(stringHasValue(superServiceInterface)) { String superServiceInterfaceName = superServiceInterface.substring(superServiceInterface.lastIndexOf(".") + 1); serviceInterface.addImportedType(new FullyQualifiedJavaType(superServiceInterface)); serviceInterface.addImportedType(new FullyQualifiedJavaType(recordType)); serviceInterface.addSuperInterface(new FullyQualifiedJavaType(superServiceInterfaceName + "<" + modelName + ">")); } GeneratedJavaFile gjf = new GeneratedJavaFile(serviceInterface, targetProject, context.getJavaFormatter()); return gjf; } // 生成serviceImpl实现类 private GeneratedJavaFile generateServiceImpl(IntrospectedTable introspectedTable) { FullyQualifiedJavaType service = new FullyQualifiedJavaType(serviceName); FullyQualifiedJavaType serviceImpl = new FullyQualifiedJavaType(serviceImplName); TopLevelClass clazz = new TopLevelClass(serviceImpl); //描述类的作用域修饰符 clazz.setVisibility(JavaVisibility.PUBLIC); //描述类 引入的类 clazz.addImportedType(service); //描述类 的实现接口类 clazz.addSuperInterface(service); if(stringHasValue(superServiceImpl)) { String superServiceImplName = superServiceImpl.substring(superServiceImpl.lastIndexOf(".") + 1); clazz.addImportedType(superServiceImpl); clazz.addImportedType(recordType); clazz.setSuperClass(superServiceImplName + "<" + modelName + ">"); } clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Service")); clazz.addAnnotation("@Service"); String daoFieldType = introspectedTable.getMyBatis3JavaMapperType(); String daoFieldName = firstCharToLowCase(daoFieldType.substring(daoFieldType.lastIndexOf(".") + 1)); //描述类的成员属性 Field daoField = new Field(daoFieldName, new FullyQualifiedJavaType(daoFieldType)); clazz.addImportedType(new FullyQualifiedJavaType(daoFieldType)); clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.beans.factory.annotation.Autowired")); //描述成员属性 的注解 daoField.addAnnotation("@Autowired"); //描述成员属性修饰符 daoField.setVisibility(JavaVisibility.PRIVATE); clazz.addField(daoField); //描述 方法名 Method method = new Method("getMapper"); //方法注解 method.addAnnotation("@Override"); FullyQualifiedJavaType methodReturnType = new FullyQualifiedJavaType("Object"); //返回值 method.setReturnType(methodReturnType); //方法体,逻辑代码 method.addBodyLine("return " + daoFieldName + ";"); //修饰符 method.setVisibility(JavaVisibility.PUBLIC); clazz.addMethod(method); Method method1 = new Method("getExample"); method1.addAnnotation("@Override"); FullyQualifiedJavaType methodReturnType1 = new FullyQualifiedJavaType("Object"); clazz.addImportedType(new FullyQualifiedJavaType(examplePacket.concat(".").concat(modelName).concat("Example"))); method1.setReturnType(methodReturnType1); method1.addBodyLine("return new " + modelName + "Example();"); method1.setVisibility(JavaVisibility.PUBLIC); clazz.addMethod(method1); GeneratedJavaFile gjf2 = new GeneratedJavaFile(clazz, targetProject, context.getJavaFormatter()); return gjf2; } // 生成controller类 private GeneratedJavaFile generateController(IntrospectedTable introspectedTable) { FullyQualifiedJavaType controller = new FullyQualifiedJavaType(controllerName); TopLevelClass clazz = new TopLevelClass(controller); //描述类的作用域修饰符 clazz.setVisibility(JavaVisibility.PUBLIC); //添加@Controller注解,并引入相应的类 clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.web.bind.annotation.RestController")); clazz.addAnnotation("@RestController"); //添加@RequestMapping注解,并引入相应的类 clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.web.bind.annotation.RequestMapping")); clazz.addAnnotation("@RequestMapping(\"/"+firstCharToLowCase(modelName)+"\")"); //添加@Api注解,并引入相应的类 clazz.addImportedType(new FullyQualifiedJavaType("io.swagger.annotations.Api")); String controllerSimpleName = controllerName.substring(controllerName.lastIndexOf(".") + 1); clazz.addAnnotation("@Api(tags = \""+controllerSimpleName+"\", description = \""+controllerSimpleName+"\")"); //引入controller的父类和model,并添加泛型 if(stringHasValue(superController)) { clazz.addImportedType(superController); clazz.addImportedType(recordType); FullyQualifiedJavaType superInterfac = new FullyQualifiedJavaType(superController+"<"+modelName+">"); clazz.addSuperInterface(superInterfac); } //引入Service FullyQualifiedJavaType service = new FullyQualifiedJavaType(serviceName); clazz.addImportedType(service); //添加Service成员变量 String serviceFieldName = firstCharToLowCase(serviceName.substring(serviceName.lastIndexOf(".") + 1)); Field daoField = new Field(serviceFieldName, new FullyQualifiedJavaType(serviceName)); clazz.addImportedType(new FullyQualifiedJavaType(serviceName)); clazz.addImportedType(new FullyQualifiedJavaType("org.springframework.beans.factory.annotation.Autowired")); //描述成员属性 的注解 daoField.addAnnotation("@Autowired"); //描述成员属性修饰符 daoField.setVisibility(JavaVisibility.PRIVATE); clazz.addField(daoField); //描述 方法名 Method method = new Method("getService"); //方法注解 method.addAnnotation("@Override"); String simpleSuperServiceName = superServiceInterface.substring(superServiceInterface.lastIndexOf(".") + 1); FullyQualifiedJavaType methodReturnType = new FullyQualifiedJavaType(simpleSuperServiceName+"<"+modelName+">"); //返回类型 method.setReturnType(methodReturnType); //方法体,逻辑代码 method.addBodyLine("return " + serviceFieldName + ";"); //修饰符 method.setVisibility(JavaVisibility.PUBLIC); clazz.addImportedType(superServiceInterface); clazz.addMethod(method); GeneratedJavaFile gjf2 = new GeneratedJavaFile(clazz, targetProject, context.getJavaFormatter()); return gjf2; } private String firstCharToLowCase(String str) { char[] chars = new char[1]; //String str="ABCDE1234"; chars[0] = str.charAt(0); String temp = new String(chars); if(chars[0] >= 'A' && chars[0] <= 'Z') { return str.replaceFirst(temp,temp.toLowerCase()); } return str; } }