作为 Java
开发,数据库操作是不可逃避的问题,最原始的方式可能使用JDBC
操作数据库。渐渐的有了对象关系映射
的框架。最让人熟知的有 Hibernate
、Mybitas
。Hibernate
消除了代码的映射规则,开发人员可以将数据库表当对象使用,确实很方便,但是它最大的一个问题是在表关联和复杂的SQL查询支持较差。而Mybitas
是一个款半自动的ORM
框架,开发人员重点关注sql
语句即可,框架解除了sql与程序代码的耦合。基于这样的原因我总结了三种方式通过数据库表逆向生成代码,让使用 Mabitas
的小伙伴的开发效率提高一个台阶。
Idea
插件生成代码安装Idea
插件 Free Mybatis plugin
,如下图:
如何使用呢?需要在Idea
打开数据库视图,连接数据库。
第一次使用Idea
连接可能会报下面错误:
Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
解决方法 查询数据库时区,并设置为东八区。sql语句如下:
show variables like '%time_zone%';
set global time_zone='+8:00';
成功连接如下图:
逆向生成代码
在需要生成表右键
->EasyCode
->Generate Code
就可以生成代码。
根据自己的需要选择生成的代码:
我勾选的所有,最终生成的代码结构如下:
└─code
├─controller
│ OptionsController.java
├─dao
│ OptionsDao.java
├─entity
│ Options.java
└─service
│ OptionsService.java
└─impl
OptionsServiceImpl.java
自定义模板
打开setting
搜索easy
,就可以找到逆向生成代码的模板,如下图:
Maven
插件生成代码Maven
项目添加插件(plugin)就可以自动生成代码。
项目引入依赖
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
</plugin>
创建 generatorConfig.xml 文件
在项目资源路径resource
目录创建 generatorConfig.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>
<!-- 选择本地的数据库驱动,这里可以搜索本地maven下载的数据库驱动-->
<classPathEntry location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\5.1.42\mysql-connector-java-5.1.42.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 :false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接,端口,用户名和密码密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3307/mybitas-gen" userId="root" password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.wang.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.wang.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- tableName是数据库中的表名或视图名, domainObjectName是实体类名,要生成多个表的时候,添加多个 table标签即可-->
<table tableName="user_info" domainObjectName="UserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
生成代码
1.第一种方法
项目添加 mybatis-generator-maven-plugin
插件后,可以直接使用插件自带的工具,如下图:
直接双击运行,就可以生成 dao
,entity
,mapper.xml
三种格式的代码文件了。
2.第二种方法
也可以使用另外一种方式,Edit Configurations...
->Maven
创建 Maven
配置,如下图:
说明:Working directory:本地代码磁盘存放路径 Command line:命令行执行命令,这里添加mybatis-generator:generate -e
运行命令就可以生成代码了。3.第三种方法
在命令执行如下命令,也可以生成对应的代码
mvn mybatis-generator:generate -e
Java
代码生成AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
详细的代码如下:
public class CodeGenerator {
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
GlobalConfig gc = new GlobalConfig();// 全局配置
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("jobob");
gc.setOpen(false);
gc.setSwagger2(true); //实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
DataSourceConfig dsc = new DataSourceConfig();// 数据源配置
dsc.setUrl("jdbc:mysql://localhost:3306/ant?useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("密码");
mpg.setDataSource(dsc);
PackageConfig pc = new PackageConfig(); // 包配置
pc.setModuleName(scanner("模块名"));
pc.setParent("com.baomidou.ant");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
TemplateConfig templateConfig = new TemplateConfig();// 配置模板
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
StrategyConfig strategy = new StrategyConfig();// 策略配置
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
strategy.setSuperEntityColumns("id");
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
更多详细内容参考官方文档: https://mp.baomidou.com/guide/generator.html 这里也推荐一个开源项目: https://github.com/zhaohaihao/easy-cg
本篇文章的三种逆向生成代码的方式网络上都有,我使用后的分析结果如下:
Free Mybatis plugin
是Idea
的一个插件,entity
,dao
,service
,controller
,mapper
都可以生成,配置也相对灵活。如果你们的开发团队都在使用 Idea
开发项目,那这款插件是个不错的选择。Maven
插件 mybatis-generator-maven-plugin
只可生成entity
,dao
,mapper
文件,不依赖于开发工具,生成代码相对简单。AutoGenerator
编写Java
代码逆向生成代码,entity
,dao
,service
,controller
,mapper
都可以生成,支持三种自定义模板Velocity,Freemarker,Beetl可根据自己的项目编写自定义模板。END