28 SpringBoot与数据访问

版权声明:看什么?6,你和我,走一波! https://blog.csdn.net/qq_31323797/article/details/84941606

1 JDBC

1.1 导入依赖

<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>

1.2 配置数据库信息

spring.datasource.username=root
spring.datasource.password=123456

# ?serverTimezone=GMT%2B8 一定要指定
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mall?serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

1.3 测试

package com.gp6.springboot23;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot23ApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException {
        // SpringBoot2.x默认数据源: class com.zaxxer.hikari.HikariDataSource
		// SpringBoot1.x默认数据源: class org.apache.tomcat.jdbc.pool.DataSource
        System.out.println("数据源" + dataSource.getClass());

        Connection connection = dataSource.getConnection();
        // 连接HikariProxyConnection@102577332 wrapping com.mysql.cj.jdbc.ConnectionImpl@588307f7
        System.out.println("连接" + connection);
        connection.close();
    }
}

项目启动

1.4 SpringBoot2.x默认使用HikariDataSource数据源

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

点击进入

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.1.1.RELEASE</version>
      <scope>compile</scope>
    </dependency>
	
	<!-- 导入HikariDataSource,所以默认使用HikariDataSource -->
    <dependency>
      <groupId>com.zaxxer</groupId>
      <artifactId>HikariCP</artifactId>
      <version>3.2.0</version>
      <scope>compile</scope>
    </dependency>
	
	
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
</dependencies>

1.5 原理

  • org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
    该类主要功能是根据各种配置向容器中添加各种不同类型的数据源
// 如果导入HikariDataSource
@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;
	}
}
	
// 如果导入tomcat中的jdbc连接池
@ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class})
@ConditionalOnMissingBean({DataSource.class})

// 配置的spring.datasource.type是tomcat的jdbc数据源
@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.to mcat.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;
	}
}
  • 使用spring.datasource.type可以指定自定义的数据源类型

1.6 SpringBoot默认支持数据源

org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource

2 自定义数据源类型

  • org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
@ConditionalOnMissingBean({DataSource.class})

// 如果指定的数据源类型不是默认数据源类型
@ConditionalOnProperty(
	name = {"spring.datasource.type"}
)
static class Generic {
	Generic() {
	}
 
	@Bean
	public DataSource dataSource(DataSourceProperties properties) {
		//使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性
		return properties.initializeDataSourceBuilder().build();
	}
}

3 自动执行SQL

  • org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer

3.1 类作用:

​ runSchemaScripts(): 运行建表语句
​ runDataScripts(): 运行插入数据的sql语句

3.2 如何配置自动执行的sql

3.2.1 默认
3.2.1.1 将sql文件命名为schema.sql或者schema-all.sql
3.2.1.2 加入配置
spring.datasource.initialization-mode=always
3.2.2 自定义sql
spring.datasource.schema=classpath:/sql/m_cart.sql

4 测试数据源

package com.gp6.springboot23.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.Map;

@Controller
public class HelloController {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/query")
    public Map<String,Object> map(){
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * FROM m_cart_sql");
        return list.get(0);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31323797/article/details/84941606
28
今日推荐