zoukankan      html  css  js  c++  java
  • Mybatis-Generator

    1.1 简介

    MyBatis Generator简介
    MyBatis生成器(MBG)是MyBatis MyBatis的代码生成器。它将为MyBatis的所有版本生成代码。它将对一个数据库表(或多个表)进行内部检查,并将生成可用于访问表的工件。这减轻了设置对象和配置文件以与数据库表进行交互的麻烦。MBG试图对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。

    MBG会根据其配置方式以不同的样式和不同的语言生成代码。例如,MBG可以生成Java或Kotlin代码。MBG可以生成MyBatis3兼容的XML-尽管现在认为MBG是旧版使用。生成的代码的较新样式不需要XML。

    根据其配置方式,MyBatis Generator可能会生成:

    与表结构匹配的Java或Kotlin类。这可能包括:

    • 匹配表主键的类(如果有主键)
    • 一个与表的非主键字段匹配的类(BLOB字段除外)
    • 一个包含表的BLOB字段的类(如果表具有BLOB字段)
    • 一个启用动态选择,更新和删除的类

    2.1 使用

    环境:IDEA
    1.创建数据表

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : mysql
    Source Server Version : 80020
    Source Host           : localhost:3306
    Source Database       : myproject
    
    Target Server Type    : MYSQL
    Target Server Version : 80020
    File Encoding         : 65001
    
    Date: 2020-06-29 13:23:18
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for class
    -- ----------------------------
    DROP TABLE IF EXISTS `class`;
    CREATE TABLE `class` (
      `id` int NOT NULL,
      `classname` varchar(255) DEFAULT NULL,
      `classimage` bigint DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of class
    -- ----------------------------
    INSERT INTO `class` VALUES ('1', '计算机', null);
    INSERT INTO `class` VALUES ('2', '软工', null);
    
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `password` varchar(255) DEFAULT NULL,
      `uid` int DEFAULT NULL,
      `admin` int DEFAULT NULL,
      `email` varchar(255) DEFAULT NULL,
      `phonenumber` int DEFAULT NULL,
      `classid` int DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `classid` (`classid`),
      CONSTRAINT `classid` FOREIGN KEY (`classid`) REFERENCES `class` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', '徐浩杰', '970829', '928675426', '1', '928675426@qq.com', '1838145982', '1');
    INSERT INTO `user` VALUES ('2', '小明', '123456', '568985656', '2', '568985656@qq.com', '1254635895', '2');
    

    我以这两张表作为演示,看如何用Mybatis MBG逆向生成java文件。

    2.1.1 配置文件

    MybatisGenerator支持以下几种方式来做MBG:

    我选用java(maven)这两种比较常用。
    1.第一步创建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>
        <properties resource="jdbc.properties" />
    <!--    <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
    
        <context id="DB2Tables" targetRuntime="MyBatis3">
            <commentGenerator>
                <!-- 是否去除自动生成的注释 true:是 : false:否 -->
                <property name="suppressAllComments" value="true" />
            </commentGenerator>
            <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                            connectionURL="jdbc:mysql://localhost:3306/myproject?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true"
                            userId="root"
                            password="xhj970829">
            </jdbcConnection>
    
            <javaTypeResolver >
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <javaModelGenerator targetPackage="com.hifix.springbootmyfirstproject.pojo" targetProject="src/main/java">
                <property name="enableSubPackages" value="false" />
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
    
            <sqlMapGenerator targetPackage="com.hifix.springbootmyfirstproject.mapper"  targetProject="src/main/java">
                <property name="enableSubPackages" value="false" />
            </sqlMapGenerator>
    
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.hifix.springbootmyfirstproject.dao"  targetProject="src/main/java">
                <property name="enableSubPackages" value="false" />
            </javaClientGenerator>
    
            <table schema="DB2ADMIN" tableName="user" domainObjectName="User" >
                <property name="useActualColumnNames" value="true"/>
                <generatedKey column="ID" sqlStatement="DB2" identity="true" />
                <columnOverride column="DATE_FIELD" property="startDate" />
                <ignoreColumn column="FRED" />
                <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
            </table>
    <table tableName="class" domainObjectName="Class"></table>
        </context>
    </generatorConfiguration>
    

    官方模板:http://mybatis.org/generator/configreference/xmlconfig.html

    <context id="DB2Tables" targetRuntime="MyBatis3">
    
    

    这个targetRuntime属性的指定很关键,官方支持四种属性:

    也就是告诉生成器采用哪种模式生成我们的java代码。

    <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
            connectionURL="jdbc:db2:TEST"
            userId="db2admin"
            password="db2admin">
        </jdbcConnection>
    
    • 这个标签一眼明了,配置JDBC驱动包,地址等等。
    <javaTypeResolver >
          <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
    
    • 这个标签作用是强制类型转换,因为mysql中有些数据类型比如date,bitint等等需要转成java 中的数据格式。
    <javaModelGenerator targetPackage="test.model" targetProject="MBGTestProjectsrc">
          <property name="enableSubPackages" value="true" />
          <property name="trimStrings" value="true" />
        </javaModelGenerator>
    
    • 指定pojo包位置。targetProject是指定项目位置。
    • enableSubPackages是否自动添加包名后缀。
    • trimStrings是否去除空格
     <sqlMapGenerator targetPackage="test.xml"  targetProject="MBGTestProjectsrc">
          <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
    
    • 指定mapper.xml的位置
    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="MBGTestProjectsrc">
          <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
    
    • 指定dao包的位置
    
    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
          <property name="useActualColumnNames" value="true"/>
          <generatedKey column="ID" sqlStatement="DB2" identity="true" />
          <columnOverride column="DATE_FIELD" property="startDate" />
          <ignoreColumn column="FRED" />
          <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
        </table>
    

    这里给出了一个表单逆向的模板,tableName数据库中的表名,domainObjectName指定生成的pojoclassname.(一般就这么指定就行了其他子属性可以不写)
    当然你还可以指定是否开启具体的查询,插入规则:

    官方api:http://mybatis.org/generator/configreference/table.html

    2.1.2 test测试生成

    根据官方提供的接口代码:

     @Test
        public  void mybatisGenerator() throws Exception {
    
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            File configFile = new File("C:\Users\Administrator\Downloads\spring-boot-examples-master\springboot-myfirstproject\src\main\resources\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);
        }
    

    这里配置文件的位置最好用绝对路径,不然死活找不到,我也不知道为什么。。我之前直接写的generatorConfig.xml或者classpath:generatorConfig.xml。都报错找不到指定文件。

    之后看生成的目录文件:

    这样就自动根据数据库中的信息逆向生成我们的dao,pojo,mapper层。

    PS:之前用Hiberante的时候也用到过逆向,不过Hiberante的逆向是从java代码来逆向到数据库。封装的太狠,灵活性太低。

  • 相关阅读:
    scala学习笔记1(表达式)
    TDD实践感悟
    Day 21:Docker 入门教程
    人类创造未来的思想先锋:这些 TED 演示深深震撼着我们
    Android开源项目第二篇——工具库篇
    提交表单
    MVC html.beginform & ajax.beginform
    MVC中的传参并在View中获取
    HTTP 教程
    ID和Name
  • 原文地址:https://www.cnblogs.com/xhj928675426/p/13207605.html
Copyright © 2011-2022 走看看