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

  首先,我將項目分解爲了五個子模塊,分別爲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的自動注入。

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