1.springboot 目前的推荐版是2.1.2.RELEASE,我们就以当前最新的推荐版为例;
2.创建项目,引入对应的jar包,我是以maven的形式,我这边的数据源以阿里的druid为例 详细查看《springboot2.0整合druid,以及springboot自动装配DataSource原理》
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<!-- mysql服务端版本匹配 -->
<properties>
<java.version>1.8</java.version>
<mysql.version>5.1.6</mysql.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.配置文件,更新详细的配置 请参考 阿里的github查看,网址;里面介绍了更详细的属性含义,以及多数据源的配置方式
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 613814
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 8
min-idle: 1
max-active: 20
max-wait: 60000
time-between-eviction-runsMillis: 60000
min-evictable-idle-timeMillis: 300000
validation-query: select 'x' FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
filters: stat
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
use-global-data-source-stat: true
4.使用
表结构如下,一个简单的城市的表
实体类
public class City implements Serializable {
private static final long serialVersionUID = 6955023150002543273L;
private String id;
private String name;
private Integer level;
private String parentId;
//省略get set
}
mapper接口
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.badger.model.City;
@Mapper
public interface CityMapper {
@Select("SELECT * FROM t_city WHERE parent_id = #{parentId}")
List<City> selectByParentId(@Param("parentId") String parentId);
}
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class BadgerMybatisApplicationTests {
@Autowired
CityMapper cityMapper;
@Test
public void contextLoads() {
List<City> list = cityMapper.selectByParentId("-1");
for (City city : list) {
System.out.println(city);
}
}
}
测试结果如下,可以看到,parentId字段,没有映射成功,可以使用 在sql中,为字段取别名,或者开始驼峰命名映射
在yml配置文件中,新加mapUnderscoreToCamelCase属性为true,开始驼峰命名,在运行测试类就正常了;
mybatis:
type-aliases-package: com.badger.model
#指定全局配置文件的位置,全部配置文件跟configuration是互斥,同时配置会报错
#config-location: classpath:mybatis/mybatis-config.xml
#指定sql映射文件的位置
mapper-locations: classpath:mybatis/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
default-fetch-size: 100
default-statement-timeout: 30
另外mybatis可以配置其他的一些属性例如,xml配置文件的路径,一些configuration的参数等,具体可以参看自动配置类,或者《官方文档》
特别需要说明:我们在使用mybtais的时候,mybatis自动的扫入mapper的接口,需要在接口上标注@org.apache.ibatis.annotations.Mapper注解,或者在springboot的主类上,
标注@org.mybatis.spring.annotation.MapperScan(value = "com.badger.mapper"),指定扫描mapper的路径
5.我们看一下mybatis-spring-boot-autoconfigure-1.3.2.jar,mybatis官方提供的自动装配类,太多了,我就只贴sqlSessionFactory的装配,在mybatis中,也是最主要的一个类
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
if (StringUtils.hasText(this.properties.getConfigLocation())) {
factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
}
Configuration configuration = this.properties.getConfiguration();
if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
configuration = new Configuration();
}
if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
customizer.customize(configuration);
}
}
factory.setConfiguration(configuration);
if (this.properties.getConfigurationProperties() != null) {
factory.setConfigurationProperties(this.properties.getConfigurationProperties());
}
if (!ObjectUtils.isEmpty(this.interceptors)) {
factory.setPlugins(this.interceptors);
}
if (this.databaseIdProvider != null) {
factory.setDatabaseIdProvider(this.databaseIdProvider);
}
if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
}
if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
}
if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
factory.setMapperLocations(this.properties.resolveMapperLocations());
}
return factory.getObject();
}
可以看到,这个类实例化的时候,也只是把配置文件的中的一些属性初始化到sqlSessionFactory里,我们重点来看第二个和第三个if判断这里Configuration
Configuration configuration = this.properties.getConfiguration();
if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
configuration = new Configuration();
}
if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
customizer.customize(configuration);
}
}
首先,我们在配置文件里,没有配置configuration的属性,会默认创建一个;下面,遍历拿到已经注入的ConfigurationCustomizer的,并且执行configuration属性;那么我们在配置configuration的属性的属性的时候,就有三种方式;前两种,已经看到了,就在yml中指定configLocation,或者配置configuration属性;还有一种,我们创建一个配置类,实现ConfigurationCustomizer接口,在Configuration 参数里,配置上对应的属性
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="useGeneratedKeys" value="true" />
</settings>
</configuration>
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
@org.springframework.context.annotation.Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
1:xml配置文件形式跟yml配置文件,是互斥的;同时配置,会报错
2:xml配置跟实现org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer,同时配置,ConfigurationCustomizer会不生效(暂时测试的是这个结果,还没有深入研究,应该还是跟第一个差不多,xml配置和类或者yml配置,只能二选一)
3:yml的configuration配置跟实现org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer,同时配置,会互补,从sqlSessionFactory配置,就可以看出来
好了,关于springboot2.0集成mybatis的,差不多就是这些,关于configuration配置,建议还是拒绝使用xml的配置形式,毕竟springboot,就不建议使用xml配置的形式的