<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
spring.datasource.driver-class-name=com.mysql.jdbc.cj.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test spring.datasource.username=root spring.datasource.password=root
@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; private DataSourceInitializationMode initializationMode; private String platform; private List<String> schema; private String schemaUsername; private String schemaPassword; private List<String> data; private String dataUsername; private String dataPassword; private boolean continueOnError; private String separator; private Charset sqlScriptEncoding; private EmbeddedDatabaseConnection embeddedDatabaseConnection; private DataSourceProperties.Xa xa; private String uniqueName; ..... }
自動配置原理
根據org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration,根據配置去建立數據源,默認使用tomcat鏈接池。css
abstract class DataSourceConfiguration { DataSourceConfiguration() { } protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) { return properties.initializeDataSourceBuilder().type(type).build(); } @Configuration @ConditionalOnMissingBean({DataSource.class}) @ConditionalOnProperty( name = {"spring.datasource.type"} ) static class Generic { Generic() { } @Bean public DataSource dataSource(DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } } @Configuration @ConditionalOnClass({BasicDataSource.class}) @ConditionalOnMissingBean({DataSource.class}) @ConditionalOnProperty( name = {"spring.datasource.type"}, havingValue = "org.apache.commons.dbcp2.BasicDataSource", matchIfMissing = true ) static class Dbcp2 { Dbcp2() { } @Bean @ConfigurationProperties( prefix = "spring.datasource.dbcp2" ) public BasicDataSource dataSource(DataSourceProperties properties) { return (BasicDataSource)DataSourceConfiguration.createDataSource(properties, BasicDataSource.class); } } @Configuration @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; } } @Configuration @ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class}) @ConditionalOnMissingBean({DataSource.class}) @ConditionalOnProperty( name = {"spring.datasource.type"}, havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true ) static class Tomcat { Tomcat() { } @Bean @ConfigurationProperties( prefix = "spring.datasource.tomcat" ) public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) { org.apache.tomcat.jdbc.pool.DataSource dataSource = (org.apache.tomcat.jdbc.pool.DataSource)DataSourceConfiguration.createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class); DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl()); String validationQuery = databaseDriver.getValidationQuery(); if (validationQuery != null) { dataSource.setTestOnBorrow(true); dataSource.setValidationQuery(validationQuery); } return dataSource; } } }
@ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name="spring.datasource.type") static class Generic{ @Bean public DataSource dataSource(DataSourceProperties properties){ //使用DataSourceBuilder建立數據源,利用反射建立響應type的數據源,並綁定相關屬性 return properties.initializeDataSourceBuilder().build(); } }
class DataSourceInitializer { private static final Log logger = LogFactory.getLog(DataSourceInitializer.class); private final DataSource dataSource; private final DataSourceProperties properties; private final ResourceLoader resourceLoader; DataSourceInitializer(DataSource dataSource, DataSourceProperties properties, ResourceLoader resourceLoader) { this.dataSource = dataSource; this.properties = properties; this.resourceLoader = (ResourceLoader)(resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); } DataSourceInitializer(DataSource dataSource, DataSourceProperties properties) { this(dataSource, properties, (ResourceLoader)null); } public DataSource getDataSource() { return this.dataSource; } public boolean createSchema() { List<Resource> scripts = this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema"); if (!scripts.isEmpty()) { if (!this.isEnabled()) { logger.debug("Initialization disabled (not running DDL scripts)"); return false; } String username = this.properties.getSchemaUsername(); String password = this.properties.getSchemaPassword(); this.runScripts(scripts, username, password); } return !scripts.isEmpty(); } public void initSchema() { List<Resource> scripts = this.getScripts("spring.datasource.data", this.properties.getData(), "data"); if (!scripts.isEmpty()) { if (!this.isEnabled()) { logger.debug("Initialization disabled (not running data scripts)"); return; } String username = this.properties.getDataUsername(); String password = this.properties.getDataPassword(); this.runScripts(scripts, username, password); } } private boolean isEnabled() { DataSourceInitializationMode mode = this.properties.getInitializationMode(); if (mode == DataSourceInitializationMode.NEVER) { return false; } else { return mode != DataSourceInitializationMode.EMBEDDED || this.isEmbedded(); } } private boolean isEmbedded() { try { return EmbeddedDatabaseConnection.isEmbedded(this.dataSource); } catch (Exception var2) { logger.debug("Could not determine if datasource is embedded", var2); return false; } } //查找要自動運行的語句 private List<Resource> getScripts(String propertyName, List<String> resources, String fallback) { if (resources != null) { return this.getResources(propertyName, resources, true); } else { String platform = this.properties.getPlatform(); List<String> fallbackResources = new ArrayList(); fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); fallbackResources.add("classpath*:" + fallback + ".sql"); return this.getResources(propertyName, fallbackResources, false); } } //運行語句 private void runScripts(List<Resource> resources, String username, String password) { if (!resources.isEmpty()) { ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.setContinueOnError(this.properties.isContinueOnError()); populator.setSeparator(this.properties.getSeparator()); if (this.properties.getSqlScriptEncoding() != null) { populator.setSqlScriptEncoding(this.properties.getSqlScriptEncoding().name()); } Iterator var5 = resources.iterator(); while(var5.hasNext()) { Resource resource = (Resource)var5.next(); populator.addScript(resource); } DataSource dataSource = this.dataSource; if (StringUtils.hasText(username) && StringUtils.hasText(password)) { dataSource = DataSourceBuilder.create(this.properties.getClassLoader()).driverClassName(this.properties.determineDriverClassName()).url(this.properties.determineUrl()).username(username).password(password).build(); } DatabasePopulatorUtils.execute(populator, dataSource); } } }
因此。若是ROM要初始化一些數據庫腳本,能夠按照規則,將要初始化的數據庫腳本命名爲schema-*.sql 、data-*.sql這種格式,好比schema.sql,sachema-all.sql等,也能夠在配置文件中指定位置。java
schema: - classpath:department.sql
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency>
//導入druid數據源 @Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druid(){ return new DruidDataSource(); } //配置druid管理監控 //1.配置一個管理後臺的Servlet @Bean public ServletRegistrationBean statViewServlet(){ ServletRegistrationBean bean = new ServletRegistrationBean( new StatViewServlet(),"/druid/*" ); Map<String,String> initParams = new HashMap<>(); initParams.put("loginUsername","admin"); initParams.put("loginPassword","123456"); //容許全部訪問 initParams.put("allow",""); initParams.put("deny","192.168.12.34"); bean.setInitParameters(initParams); return bean; } //2.配置一個web監控的filter @Bean public FilterRegistrationBean webStateFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); Map<String,String> initParams = new HashMap<>(); initParams.put("exclusions","*.js,*.css,/druid/*"); bean.setInitParameters(initParams); bean.setUrlPatterns(Arrays.asList("/*")); return bean; } }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mybaties</artifactId> </dependency>
配置數據源屬性(同上)mysql
自定義MyBatis的配置規則
要想自定義mybatis的匹配規則只須要容器中添加一個ConfigurationCustomizer便可。web
@Configuration public class MyBatisConfig { @Bean public ConfigurationCustomizer configurationCustomeizer(){ return new ConfigurationCustomizer(){ @Override public void customize(Configuration configuration){ configuration.setMapUnderscoreToCamelCase(true); } }; } }
@MapperScan(value="com.desperado.mapper") @SpringBootApplication public class ProjectDemoApplication { public static void main(String[] args) { SpringApplication.run(ProjectDemoApplication.class, args); } }
mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
// 使用JPA註解配置映射關係 @Entity // 標識這是一個JPA的實體類(和數據表映射的類) @Table(name = "tbl_user") // 指定和數據庫對應的表,若是省略默認表名就是類名小寫 public class User { @Id // 標識這是一個主鍵 @GeneratedValue(strategy = GenerationType.IDENTITY)//指定主鍵的生成方式 private Integer id; @Column(name = "name",length = 50) //指定和數據表對應的列 private String name; @Column // 若是忽略名稱,那麼須要字段名稱和數據表字段名稱一致 private String email; }
// 繼承JpaRepository來完成對數據庫的操做 public interface UserRepository extends JpaRepository<User,Integer> { }
# 更新或者建立數據表結構 spring.jpa.hibernate.ddl-auto=update # 控制檯顯示sql spring.jpa.hibernate.show-sql=true