Mybatis逆向工程(代码生成器)及其简单使用——及其报错处理

Posted 心醉瑶瑾前

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis逆向工程(代码生成器)及其简单使用——及其报错处理相关的知识,希望对你有一定的参考价值。

Mybatis逆向工程(代码生成器)及其简单使用——及其报错处理

Mybatis逆向工程仅仅针对单表操作

一、测试用数据库表

drop table if exists t_student;
create table t_student 
(
   id    int(10)      not null auto_increment,
   name  varchar(20)  null,
   age   int(10)      null,
   constraint PK_T_STUDENT primary key clustered (id)
);

insert into t_student(name,age) values("zhangsan",25);
insert into t_student(name,age) values("lisi",28);
insert into t_student(name,age) values("wangwu",23);
insert into t_student(name,age) values("Tom",21);
insert into t_student(name,age) values("Jck",55);
insert into t_student(name,age) values("Lucy",27);
insert into t_student(name,age) values("zhaoliu",75);

二、逆向工程配置文件(代码生成器)

GeneratorMapper.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">
<!--
Mybatis逆向工程配置文件
-->
<generatorConfiguration>
    <!--
    指定连接数据库的 JDBC 驱动包所在位置(必须存在),
    指定到你本机的完整路径
    注意:此驱动包和pom文件中引入的mysql连接依赖必须兼容,最好同一个版本
    -->
    <classPathEntry location="D:\\IDEA_Project\\SpringBoot\\springboot11\\mysql-connector-java-8.0.26.jar"/>

    <!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 -->
    <context id="tables" targetRuntime="MyBatis3">
        <!--
            用于生成model实体类中生成toString方法
            plugin标签必须放在context标签下开始地方,放在后边会报错
        -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
        <!--
            当我们生成实体类以后,发现默认是没有toString和序列化,
            但是很多时候需要序列化对象,从而方便在网络上传输
        -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!-- 配置数据库连接信息 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/springboot"
                        userId="root"
                        password="admin">
        </jdbcConnection>

        <!--
            生成 model 类,
            targetPackage 指定 model 类的包名,
            targetProject 指定生成的 model 放在 eclipse 的哪个工程下面
       -->
        <javaModelGenerator targetPackage="com.example.springboot13.model"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="false"/>
        </javaModelGenerator>

        <!--
            生成 MyBatis 的 Mapper.xml 文件,
            targetPackage 指定 mapper.xml 文件的包名,
            targetProject 指定生成的 mapper.xml 放在 eclipse 的哪个工程下面
       -->
        <sqlMapGenerator targetPackage="com.example.springboot13.mapper"
                         targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--
            生成 MyBatis 的 Mapper 接口类文件
            targetPackage 指定 Mapper 接口类的包名,
            targetProject 指定生成的 Mapper 接口放在 eclipse 的哪个工程下面
        -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.example.springboot13.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!--
        数据库表名及对应的 Java 模型类名(实体类)
        一个table标签代表一张表
        -->
        <table
                tableName="t_student"
                domainObjectName="Student"
                enableCountByExample="false"
                enableUpdateByExample="false"
                enableDeleteByExample="false"
                enableSelectByExample="false"
                selectByExampleQueryId="false"
        />
    </context>
</generatorConfiguration>

三、 添加逆向工程插件:

<!--mybatis代码自动生成插件(逆向工程插件)-->
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.0</version>
    <configuration>
        <!--(逆向工程)配置文件位置-->
        <configurationFile>GeneratorMapper.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
</plugin>

总pom.xml文件(引入的依赖不一定都能用上)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.example</groupId>
    <artifactId>springboot13</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!--修改父工程管理依赖的版本号-->
    <properties>
        <java.version>11</java.version>
        <!--可以在此处声明mysql版本号,如果不声明则是默认版本-->
        <!--eg<mysql.version>5.1.9</mysql.version>-->
    </properties>

    <dependencies>
        <!--SpringBoot框架web项目起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--MySQL驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--MyBatis整合SpringBoot框架的起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--SpringBoot框架测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <!--
            手动指定文件夹为 resources
            因为IDEA编译默认只编译java文件,而mapper包下的xxmapper.xml
            文件是不能自动编译的,所以在target中查看发现并没有被编译,运行错误!
        -->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <!--mybatis代码自动生成插件(逆向工程插件)-->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.0</version>
                <configuration>
                    <!--(逆向工程)配置文件位置-->
                    <configurationFile>GeneratorMapper.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>

            <!--SpringBoot项目编译打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

四、自动生成文件


注意保证配置文件不能出错(字段,mysql驱动包这些不能弄错),双击生成

五、生成文件报错处理:

1、如name,age等字段不能识别,就选择配置数据源

配置文件中配置数据源或者在下图所示配置也行

2、如下图错误则根据下图修改:


删除红框中的sql以及sql后边的竖线“|”

ok!

六、生成的代码Mapper.xml(简单复习)

StudentMapper.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="com.example.springboot11.mapper.StudentMapper">

    <resultMap id="BaseResultMap" type="com.example.springboot11.model.Student">
        <!--
            column:数据库中的字段名称
            jdbcType:数据库中对应的字段类型(可省略不写)
            property:映射对象的属性名称
        -->
        <!--
            resultMap作用:
            1.当数据库中的字段名称与实体类的对象属性名不一致时可以进行转换
            2.当前查询的结果没有对应一个表的时候可以自定义一个结果集映射查询结果
        -->
        <!--
            如果数据库中字段名称由多个单词构成,通过Mybatis逆向工程生成的
            对象属性名称会按照驼峰命名规则进行命名
            其中:数据库中字段名称的多个单词是下划线连接的
            数据库表字段名称         实体对象属性名称
            user_name              userName
            username               username
            userName               username
        -->
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="age" jdbcType="INTEGER" property="age"/>
    </resultMap>

    <!--
        sql语句片段,将公共部分抽取出来
    -->
    <sql id="Base_Column_List">
        id, name, age
    </sql>

    <!--id对应mapper接口中方法名-->
    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from t_student
        where id = #id,jdbcType=INTEGER
    </select>

    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete
        from t_student
        where id = #id,jdbcType=INTEGER
    </delete>

    <!--
        写死的insert Sql语句
    -->
    <insert id="insert" parameterType="com.example.springboot11.model.Student">
        insert into t_student (id, name, age)
        values (#id,jdbcType=INTEGER, #name,jdbcType=VARCHAR, #age,jdbcType=INTEGER)
    </insert>

    <!--
        拼接的Sql (字段不一定都有)
        suffixOverrides——去除多余的逗号

    -->
    <!--
        parameterType="xxx"一般都是使用封装类型,很好第规避了
        值为""的情况,所以只需要判断是否为null就行
    -->
    <insert id="insertSelective" parameterType="com.example.springboot11.model.Student">
        insert into t_student
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="name != null">
                name,
            </if>
            <if test="age != null">
                age,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #id,jdbcType=INTEGER,
            </if>
            <if test="name != null">
                #name,jdbcType=VARCHAR,
            </if>
            <if test="age != null">
                #age,jdbcType=INTEGER,
            </if>
        </trim>
    </insert>

    <!--
        选择性更新
        和上边insert一个道理
    -->
    <update id="updateByPrimaryKeySelective" parameterType="com.example.springboot11.model.Student">
        update t_student
        <set>
            <if test="name != null">
                name = #name,jdbcType=VARCHAR,
            </if>
            <if test="age != null">
                age = #age,jdbcType=INTEGER,
            </if>
        </set>
        where id = #id,jdbcType=INTEGER
    </update>

    <update id="updateByPrimaryKey" parameterType="com.example.springboot11.model.Student">
        update t_student
        set name = #name,jdbcType=VARCHAR,
            age  = #age,jdbcType=INTEGER
        where id = #id,jdbcType=INTEGER
    </update>
</mapper>

MyBatis-逆向工程「Generator使用指南」

MyBatis逆向工程——MyBatis Generator (MBG)-简单介绍与运行步骤

Mybatis generator 逆向生成代码

Mybatis generator 逆向生成代码

generator(mybatis逆向工程)

MyBatis学习15MyBatis的逆向工程生成代码