Mybatis 逆向工程

225 阅读4分钟

​携手创作,共同成长!这是我参与「掘金日新计划·8 月更文挑战」的第12天,点击查看活动详情

逆向工程通常包括由数据库的表生成 Java代码和通过 Java代码生成数据库表。而Mybatisd的逆向工程是指由数据库表生成 Java 代码。 程序员需要自己编写Mybaits 的SQL语句,但是Mybatis官方提供逆向工程可以针对单表自动生成Mybaits执行所需要的代码

首先在gitgua下下载jar:github.com/mybatis/gen… 然后需要在pom.xml中配置

<dependency>
   <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-core</artifactId>
  <version>1.4.0</version>
  </dependency>

导入或引用数据表:

/*
Navicat MySQL Data Transfer

Source Server         : 0.30
Source Server Version : 50727
Source Host           : localhost:3307
Source Database       : usr

Target Server Type    : MYSQL
Target Server Version : 50727
File Encoding         : 65001

Date: 2022-08-12 18:53:32
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for button
-- ----------------------------
DROP TABLE IF EXISTS `button`;
CREATE TABLE `button` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `menu_id` bigint(20) unsigned NOT NULL COMMENT '菜单id',
  `code` varchar(11) NOT NULL COMMENT '编码',
  `name` varchar(11) NOT NULL COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='按钮表';

-- ----------------------------
-- Table structure for menu
-- ----------------------------
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `name` varchar(11) NOT NULL COMMENT '名称',
  `sort_no` smallint(5) unsigned NOT NULL DEFAULT '10' COMMENT '排序号',
  `parent_id` bigint(20) unsigned NOT NULL COMMENT '父节点id',
  `icon` varchar(200) DEFAULT NULL COMMENT '图标',
  `remark` varchar(20) DEFAULT NULL COMMENT '备注',
  `url` varchar(60) DEFAULT NULL COMMENT '菜单链接',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

-- ----------------------------
-- Table structure for org
-- ----------------------------
DROP TABLE IF EXISTS `org`;
CREATE TABLE `org` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键id',
  `name` varchar(50) NOT NULL COMMENT '组织机构名称',
  `parent_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '上级机构id',
  `level` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT '树节点层级',
  `node_path` varchar(512) NOT NULL COMMENT '节点路径',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态值;启用1是0否',
  `sort_no` smallint(5) unsigned NOT NULL DEFAULT '10' COMMENT '排序号;规则升序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组织机构表';

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `name` varchar(20) NOT NULL COMMENT '名称',
  `type` tinyint(3) unsigned DEFAULT NULL COMMENT '类型;2菜单3按钮4机构',
  `remark` varchar(20) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

-- ----------------------------
-- Table structure for role_ref_button
-- ----------------------------
DROP TABLE IF EXISTS `role_ref_button`;
CREATE TABLE `role_ref_button` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `role_id` bigint(20) unsigned NOT NULL COMMENT '角色id',
  `button_id` bigint(20) unsigned NOT NULL COMMENT '按钮id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色按钮关联表';

-- ----------------------------
-- Table structure for role_ref_menu
-- ----------------------------
DROP TABLE IF EXISTS `role_ref_menu`;
CREATE TABLE `role_ref_menu` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `role_id` bigint(20) unsigned NOT NULL COMMENT '角色id',
  `menu_id` bigint(20) unsigned NOT NULL COMMENT '菜单id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关联表';

-- ----------------------------
-- Table structure for role_ref_org
-- ----------------------------
DROP TABLE IF EXISTS `role_ref_org`;
CREATE TABLE `role_ref_org` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `role_id` bigint(20) unsigned NOT NULL COMMENT '角色id',
  `org_id` bigint(20) unsigned NOT NULL COMMENT '机构id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色机构关联表';

-- ----------------------------
-- Table structure for role_ref_user
-- ----------------------------
DROP TABLE IF EXISTS `role_ref_user`;
CREATE TABLE `role_ref_user` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `role_id` bigint(20) unsigned NOT NULL COMMENT '角色id',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色用户关联表';

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `username` varchar(20) NOT NULL COMMENT '用户名',
  `cname` varchar(20) NOT NULL COMMENT '中文名',
  `password` varchar(40) NOT NULL COMMENT '密码',
  `id_number` char(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_icelandic_ci DEFAULT NULL COMMENT '身份证号',
  `phone_number` char(11) DEFAULT NULL COMMENT '手机号',
  `star_level` tinyint(3) unsigned DEFAULT '1' COMMENT '星级;星级1-5',
  `education` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '学历;1初中2高中3中技4中专5大专6专科7本科8本科(函)9大学',
  `skill_level` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '技能等级;1初级工2中级工3高级工4技师5高级技师6助理工程师7工程师8高级工程师',
  `job_title` varchar(20) NOT NULL DEFAULT '接触网工' COMMENT '岗位职务',
  `professional` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '专业;1接触网专业',
  `start_work_date` datetime NOT NULL COMMENT '参加工作时间',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态值;1启用0禁用',
  `updated` datetime NOT NULL COMMENT '更新时间',
  `org_id` bigint(20) unsigned DEFAULT NULL COMMENT '机构id',
  `sort` smallint(5) DEFAULT NULL COMMENT '排序号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  UNIQUE KEY `uk_job_number` (`id_number`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- ----------------------------
-- Table structure for user_ref_org
-- ----------------------------
DROP TABLE IF EXISTS `user_ref_org`;
CREATE TABLE `user_ref_org` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
  `org_id` bigint(20) unsigned NOT NULL COMMENT '机构id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户机构关联表';

新建一个genertorConfig逆向生成的配置文件

    <!-- 默认为false,把JDBC DECIMAL 和NUMERIC类型解析为Integer,为true时 把JDBC DECIMAL 和NUMERIC类型解析为java.math.BigDecimal -->
    <javaTypeResolver>
        <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <!-- targetProject:生成POJO类的位置 -->
    <javaModelGenerator
        targetPackage="com.tt.pojo" targetProject=".\src">
        <!-- enableSubPackages:是否让schema作为包的后缀 -->
        <property name="enableSubPackages" value="false" />
        <!-- 从数据库返回的值被清理前后的空格 -->
        <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <!-- targetProject:mapper映射文件生成的位置 -->
    <sqlMapGenerator targetPackage="com.tt.mapper"
        targetProject=".\src">
        <!-- enableSubPackages:是否让schema作为包的后缀 -->
        <property name="enableSubPackages" value="false" />
    </sqlMapGenerator>

    <!-- targetProject:mapper接口生成的的位置 -->
    <javaClientGenerator type="XMLMAPPER"
        targetPackage="com.tt.mapper" targetProject=".\src">
        <!-- enableSubPackages:是否让schema作为包的后缀 -->
        <property name="enableSubPackages" value="false" />
    </javaClientGenerator>

    <!-- 指定数据表 -->
    <table tableName="website"></table>
    <table tableName="student"></table>
    <table tableName="studentcard"></table>
    <table tableName="user"></table>
</context>

创建 test 类执行生成代码


public class GeneratorSqlmap {
    public void generator() throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        // 指定配置文件
        File configFile = new File("./config/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

    // 执行main方法以生成代码
    public static void main(String[] args) {
        try {
            GeneratorSqlmap generatorSqlmap = new GeneratorSqlmap();
            generatorSqlmap.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

OK 搞定