- JDBC
- 加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
- 在resources 根目录下创建application.yml 文件
spring:
datasource:
username: root
password: abc123
url: jdbc:mysql://localhost:3306/test_db
driver-class-name: com.mysql.jdbc.Driver
说明:
数据源相关的配置都在DataSourceProperties 里面
@ConfigurationProperties(
prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
private ClassLoader classLoader;
private String name;
private boolean generateUniqueName;
private Class<? extends DataSource> type;
private String driverClassName;
private String url;
private String username;
private String password;
private String jndiName;
不同的springboot版本,默认使用的数据源不同,如:com.zaxxer.hikari.HikariDataSource
public class HikariDataSource extends HikariConfig implements DataSource, Closeable {
private static final Logger LOGGER = LoggerFactory.getLogger(HikariDataSource.class);
private final AtomicBoolean isShutdown = new AtomicBoolean();
private final HikariPool fastPathPool;
private volatile HikariPool pool;
不同的数据源都实现了javax.sql.DataSource 接口
- 自动配置原理
org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 中配置了很多数据源bean,如:
@ConditionalOnClass({HikariDataSource.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"},
havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true
)
static class Hikari {
Hikari() {
}
@Bean
@ConfigurationProperties(
prefix = "spring.datasource.hikari"
)
public HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
}
可以看到创建数据源时会用到DataSourceProperties properties
- DataSourceInitializer 可以用来执行sql 脚本(在应用每次启动的时候),在数据源配置项中用schema 字段指定sql 脚本的位置
- 集成 druid
- 加入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
- 在数据源配置文件中用type 字段指定数据源
spring:
datasource:
username: root
password: abc123
url: jdbc:mysql://localhost:3306/test_db
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
-
指定druid 其他属性
加入其他属性
spring:
datasource:
username: root
password: abc123
url: jdbc:mysql://localhost:3306/test_db
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
自定义一个配置类
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
- 添加druid 监控功能
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
// 配置Druid 监控
// 配置一个管理后台的servlet
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, String> initMap = new HashMap<>();
initMap.put("loginUsername", "admin");
initMap.put("loginPassword", "123456");
bean.setInitParameters(initMap);
return bean;
}
//配置一个web监控filter
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
Map<String, String> initMap = new HashMap<>();
initMap.put("exclusions", "*.js,*.css,/druid/*");
bean.setInitParameters(initMap);
bean.setFilter(new WebStatFilter());
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
访问http://localhost:8080/druid 即可查看监控
- 整合mybatis
- 加入依赖
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
- 第一种方式,sql语句写在注解中
@Mapper
public interface TestMapper {
@select("select * from test_table where id = #{id}")
public Person getPersonById(Integer id);
}
自动配置原理:
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisAutoConfiguration {
private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);
private final MybatisProperties properties;
private final Interceptor[] interceptors;
private final ResourceLoader resourceLoader;
private final DatabaseIdProvider databaseIdProvider;
private final List<ConfigurationCustomizer> configurationCustomizers;
public MybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
this.properties = properties;
this.interceptors = (Interceptor[])interceptorsProvider.getIfAvailable();
this.resourceLoader = resourceLoader;
this.databaseIdProvider = (DatabaseIdProvider)databaseIdProvider.getIfAvailable();
this.configurationCustomizers = (List)configurationCustomizersProvider.getIfAvailable();
}
SqlSessionFactory 声明在MybatisAutoConfiguration 中,MybatisProperties 对应配置文件,在MybatisProperties中可以看到它会读取前缀为"mybatis" 的配置
这种方式,可以通过声明一个ConfigrationCustomizer 来完成全局配置,如开启驼峰命名法
Mapper 很多的时候可以使用,@MapperScan 注解来扫描
- 第二种方式,使用配置文件
在配置文件中加入前缀为"mybatis" 的配置即可,config-location 指定全局配置文件的位置,mapper-location 指定映射文件的位置