一、Springboot連接數(shù)據(jù)的方式主要有以下三種
- JDBC
- Mybatis
- Spring Data JPA
二、springboot整合JDBC
1.創(chuàng)建項目,引入stater

查看pom.xml,主要依賴已經(jīng)引入
<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>
2.編寫yml
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/test2
driver-class-name: com.mysql.jdbc.Driver
3.修改測試類進(jìn)行測試

@SpringBootTest
class SpringbootJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
System.out.println("connection:" + connection);
connection.close();
}
}
輸出:
connection:HikariProxyConnection@1054913783 wrapping com.mysql.cj.jdbc.ConnectionImpl@79b84841
springboot 默認(rèn)可以支持Dbcp2,Hikari,Tomcat(springboot 2.2.5)等數(shù)據(jù)源
相關(guān)配置在DataSourceConfiguration類中
4.使用JdbcTemplate操作數(shù)據(jù)庫
創(chuàng)建Controller

代碼如下:
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
JdbcTemplate jdbcTemplate;
@GetMapping("/score")
public Map<String, Object> getScore() {
List<Map<String, Object>> scoreList = jdbcTemplate.queryForList("SELECT * FROM score");
return scoreList.get(0);
}
}
數(shù)據(jù)庫表數(shù)據(jù):

查詢結(jié)果如下:

5.如何修改數(shù)據(jù)源
性能方面 hikari>druid>tomcat-jdbc>dbcp>c3p0 。hikari的高性能得益于最大限度的避免鎖競爭。druid功能最為全面,sql攔截等功能,統(tǒng)計數(shù)據(jù)較為全面,具有良好的擴(kuò)展性。
上面的開發(fā)中可以看到我們使用的數(shù)據(jù)源為hikari,接下來我們要將其修改為durid
(1)首先加入如下依賴
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
(2)修改pom文件,加入type: com.alibaba.druid.pool.DruidDataSource
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/test2
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
(3)測試類進(jìn)行測試
@SpringBootTest
class SpringbootJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
}
}
輸出:
class com.alibaba.druid.pool.DruidDataSource
(4)更全面的連接池配置
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/test2
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 1 #初始化大小
minIdle: 1 #最小等待連接數(shù)量
# maxIdle: 5 最大等待連接數(shù)量,已經(jīng)被棄用,報錯:maxIdle is deprecated
maxActive: 20 #最大連接數(shù)
maxWait: 60000 #配置獲取連接等待超時的時間
timeBetweenEvictionRunsMillis: 60000 #間隔多久才進(jìn)行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
minEvictableIdleTimeMillis: 300000 # 配置一個連接在池中最小生存的時間,單位是毫秒
# Oracle必須這樣配置檢查,不了會報檢查錯誤
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: true
testOnReturn: false
# 打開PSCache,并且指定每個連接上PSCache的大小
poolPreparedStatements: false
maxPoolPreparedStatementPerConnectionSize: 20
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
filters: stat,wall,log4j
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多個DruidDataSource的監(jiān)控數(shù)據(jù)
useGlobalDataSourceStat: true
druid:
allow: #允許登陸的IP地址
ip: 127.0.0.1
login: #登陸的賬戶密碼
userName: admin
password: admin123
為了使上面連接池配置生效,需要添加duridConfig配置文件
@Configuration
public class DuridConfig {
@Value("${druid.login.userName}")
private String userName;
@Value("${druid.login.password}")
private String password;
@Value("${druid.allow.ip}")
private String allowIp;
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid() {
return new DruidDataSource();
}
//配置durid的監(jiān)控
//1.配置一個管理后臺的servlet
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
Map<String, String> initParameters = new HashMap<>();
initParameters.put("loginUsername", userName); // 用戶名
initParameters.put("loginPassword", password); // 密碼
initParameters.put("resetEnable", "false"); // 禁用HTML頁面上的“Reset All”功能
initParameters.put("allow", allowIp); // IP白名單 (沒有配置或者為空,則允許所有訪問)
//initParameters.put("deny", "");// IP黑名單 (存在共同時,deny優(yōu)先于allow)
servletRegistrationBean.setInitParameters(initParameters);
return servletRegistrationBean;
}
//2.注冊一個web監(jiān)控的filter
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
瀏覽器訪問:http://127.0.0.1:8080/druid

重新執(zhí)行請求localhost:8080/hello/score,然后查看監(jiān)控記錄:
