当前位置: 首页 > news >正文

如何将代码变成应用程序_如何优雅的将数据库表逆向生成代码

cb263651907df4ce4366617a0d75bf65.png

公众号:不安分的猿人

作为 Java 开发,数据库操作是不可逃避的问题,最原始的方式可能使用JDBC操作数据库。渐渐的有了对象关系映射的框架。最让人熟知的有 HibernateMybitasHibernate消除了代码的映射规则,开发人员可以将数据库表当对象使用,确实很方便,但是它最大的一个问题是在表关联和复杂的SQL查询支持较差。而Mybitas 是一个款半自动的ORM 框架,开发人员重点关注sql语句即可,框架解除了sql与程序代码的耦合。基于这样的原因我总结了三种方式通过数据库表逆向生成代码,让使用 Mabitas的小伙伴的开发效率提高一个台阶。

三种方式

1.1 Idea 插件生成代码

安装Idea插件 Free Mybatis plugin,如下图:

fa8f2b34959c03620ca2071d7a13109a.png

如何使用呢?需要在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';

成功连接如下图:

7c34307c7e0dc7dc35c22336568f80e7.png

逆向生成代码

在需要生成表右键->EasyCode->Generate Code就可以生成代码。

1f1e78f74c190bb1be1b6cb5720247ce.png

根据自己的需要选择生成的代码:

b80b6ae966915bf1d6eac5c3c782364f.png

我勾选的所有,最终生成的代码结构如下:

└─code
    ├─controller
    │      OptionsController.java
    ├─dao
    │      OptionsDao.java
    ├─entity
    │      Options.java
    └─service
        │  OptionsService.java
        └─impl
                OptionsServiceImpl.java

自定义模板
打开setting搜索easy,就可以找到逆向生成代码的模板,如下图:

ea2ba8e717938026fc0b4099bf36fed5.png

1.2 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:UsersAdministrator.m2repositorymysqlmysql-connector-java5.1.42mysql-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 插件后,可以直接使用插件自带的工具,如下图:

0c26f19e57e3c2e181d114b4b94043d1.png

直接双击运行,就可以生成 daoentitymapper.xml三种格式的代码文件了。
2.第二种方法
也可以使用另外一种方式,Edit Configurations...->Maven 创建 Maven 配置,如下图:

a964f80c4999b76884c5dc711994cb93.png

说明:Working directory:本地代码磁盘存放路径 Command line:命令行执行命令,这里添加mybatis-generator:generate -e 运行命令就可以生成代码了。 3.第三种方法
在命令执行如下命令,也可以生成对应的代码

mvn mybatis-generator:generate -e

1.3 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 pluginIdea的一个插件,配置相对灵活,entitydaoservicecontrollermapper都可以生成。如果你们的开发团队都在使用 Idea开发项目,那这款插件是个不错的选择。 - Maven插件 mybatis-generator-maven-plugin只可生成entitydaomapper文件,不依赖于开发工具,生成代码相对简单。 - AutoGenerator 通过Java代码连接数据库并逆向生成代码,entitydaoservicecontrollermapper都可以生成,支持三种自定义模板Velocity,Freemarker,Beetl可根据自己的项目编写自定义模板。

参考

  • 传统JDBC与ORM框架之间的性能比较: https://juejin.im/post/5d5cf777e51d45621320311b
  • idea集成 MyBatis Generator 插件: https://blog.csdn.net/i402097836/article/details/75043207
  • Mybitas Plus Genergate: https://mp.baomidou.com/guide/generator.html

相关文章:

  • macos sierra怎么升级到catalina_macOS 逐渐 iOS 化?到底是焕然一新,还是用力过猛...
  • range函数python三个参数_python内置函数之range()
  • tcp seq 带冒号_看看这篇5000字的文章,带你看不一样的Android-Http
  • python岗位简介_GitHub - nicksors/JobAnalysis: Python分析拉钩职位信息
  • 太阳能充电调节代码_新型可折叠太阳能电池板,一款业余电台的便携式移动电源...
  • oracle distinct分页优化_除夕送你10条高性能SQL优化方案
  • python 点乘_Python | 初识Python程序设计
  • java离职交接文档_年后跳槽换工作?这有一份IT项目资料“交接清单”请提前查收...
  • python画图加中文_Python中文画图乱码的解决方法
  • lms自适应滤波器matlab_MATLAB 算法面向 FPGA 的浮点定点转换
  • python处理报错_Python 入门级报错处理
  • vue中align_vuejs 中组件实现
  • kafka创建topic_一站式Kafka平台KafkaCenter-开源啦
  • python csv wordpress xmlrpc_WordPress自动发布文章-Python模块wordpress_xmlrpc
  • 10安装报错0x8007000d_Centos6安装Zabbix3.4.15注意事项
  • 分享一款快速APP功能测试工具
  • [deviceone开发]-do_Webview的基本示例
  • [Vue CLI 3] 配置解析之 css.extract
  • docker python 配置
  • flutter的key在widget list的作用以及必要性
  • github从入门到放弃(1)
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js数组之filter
  • Laravel5.4 Queues队列学习
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 基于webpack 的 vue 多页架构
  • 技术发展面试
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前言-如何学习区块链
  • 强力优化Rancher k8s中国区的使用体验
  • 悄悄地说一个bug
  • 收藏好这篇,别再只说“数据劫持”了
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 自制字幕遮挡器
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • # Java NIO(一)FileChannel
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #预处理和函数的对比以及条件编译
  • (3)nginx 配置(nginx.conf)
  • (定时器/计数器)中断系统(详解与使用)
  • (二)linux使用docker容器运行mysql
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (六)激光线扫描-三维重建
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • ***测试-HTTP方法
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net6 webapi log4net完整配置使用流程
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net反编译工具
  • @Autowired注解的实现原理
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [AutoSar]BSW_Com02 PDU详解