目录
1.整合Durid数据源
2.整合MyBatis
2.1生成MyBatis代码:
2.2 整合Mybatis
3.MyBatis自动配置原理
1.整合Durid数据源
1、引入Jar包
org.springframework.boot spring-boot-starter-jdbcorg.springframework.boot spring-boot-starter-webmysql mysql-connector-javaruntime com.alibaba druid1.2.3
2.application.yml配置
# 数据源
spring:
datasource:
username: root
password: aaaa
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECt 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#初始化时运行sql脚本
schema: classpath:sql/schema.sql
#initialization-mode: always
3.读取配置类DruidConfig
@Configuration
@ConditionalOnProperty("spring.datasource.type")
public class DruidConfig {
@Bean
DataSource dataSource(DataSourceProperties dataSourceProperties){
//两种方式创建datasource都可以
// 根据配置动态构建一个DataSource
return dataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid
// 添加IP白名单
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
// servletRegistrationBean.addInitParameter("deny", "127.0.0.1");
// 添加控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "123456");
// 是否能够重置数据
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
// 添加过滤规则
filterRegistrationBean.addUrlPatterns("
if (this.properties.getConfigurationProperties() != null) {
factory.setConfigurationProperties(this.properties.getConfigurationProperties());
}
// 就是配置插件-拦截器 只需要配置一个实现了Interceptor的接口为Bean
if (!ObjectUtils.isEmpty(this.interceptors)) {
factory.setPlugins(this.interceptors);
}
// 设置数据库厂商id
if (this.databaseIdProvider != null) {
factory.setDatabaseIdProvider(this.databaseIdProvider);
}
// 设置别名:去application.yml中獲取mybatis.typeAliasesPackage
if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
}
// 可以通过父类过滤哪些类需要使用别名
比如:pojo.user extends basePojo
pojo.user2
去application.yml中设置mybatis.typeAliasesSuperType:
com.springboot.pojo.basePojo则只有user可以使用别名
if (this.properties.getTypeAliasesSuperType() != null) {
factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
}
// 设置类型处理器
if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
}
// 设置类型处理器
if (!ObjectUtils.isEmpty(this.typeHandlers)) {
factory.setTypeHandlers(this.typeHandlers);
}
// 设置mapper.xml映射文件:mapper-locations: classpath:com/tulingxueyuan/mapper/*Mapper.xml
if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
factory.setMapperLocations(this.properties.resolveMapperLocations());
}
Set factoryPropertyNames = Stream
.of(new BeanWrapperImpl(SqlSessionFactoryBean.class).getPropertyDescriptors()).map(PropertyDescriptor::getName)
.collect(Collectors.toSet());
Class extends LanguageDriver> defaultLanguageDriver = this.properties.getDefaultscriptingLanguageDriver();
if (factoryPropertyNames.contains("scriptingLanguageDrivers") && !ObjectUtils.isEmpty(this.languageDrivers)) {
// Need to mybatis-spring 2.0.2+
factory.setscriptingLanguageDrivers(this.languageDrivers);
if (defaultLanguageDriver == null && this.languageDrivers.length == 1) {
defaultLanguageDriver = this.languageDrivers[0].getClass();
}
}
if (factoryPropertyNames.contains("defaultscriptingLanguageDriver")) {
// Need to mybatis-spring 2.0.2+
factory.setDefaultscriptingLanguageDriver(defaultLanguageDriver);
}
return factory.getObject();
}
- 如果依然想使用mybatis全局配置文件, springboot 还是支持的:
- 配置application.yml
mybatis: config-location: classpath:mybatis-config.xml
- mybatis-config.xml
- 如果要设置mybatis的settings怎么设置呢?
- 1.可以通过mybatis全局配置文件设置(config-location: classpath:mybatis-config.xml取设置)
- 2. 也可以通过在application.yml中配置configuration
- configuration 它封装mybatis所有信息
configuration: mapUnderscoreToCamelCase: true
sqlSessionFactory()声明SqlSessionFactory 时调用了applyConfiguration方法,这个方法中回去配置文件中读取mybatis.configuration.xxx并且设置的factory中
private void applyConfiguration(SqlSessionFactoryBean factory) {
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);
}
- configuration 什么情况=null呢?
- 没有在application.yml中配置configuration 就会为null
- 如果没有在application.yml中配置config-location 就会new new Configuration();
- 所以说要定制mybatis
- 1. 使用mybatis全局配置文件(config-location:mybatis-config.xml)
- 2. 可以使用application.yml中配置configuration (优先级高)+ ConfigurationCustomizer
- 要么使用mybatis的东西,要么使用springboot的, 以上只能用1种
@Component
public class MyConfigurationCustomizer implements ConfigurationCustomizer {
@Override
public void customize(Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
}


