本篇文章為大家展示了Spring Boot中怎樣使用JDBC,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比市南網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式市南網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋市南地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
JDBC API 屬于Java APIJDBC用于以下幾種功能:連接到數(shù)據(jù)庫(kù)、執(zhí)行SQL語(yǔ)句
可以在POM中找到引入的JDBC依賴和mysql依賴:
JDBC 依賴:
org.springframework.boot
spring-boot-starter-jdbc
MySql 驅(qū)動(dòng)依賴:
mysql
mysql-connector-java
runtime
新增配置文件:src/main/resources/application.yml
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/study-spring-boot?serverTimezone=UTC&useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
driverClassName: com.mysql.cj.jdbc.Driver
注意:com.mysq.jdbc.Driver
被廢棄了,需要使用com.mysql.cj.jdbc.Driver
package com.jackson0714.springboot;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@SpringBootTest
class Springboot05DataJdbcApplicationTests {
@Autowired
DataSource dataSource; //自動(dòng)配置數(shù)據(jù)源,使用yml配置
@Test
void contextLoads() throws SQLException {
System.out.println("數(shù)據(jù)源:" + dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println("數(shù)據(jù)庫(kù)連接:" + connection);
connection.close();
}
}
默認(rèn)數(shù)據(jù)源:class com.zaxxer.hikari.HikariDataSource
數(shù)據(jù)庫(kù)連接:HikariProxyConnection@1335157064 wrapping com.mysql.cj.jdbc.ConnectionImpl@7ff8a9dc
自動(dòng)配置文件路徑:org.springframework.boot.autoconfigure.jdbc
DataSourceConfiguration用來(lái)自動(dòng)導(dǎo)入數(shù)據(jù)源(根據(jù)各種判斷)
/**
* Tomcat Pool DataSource configuration.
*/
@Configuration(proxyBeanMethods = false)
@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 {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.tomcat")
如果導(dǎo)入了org.apache.tomcat.jdbc.pool.DataSource數(shù)據(jù)源,并且配置的spring.datasource.type配置的是org.apache.tomcat.jdbc.pool.DataSource,或沒(méi)配置type也使用tomcat數(shù)據(jù)源
org.apache.tomcat.jdbc.pool、HikariDataSource、org.apache.commons.dbcp2
使用DataSourceBuilder創(chuàng)建數(shù)據(jù)源,利用反射創(chuàng)建響應(yīng)type的數(shù)據(jù)源,并且綁定相關(guān)屬性
/**
* Generic DataSource configuration.
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
DataSource dataSource(DataSourceProperties properties) {
//使用DataSourceBuilder創(chuàng)建數(shù)據(jù)源,利用反射創(chuàng)建響應(yīng)type的數(shù)據(jù)源,并且綁定相關(guān)屬性
return properties.initializeDataSourceBuilder().build();
}
}
/**
* Bean to handle {@link DataSource} initialization by running {@literal schema-*.sql} on
* {@link InitializingBean#afterPropertiesSet()} and {@literal data-*.sql} SQL scripts on
* a {@link DataSourceSchemaCreatedEvent}.
*
* @author Stephane Nicoll
* @see DataSourceAutoConfiguration
*/
class DataSourceInitializerInvoker implements ApplicationListener, InitializingBean {
createSchema() 創(chuàng)建表 (文件名規(guī)則 schema-*.sql)
initSchema() 執(zhí)行數(shù)據(jù)腳本 (文件名規(guī)則 data-*.sql)
getScripts() 來(lái)獲取需要執(zhí)行的腳本
private List getScripts(String propertyName, List resources, String fallback) {
if (resources != null) {
return getResources(propertyName, resources, true);
}
String platform = this.properties.getPlatform();
List fallbackResources = new ArrayList<>();
fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql");
fallbackResources.add("classpath*:" + fallback + ".sql");
return getResources(propertyName, fallbackResources, false);
}
1) fallback
= "schema", platform
="all",會(huì)自動(dòng)執(zhí)行根目錄下:schema-all.sql 或schema.sql 文件
2) fallback
= "data", platform
="all",會(huì)自動(dòng)執(zhí)行根目錄下:data-all.sql 或data.sql 文件
isEnabled() 方法判斷是否開啟了自動(dòng)執(zhí)行腳本
有三種模式:NEVER,EMBEDDED(默認(rèn)),Always
疑問(wèn):用EMBEDDED模式返回false,開關(guān)關(guān)閉,不執(zhí)行腳本,這是為啥呢?
用Always模式則每次啟動(dòng)spring boot重復(fù)執(zhí)行腳本(創(chuàng)建表腳本都是先判斷有沒(méi)有表,有則刪除后重建)
private boolean isEnabled() {
DataSourceInitializationMode mode = this.properties.getInitializationMode();
if (mode == DataSourceInitializationMode.NEVER) {
return false;
}
if (mode == DataSourceInitializationMode.EMBEDDED && !isEmbedded()) {
return false;
}
return true;
}
schema:
- classpath:department.sql
創(chuàng)建出的 department
表
JdbcTemplateAutoConfiguration.java 文件 自動(dòng)注入了JdbcTemplate。(JdbcTemplate用來(lái)操作數(shù)據(jù)庫(kù))
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(JdbcProperties.class)
@Import({ JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })
public class JdbcTemplateAutoConfiguration {
}
io.springfox
springfox-swagger2
2.9.2
io.springfox
springfox-swagger-ui
2.9.2
package com.jackson0714.springboot.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("玩轉(zhuǎn)Spring Boot 接口文檔")
.description("This is a restful api document of Spring Boot.")
.version("1.0")
.build();
}
}
http://localhost:8081/swagger-ui.html
回到頂部
@ApiOperation(value = "1.新增部門")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "部門名稱")
})
@PostMapping("/create")
public int createDepartment(@RequestParam String name) {
String sql = String.format("insert into department(departmentName) value('%s')", name);
int result = jdbcTemplate.update(sql);
return result;
}
表記錄
@ApiOperation(value = "2.查詢所有部門")
@GetMapping("/getAllDepartment")
public List
@ApiOperation(value = "3.根據(jù)id查詢某個(gè)部門")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "需要查詢的部門id")
})
@GetMapping("/{id}")
public Map getDepartmentById(@PathVariable Long id) {
String sql = "select * from department where id = " + id;
List> list = jdbcTemplate.queryForList(sql);
return list.get(0);
}
@ApiOperation(value = "根據(jù)id更新部門名稱")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "需要更新的部門id"),
@ApiImplicitParam(name = "name", value = "需要更新的部門名稱")
})
@PostMapping("/update")
public int updateDepartmentById(@RequestParam Long id, @RequestParam String name) {
String sql = String.format("update department set departmentName = '%s' where id = %d", name, id);
int result = jdbcTemplate.update(sql);
return result;
}
@ApiOperation(value = "根據(jù)id刪除部門")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "需要?jiǎng)h除的部門id")
})
@PostMapping("/delete")
public int deleteDepartment(@RequestParam Long id) {
String sql = String.format("delete from department where id = %d", id);
int result = jdbcTemplate.update(sql);
return result;
}
java.sql.SQLException:null, message from server: "Host 'Siri' is not allowed to connect to this MySQL server"
解決方案:
執(zhí)行命令:
use mysql;
select host from user;
update user set host = '%' where user = 'root'
執(zhí)行結(jié)果:
Query OK, 1 row affected
如下圖所示:
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
解決方案:
配置spring.datasource.url 時(shí),增加參數(shù):serverTimezone=UTC
上述內(nèi)容就是Spring Boot中怎樣使用JDBC,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。