天天看点

Springboot整合之整合通用Mapper和使用MBG工具总结:整个步骤只要细心一点是没多大问题的,关键的几点就是数据库表设计、pom.xml和generatorConfig.xml的配置,至于各表对应的实体类、Mapper接口、Mapper配置文件全都是自动生成的。后续的关键点就是复杂的数据库操作(定制接口继承、对应复杂操作的配置文件书写和修改等,这些都要求能熟练使用MyBatis框架)

通用mapper是在mybatis的基础上为继续简化工作量而作,使用通用mapper一定要使用MBG工具,通过逆向工程能生成表对应的Mapper接口、实体类和Mapper配置文件,实现基础的数据库操作。当然,也可以实现复杂的数据库操作。通用Mapper官方文档:https://github.com/abel533/Mapper/wiki,下面的配置步骤也是基本按照该文档进行的。

  • 新建module,勾选下列模块:web、jdbc、mysql、mybatis

  • 在pom.xml中添加依赖:

如果使用<artifactId>mapper</artifactId>会出错:java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>(),所以使用下面的依赖        

<!-- https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>
           
  • 继续配置pom文件,可参考:

https://github.com/abel533/Mapper/wiki/4.1.mappergenerator

        > 首先添加properties内容,这些properties需要在别处使用,所以可以在使用的地方直接写值,但推荐此种方式,将properties定义在pom文件中,以下是其内容及注释:

        以项目包名com.lf.mygenerator为例            

<properties>
    <java.version>1.8</java.version>
    <!--声明存放源码的目录-->
    <targetJavaProject>${basedir}/src/main/java</targetJavaProject>
    <!--声明通过MBG生成Mapper接口所在的包-->
    <targetMapperPackage>com.lf.mygenerator.mappers</targetMapperPackage>
    <!--声明MBG生成实体类所在的包-->
    <targetModelPackage>com.lf.mygenerator.entities</targetModelPackage>
    <!--声明资源文件的目录-->
    <targetResourcesProject>
        ${basedir}/src/main/resources
    </targetResourcesProject>
    <!--声明Mapper接口对应的配置文件的包-->
    <targetXMLPackage>mybatis/mappers</targetXMLPackage>
    <!--声明通用mapper版本-->
    <mapper.version>4.1.5</mapper.version>
    <!--声明mysql版本-->
    <mysql.version>8.0.15</mysql.version>
</properties>               
           

        > 然后在<build>标签里的<plugins>标签内添加mybatis generator插件:

<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <configurationFile>
                        <!--配置文件路径可自行定义,使用如下设置即可-->
                        ${basedir}/src/main/resources/generator/generatorConfig.xml
                    </configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <!--引用properties的标签值-->
                        <version>${mysql.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>${mapper.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
           
  • 添加application.yml配置文件,内容参考整合mybatis;设置application.properties(也可以使用其他配置文件),该文件配置了数据库连接。

理论上application.yml和application.properties值是一样的,都可以使用${}引用,但尝试之后发现yml文件引用不了,这个问题有待解决。application.properties内容如下:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///test
spring.datasource.username=root
spring.datasource.password=root
           
  • 根据pom文件的plugin设置,需要在Resources下新建generator/generatorConfig.xml文件,内容参考通用Mapper官方文档

以下是其内容,其中用${}引用pom中设置的properties值

<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!--使用application.properties内容-->
    <properties resource="application.properties"/>
    <!--targetRuntime的可选值还有“MyBatis3Simple”,可作简单的数据库操作使用-->
    <!--若要进行复杂操作,则使用“MyBatis3”-->
    <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>
        <!--数据库连接信息-->
        <jdbcConnection driverClass="${spring.datasource.driver-class-name}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
        </jdbcConnection>
        <!--生成实体类路径-->
        <javaModelGenerator targetPackage="${targetModelPackage}"
                            targetProject="${targetJavaProject}"/>
        <!--生成Mapper配置文件路径-->
        <sqlMapGenerator targetPackage="${targetXMLPackage}"
                         targetProject="${targetResourcesProject}"/>
        <!--生成Mapper接口路径-->
        <javaClientGenerator targetPackage="${targetMapperPackage}"
                             targetProject="${targetJavaProject}"
                             type="XMLMAPPER"/>

        <!--数据库中的表,通过domainObjectName可以将表名对应的实体类修改为Customer-->
        <table tableName="customers" domainObjectName="Customer">
            <!--主键要根据表信息自行设定,此处为id-->
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
        <table tableName="users" domainObjectName="User">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
    </context>
</generatorConfiguration>
           

注意:不要使用<table tableName="%"/>,这会导致所连接url的所有数据库的所有表都会生成对应的文件,而不只是test数据库

  • 在idea中打开Maven视图,选择Execute Maven Goal,在弹出的对话框中Working Directory找到对应的project或module,而Command line则输入以下内容:mybatis-generator:generate,然后execute即可生成。如果生成失败,可能是其中的配置出错。
    Springboot整合之整合通用Mapper和使用MBG工具总结:整个步骤只要细心一点是没多大问题的,关键的几点就是数据库表设计、pom.xml和generatorConfig.xml的配置,至于各表对应的实体类、Mapper接口、Mapper配置文件全都是自动生成的。后续的关键点就是复杂的数据库操作(定制接口继承、对应复杂操作的配置文件书写和修改等,这些都要求能熟练使用MyBatis框架)

  • 此时配置基本完成,如果此时启动应用,还可能会有如下的异常:

nested exception is java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.lf.mygenerator.mappers.EmployeeMapper.selectByExample. please check file [D:\Idea Projects\springboot\ssmcrud\target\classes\mybatis\mappers\EmployeeMapper.xml] and com/lf/mygenerator/mappers/EmployeeMapper.java (best guess)

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.lf.mygenerator.mappers.CustomerMapper' available: expected at least 1 bean which qualifies as autowire candidate.

异常的原因是不能检测生成的Mapper接口作为Bean,不能装配,所以要在application.yml中加上配置语句以指定Mapper接口的包位置

mybatis:

  base-packages: com.lf.mygenerator.mappers
           
  • 然后可以进行一些测试操作数据库,可参考整合mybatis。至于复杂的数据库操作,后续再更新。

  • 总结:整个步骤只要细心一点是没多大问题的,关键的几点就是数据库表设计、pom.xml和generatorConfig.xml的配置,至于各表对应的实体类、Mapper接口、Mapper配置文件全都是自动生成的。后续的关键点就是复杂的数据库操作(定制接口继承、对应复杂操作的配置文件书写和修改等,这些都要求能熟练使用MyBatis框架)

继续阅读