SpringBoot多模块时配置mybatis-generator生成的mapper.xml文件

2023-05-16

  首先,我将项目分解为了五个子模块,分别为core、model、mapper、service和web模块。其中mapper模块主要负责配置mybatis相关的mapper文件,web模块中配置controller相关的类,主配置文件application.properties放在了web模块下。mybatis-generator的配置文件配置在主模块下。项目结构如图所示:


主模块

web模块

mapper模块

mybatis-generator的配置

  首先,我们先将mybatis-generator配置完成,直接在主模块的build.gradle文件中加入以下代码:

dependencies {
	//mybatis-generator插件依赖
	 compile 'org.mybatis.generator:mybatis-generator-core:1.3.2'
}

//mybatis generator plugin ------ start
buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "gradle.plugin.com.arenagod.gradle:mybatis-generator-plugin:1.4"
    }
}

apply plugin: "com.arenagod.gradle.MybatisGenerator"

configurations {
    mybatisGenerator
}

mybatisGenerator {
    verbose = true
    configFile = 'src/main/resources/mybatis/generatorConfig.xml'
}
//mybatis generator plugin ------ end

  然后,在主模块中编写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>

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <!-- 生成的pojo,将implements Serializable-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection
                driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://127.0.0.1:3306/garbage"
                userId="root"
                password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成实体类的包名和位置-->
        <javaModelGenerator targetPackage="com.sqc.dustbin.model" targetProject="dustbin_model/src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mybatis.mappers" targetProject="dustbin_mapper/src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.sqc.dustbin.mapper" targetProject="dustbin_mapper/src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- schema即为数据库名 tableName为对应的数据库表 domainObjectName是要生成的实体类 enable*ByExample
         是否生成 example类 -->
        <table schema="garbage" tableName="tb_dustbin" domainObjectName="Dustbin" enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

  至此,mybatis-generator就配置完成了。

Mapper.xml文件与mapper接口的映射绑定

  如果只是配置了以上的配置,那么生成的mapper文件将不能注入成功。会报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)这样的异常。此时表明自动注入并不能找到对应的Mapper配置文件。

第一种配置方法

  此时需要在application.properties文件中配置Mapper配置文件的路径和datasource,但我们的Mapper.xml文件是在mapper模块下面的,而application.properties文件是在web模块之下的,然而,在application.properties文件中好像不能直接引用其他模块下的配置文件。我使用了spring.profiles.active属性来加载其他模块下的application-*.properties文件。其中,application.properties中的内容如下:

spring.profiles.active=mybatis

  然后在mapper模块下新建一个application-mybatis.properties配置文件,内容如下:

#加载Mapper配置文件
mybatis.mapper-locations = mybatis/mappers/*Mapper.xml

#数据库配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/garbage?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root

  这样Mapper就能自动注入成功了。

第二种配置方法

  这种方法我是采用配置类的方式将配置信息注入到ioc容器中。在core模块中新增配置类文件,文件目录如下图所示:


core模块
  首先将dataSource数据源bean配置在DataSourceConfiguration中,代码如下:
package com.sqc.dustbin.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;

/**
 * 配置DataSource到ioc容器中
 */
@Configuration
//配置mybatis mapper的扫描路径
@MapperScan("com.sqc.mapper")
@Component
@ConfigurationProperties(prefix = "jdbc")
public class DataSourceConfiguration {

    private String driver;

    private String url;

    private String username;

    private String password;

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * 配置与spring-dao对应的bean DataSource
     */
    @Bean(name = "dataSource")
    public DriverManagerDataSource createDataSource(){
        //生成DataSource实例
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        //配置DataSource
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

  然后将SqlSessionFactory工厂bean配置在SqlSessionFactoryConfiguration中,代码如下:

package com.sqc.dustbin.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;
import java.io.IOException;

@Configuration
public class SqlSessionFactoryConfiguration {
    //mapper.xml路径
    @Value("${mapper_path}")
    private String mapperPath;

    //实体类所在的路径
    @Value("${type_alias_package}")
    private String typeAliasesPackage;

    @Autowired
    private DataSource dataSource;
    /**
     * 创建SqlSessionFactoryBean实例
     * 设置mapper映射路径和datasource数据源
     */
    @Bean(name = "SqlSessionFactory")
    public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //设置mapper.xml扫描路径
        PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
        //配置所有类路径下的目录,其他模块也能被扫描到
        String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+mapperPath;
        sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
        //设置typeAlias包扫描路径
        sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);
        //设置DataSource
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }
}

  这样也可以实现Mapper的自动注入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot多模块时配置mybatis-generator生成的mapper.xml文件 的相关文章

随机推荐