通用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即可生成。如果生成失败,可能是其中的配置出错。
-
此时配置基本完成,如果此时启动应用,还可能会有如下的异常:
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框架)