<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>
server: port: 8080 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC driver-class-name: com.mysql.jdbc.Driver
@RestController public class HelloJdbcController { @Autowired private JdbcTemplate jdbcTemplate; @GetMapping("/jdbcData") public List jdbcData(){ return jdbcTemplate.queryForList("select * from student"); } }
[{"id":1,"stuname":"s1","classid":1},{"id":2,"stuname":"s2","classid":1}, {"id":3,"stuname":"s3","classid":1},{"id":4,"stuname":"s4","classid":2}, {"id":5,"stuname":"s5","classid":3},{"id":6,"stuname":"s6","classid":3}]
位置:org.springframework.boot:spring-boot-autoconfigure:2.2.1.RELEASE包下的JDBCcss
DataSource注入java
DataSourceConfiguration給容器導入數據源的mysql
abstract class DataSourceConfiguration { protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) { return (T) properties.initializeDataSourceBuilder().type(type).build(); } @Configuration(proxyBeanMethods = false) @ConditionalOnClass(HikariDataSource.class) @ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true) static class Hikari { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") HikariDataSource dataSource(DataSourceProperties properties) { HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class); if (StringUtils.hasText(properties.getName())) { dataSource.setPoolName(properties.getName()); } return dataSource; } } .... }
以上咱們能夠看出:若是咱們將spring.datasource.type配置成com.alibaba.druid.pool.DruidDataSource並將相關的druid包導入,也能夠更換數據源web
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
DataSourceProperties將application中的配置信息注入數據源的spring
@ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean{ private String url; private String username; private String password; private String driverClassName; private List<String> schema; .... public DataSourceBuilder<?> initializeDataSourceBuilder() { return DataSourceBuilder.create(getClassLoader()).type(getType()).driverClassName(determineDriverClassName()) .url(determineUrl()).username(determineUsername()).password(determinePassword()); } }
咱們能夠在YML中配置自動建表語句:sql
spring: datasource: schema: - classpath:user.sql - classpath:order.sql
自動配置源碼以下:springboot
boolean createSchema() { List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema"); if (!scripts.isEmpty()) { if (!isEnabled()) { logger.debug("Initialization disabled (not running DDL scripts)"); return false; } String username = this.properties.getSchemaUsername(); String password = this.properties.getSchemaPassword(); runScripts(scripts, username, password); } return !scripts.isEmpty(); }
pomcookie
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
YMLsession
server: port: 8080 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC 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 也能夠增長以下內容: #監控配置 # WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter spring.datasource.druid.web-stat-filter.enabled= #是否啓用StatFilter默認值true spring.datasource.druid.web-stat-filter.url-pattern= spring.datasource.druid.web-stat-filter.exclusions= spring.datasource.druid.web-stat-filter.session-stat-enable= spring.datasource.druid.web-stat-filter.session-stat-max-count= spring.datasource.druid.web-stat-filter.principal-session-name= spring.datasource.druid.web-stat-filter.principal-cookie-name= spring.datasource.druid.web-stat-filter.profile-enable= # StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置 spring.datasource.druid.stat-view-servlet.enabled= #是否啓用StatViewServlet默認值true spring.datasource.druid.stat-view-servlet.url-pattern= spring.datasource.druid.stat-view-servlet.reset-enable= spring.datasource.druid.stat-view-servlet.login-username= spring.datasource.druid.stat-view-servlet.login-password= spring.datasource.druid.stat-view-servlet.allow= spring.datasource.druid.stat-view-servlet.deny=
啓動類APPmybatis
@SpringBootApplication public class BootJdbcApplication { public static void main(String[] args) { SpringApplication.run(BootJdbcApplication.class, args); } }
訪問:
注意:若是引入的不是druid-spring-boot-starter而是以下
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>
YML中的一些列 參數是沒法自動加入到DruidDataSource中的,咱們須要在配置文件中增長代碼,以下:
@Bean @ConfigurationProperties(prefix = "spring.datasource")//會將spring.datasoruce下的參數自動注入到DruidDataSource的上 public DataSource getDataSource() { return new DruidDataSource(); }
YML去掉DRUID
server: port: 8080 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource 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
由於在druid-spring-boot-starter中的配置源碼是這樣的:
@ConfigurationProperties("spring.datasource.druid") public class DruidStatProperties { }
且在啓動類中增長
@Bean public ServletRegistrationBean druidStatViewServlet() { //ServletRegistrationBean提供類的進行註冊 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); //添加初始化參數:initParams //白名單: servletRegistrationBean.addInitParameter("allow", "127.0.0.1"); //IP黑名單(同時存在時,deny優先於allow) //若是知足deny,就提示:sorry,you are not permitted to view this page servletRegistrationBean.addInitParameter("deny", "192.168.1.73"); //登陸查看信息的帳號和密碼 servletRegistrationBean.addInitParameter("loginUsername", "admin"); servletRegistrationBean.addInitParameter("loginPassword", "123456"); servletRegistrationBean.addInitParameter("resetEnable", "false"); return servletRegistrationBean; } @Bean public FilterRegistrationBean druidStatFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); //添加過濾規則 filterRegistrationBean.addUrlPatterns("/*"); //添加須要忽略的格式信息 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif," + "*.jpg,*.png, *.css,*.ico,/druid/*"); return filterRegistrationBean; }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
咱們查看一下mybatis的jar包依賴關係
@Data @ToString public class Student { private Integer id; private String stuName; private Integer classId; }
//或者在啓動類上直接增長@MapperScan掃描包-->推薦@MapperScan @Mapper public interface StudentMapper { List<Student> findAll(); }
@RestController public class HelloJdbcController { @Autowired private StudentMapper studentMapper; @GetMapping("/findAll") public List<Student> findAllStudent(){ return studentMapper.findAll(); } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.lee.bootjdbc.mapper.StudentMapper"> <select id="findAll" resultType="com.lee.bootjdbc.entity.Student"> select * from student </select> </mapper>
<?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"/> </settings> </configuration>
server: port: 8080 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC 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 mybatis: config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml
http://localhost:8080/findAll 結果: [{"id":1,"stuName":"s1","classId":1},{"id":2,"stuName":"s2","classId":1}, {"id":3,"stuName":"s3","classId":1},{"id":4,"stuName":"s4","classId":2}, {"id":5,"stuName":"s5","classId":3},{"id":6,"stuName":"s6","classId":3}]
在org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.1中autoconfigure包下
MybatisAutoConfiguration
這裏爲mybatis注入了sqlSessionFactory,自動加載了配置信息等
@Configuration@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})@ConditionalOnBean({DataSource.class})@EnableConfigurationProperties({MybatisProperties.class})@AutoConfigureAfter({DataSourceAutoConfiguration.class})public class MybatisAutoConfiguration { @Bean @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource dataSource){ ... } @Bean @ConditionalOnMissingBean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { ... } public static class AutoConfiguredMapperScannerRegistrar{ } public void setBeanFactory(BeanFactory beanFactory){ this.beanFactory = beanFactory; } }
這裏會加載application中mybatis的配置信息,且以mybatis開始
@ConfigurationProperties( prefix = "mybatis") public class MybatisProperties { public static final String MYBATIS_PREFIX = "mybatis"; private String configLocation; private String[] mapperLocations; private String typeAliasesPackage; private String typeHandlersPackage; private boolean checkConfigLocation = false; private ExecutorType executorType; private Properties configurationProperties; ... }