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