Mybatis逆向生成

Mybatis逆向生成


簡介

逆向工程字面意思就是反向生成工程,和hibernate一樣mybatis也有自己的逆向工程工具,hibernate的逆向生成我沒有做過.

使用逆向工程時,需要注意的是表之間的關係無法映射出來.
亦即mybatis的逆向工程生成的都是單表操作.

1:mybatis逆向工程開發文檔:
http://www.mybatis.org/genera...




使用逆向工程生成代碼有好幾種方式,此處就介紹1種最簡單的java程序生成.

準備

0.一個在線快速生成的簡單springboot項目

1.測試數據庫



create database if not exists test00 default character set utf8 collate utf8_general_ci;

use test00;

create table citizen(
    id int(11) not null auto_increment comment '公民ID',
    citizenName varchar(20) not null comment '公民名字',
    PRIMARY KEY (`id`),
    KEY `cid` (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


pom需要的依賴

<dependency>
            <groupId>io.github.orange1438</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>

逆向生成核心配置generatorConfiguration.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>
    <!--數據庫驅動 -->
    <!-- 如果IDE(eclipse或者idea)項目裏導入了jar包,那麼就不需要配置了jar包的絕對路徑了 <classPathEntry        location="e:/project/mybatis/lib/mysql-connector-java-5.0.8-bin.jar"/> -->

    <context id="MysqlContext" targetRuntime="MyBatis3Simple"
        defaultModelType="flat">

        <commentGenerator>
            <property name="suppressDate" value="true" />
            <property name="suppressAllComments" value="false" />
        </commentGenerator>

        <!--數據庫鏈接地址賬號密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost/test00" userId="root"
            password="root">
        </jdbcConnection>

        <!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer,爲true時把JDBC DECIMAL
            和 NUMERIC 類型解析爲java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--生成實體類存放位置 -->
        <javaModelGenerator
            targetPackage="cn.example.demo.po" targetProject="src/main/java">
        </javaModelGenerator>

        <!--生成映射xml文件存放位置 -->
        <sqlMapGenerator targetPackage="mapper"
            targetProject="src/main/resources">
        </sqlMapGenerator>

        <!--生成Dao類存放位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="cn.example.demo.mapper" targetProject="src/main/java">
        </javaClientGenerator>

        <!--生成對應表及類名 -->
        <!--生成對應表及類名,需要記住的一點是逆向工程無法生成關聯關係,只能生成單表操作 -->
        <table tableName="citizen" domainObjectName="Citizen" />

    </context>

</generatorConfiguration>


Java代碼

package cn.example.demo.util;

import java.io.InputStream;
import java.util.ArrayList;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

/**
 * 逆向生成
 *
 * @author gzh
 *
 */
public class ReverseGeneratorFunction {
    public static void main(String[] args) throws Exception {
        ArrayList<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        
        //文件名: generatorConfiguration.xml
        InputStream is = ReverseGeneratorFunction.class.getClassLoader().getResource("generatorConfiguration.xml")
                .openStream();

        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);

        is.close();
        System.out.println("生成代碼成功,刷新項目,查看文件");

    }

}

運行main方法,分別生成實體類/映射xml文件/DAO方法,結果如下:


實體類

/* https://github.com/orange1438 */
package cn.example.demo.po;

public class Citizen {
    /** 
     * 公民ID
     */ 
    private Integer id;

    /** 
     * 公民名字
     */ 
    private String citizenname;

    /** 
     * 獲取 公民ID citizen.id
     * @return 公民ID
     */
    public Integer getId() {
        return id;
    }

    /** 
     * 設置 公民ID citizen.id
     * @param id 公民ID
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /** 
     * 獲取 公民名字 citizen.citizenName
     * @return 公民名字
     */
    public String getCitizenname() {
        return citizenname;
    }

    /** 
     * 設置 公民名字 citizen.citizenName
     * @param citizenname 公民名字
     */
    public void setCitizenname(String citizenname) {
        this.citizenname = citizenname;
    }
}

CitizenMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.example.demo.mapper.CitizenDAO">

    <resultMap id="BaseResultMap"
        type="cn.example.demo.po.Citizen">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="citizenName" jdbcType="VARCHAR"
            property="citizenname" />
    </resultMap>
    
    <delete id="deleteByPrimaryKey"
        parameterType="java.lang.Integer">
        delete from citizen
        where id = #{id,jdbcType=INTEGER}
    </delete>
    
    <insert id="insert" parameterType="cn.example.demo.po.Citizen">
        insert into citizen (id, citizenName)
        values (#{id,jdbcType=INTEGER}, #{citizenname,jdbcType=VARCHAR})
    </insert>
    
    <update id="updateByPrimaryKey"
        parameterType="cn.example.demo.po.Citizen">
        update citizen
        set citizenName = #{citizenname,jdbcType=VARCHAR}
        where id = #{id,jdbcType=INTEGER}
    </update>
    
    <select id="selectByPrimaryKey"
        parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select id, citizenName
        from citizen
        where id = #{id,jdbcType=INTEGER}
    </select>
    
    <select id="selectAll" resultMap="BaseResultMap">
        select id, citizenName
        from citizen
    </select>
    
</mapper>

DAO interface

/* https://github.com/orange1438 */
package cn.example.demo.mapper;

import cn.example.demo.po.Citizen;
import java.util.List;

public interface CitizenDAO {
    /** 
     * 根據ID刪除
     * @param id 主鍵ID
     * @return 返回刪除成功的數量
     */
    int deleteByPrimaryKey(Integer id);

    /** 
     * 添加對象所有字段
     * @param record 插入字段對象(必須含ID)
     * @return 返回添加成功的數量
     */
    int insert(Citizen record);

    /** 
     * 根據ID查詢
     * @param id 主鍵ID
     * @return 返回查詢的結果
     */
    Citizen selectByPrimaryKey(Integer id);

    /** 
     *
     * @return 返回查詢的結果
     */
    List<Citizen> selectAll();

    /** 
     * 根據ID修改所有字段(必須含ID)
     * @param record 修改字段對象(必須含ID)
     * @return 返回更新成功的數量
     */
    int updateByPrimaryKey(Citizen record);
}


pom內的 mysql-connector-java 連接依賴版本必須等於,或高於當前MySQL數據庫版本,低了會報錯,等於是最好的,高了也會報異常,但逆向生成照樣成功.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章