摘要:本指南將引導(dǎo)您完成使用訪問關(guān)系數(shù)據(jù)的過程。要在應(yīng)用程序級別表示此數(shù)據(jù),請創(chuàng)建一個(gè)類。存儲(chǔ)和檢索數(shù)據(jù)提供了一個(gè)名為的模板類,可以輕松使用關(guān)系數(shù)據(jù)庫和。自動(dòng)加載并使其可用。使用的參數(shù),以避免注入攻擊通過指示來綁定變量。
本指南將引導(dǎo)您完成使用Spring訪問關(guān)系數(shù)據(jù)的過程。
你要構(gòu)建什么
您將使用Spring構(gòu)建一個(gè)JdbcTemplate應(yīng)用程序來訪問存儲(chǔ)在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。
你需要什么
大約15分鐘
最喜歡的文本編輯器或IDE
JDK 1.8或更高版本
Gradle 4+或Maven 3.2+
您還可以將代碼直接導(dǎo)入IDE:
使用STS構(gòu)建/導(dǎo)入入門指南
使用IntelliJ IDEA導(dǎo)入入門指南
如何完成本指南
與大多數(shù)Spring入門指南一樣,您可以從頭開始并完成每個(gè)步驟,或者您可以繞過您已熟悉的基本設(shè)置步驟。無論哪種方式,您最終都會(huì)使用工作代碼。
要從頭開始,請繼續(xù)使用Gradle構(gòu)建。
要跳過基礎(chǔ)知識(shí),請執(zhí)行以下操作:
下載并解壓縮本指南的源存儲(chǔ)庫,或使用Git克隆它:
git clone https://github.com/spring-guides/gs-relational-data-access.git
進(jìn)入gs-relational-data-access/initial
跳轉(zhuǎn)到創(chuàng)建Customer對象。
完成后,可以根據(jù)gs-relational-data-access/complete中的代碼檢查結(jié)果。
使用Gradle構(gòu)建首先,設(shè)置一個(gè)基本的構(gòu)建腳本。在使用Spring構(gòu)建應(yīng)用程序時(shí),您可以使用任何您喜歡的構(gòu)建系統(tǒng),但此處包含了使用Gradle和Maven所需的代碼。如果您不熟悉這兩者,請參閱使用Gradle構(gòu)建Java項(xiàng)目或使用Maven構(gòu)建Java項(xiàng)目。
創(chuàng)建目錄結(jié)構(gòu)
在您選擇的項(xiàng)目目錄中,創(chuàng)建以下子目錄結(jié)構(gòu);例如,在*nix系統(tǒng)上使用mkdir -p src/main/java/hello:
└── src └── main └── java └── hello
創(chuàng)建Gradle構(gòu)建文件
下面是最初的Gradle構(gòu)建文件。
buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE") } } apply plugin: "java" apply plugin: "eclipse" apply plugin: "idea" apply plugin: "org.springframework.boot" apply plugin: "io.spring.dependency-management" bootJar { baseName = "gs-relational-data-access" version = "0.1.0" } repositories { mavenCentral() } sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { compile("org.springframework.boot:spring-boot-starter") compile("org.springframework:spring-jdbc") compile("com.h2database:h2") testCompile("junit:junit") }
在Spring Boot gradle plugin提供了許多便捷的功能:
它收集類路徑上的所有jar并構(gòu)建一個(gè)可運(yùn)行的“über-jar”,這使得執(zhí)行和傳輸服務(wù)更加方便。
它搜索public static void main()標(biāo)記為可運(yùn)行類的方法。
它提供了一個(gè)內(nèi)置的依賴項(xiàng)解析器,它設(shè)置版本號(hào)以匹配Spring Boot依賴項(xiàng)。您可以覆蓋任何您希望的版本,但它將默認(rèn)為Boot的所選版本集。
使用Maven構(gòu)建首先,設(shè)置一個(gè)基本的構(gòu)建腳本。在使用Spring構(gòu)建應(yīng)用程序時(shí),您可以使用任何您喜歡的構(gòu)建系統(tǒng),但此處包含了使用Maven所需的代碼。如果您不熟悉Maven,請參閱使用Maven構(gòu)建Java項(xiàng)目。
創(chuàng)建目錄結(jié)構(gòu)
在您選擇的項(xiàng)目目錄中,創(chuàng)建以下子目錄結(jié)構(gòu);例如,在*nix系統(tǒng)上使用mkdir -p src/main/java/hello:
└── src └── main └── java └── hello
pom.xml
4.0.0 org.springframework gs-relational-data-access 0.1.0 org.springframework.boot spring-boot-starter-parent 2.0.3.RELEASE 1.8 org.springframework.boot spring-boot-starter-jdbc com.h2database h2 org.springframework.boot spring-boot-maven-plugin
在Spring Boot gradle plugin提供了許多便捷的功能:
它收集類路徑上的所有jar并構(gòu)建一個(gè)可運(yùn)行的“über-jar”,這使得執(zhí)行和傳輸服務(wù)更加方便。
它搜索public static void main()標(biāo)記為可運(yùn)行類的方法。
它提供了一個(gè)內(nèi)置的依賴項(xiàng)解析器,它設(shè)置版本號(hào)以匹配Spring Boot依賴項(xiàng)。您可以覆蓋任何您希望的版本,但它將默認(rèn)為Boot的所選版本集。
使用IDE構(gòu)建閱讀如何將本指南直接導(dǎo)入使用STS構(gòu)建/導(dǎo)入入門指南。
閱讀使用IntelliJ IDEA導(dǎo)入入門指南中如何使用本指南。
創(chuàng)建一個(gè)Customer對象
您將在下面使用的簡單數(shù)據(jù)訪問邏輯管理客戶的名字和姓氏。要在應(yīng)用程序級別表示此數(shù)據(jù),請創(chuàng)建一個(gè)Customer類。
package hello; public class Customer { private long id; private String firstName, lastName; public Customer(long id, String firstName, String lastName) { this.id = id; this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format( "Customer[id=%d, firstName="%s", lastName="%s"]", id, firstName, lastName); } // getters & setters omitted for brevity }
存儲(chǔ)和檢索數(shù)據(jù)
Spring提供了一個(gè)名為JdbcTemplate的模板類,可以輕松使用SQL關(guān)系數(shù)據(jù)庫和JDBC。大多數(shù)JDBC代碼都陷入資源獲取,連接管理,異常處理和一般錯(cuò)誤檢查之中,這與代碼要實(shí)現(xiàn)的內(nèi)容完全無關(guān),JdbcTemplate負(fù)責(zé)這一切。您所要做的就是專注于手頭的任務(wù)。
src/main/java/hello/Application.java
package hello; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jdbc.core.JdbcTemplate; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @SpringBootApplication public class Application implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(Application.class); public static void main(String args[]) { SpringApplication.run(Application.class, args); } @Autowired JdbcTemplate jdbcTemplate; @Override public void run(String... strings) throws Exception { log.info("Creating tables"); jdbcTemplate.execute("DROP TABLE customers IF EXISTS"); jdbcTemplate.execute("CREATE TABLE customers(" + "id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))"); // Split up the array of whole names into an array of first/last names List
@SpringBootApplication 是一個(gè)便利注釋,添加了以下所有內(nèi)容:
@Configuration 標(biāo)記該類作為應(yīng)用程序上下文的bean定義的源。
@EnableAutoConfiguration 告訴Spring Boot開始根據(jù)類路徑設(shè)置,其他bean和各種屬性設(shè)置添加bean。
@ComponentScan告訴Spring在包中尋找其他組件,配置和服務(wù),允許它找到控制器。
main()方法使用Spring Boot的SpringApplication.run()方法來啟動(dòng)應(yīng)用程序。您是否注意到?jīng)]有一行XML?也沒有web.xml文件。此Web應(yīng)用程序是100%純Java,您無需處理配置任何管道或基礎(chǔ)結(jié)構(gòu)。
main()方法使用Spring Boot的SpringApplication.run()方法來啟動(dòng)應(yīng)用程序。您是否注意到?jīng)]有一行XML?也沒有web.xml文件。此Web應(yīng)用程序是100%純Java,您無需處理配置任何管道或基礎(chǔ)結(jié)構(gòu)。
Spring Boot支持H2,一種內(nèi)存中的關(guān)系數(shù)據(jù)庫引擎,并自動(dòng)創(chuàng)建連接。因?yàn)槲覀兪褂玫氖莝pring-jdbc,Spring Boot會(huì)自動(dòng)創(chuàng)建一個(gè)JdbcTemplate。@Autowired自動(dòng)加載JdbcTemplate并使其可用。
這個(gè)Application類實(shí)現(xiàn)了Spring Boot CommandLineRunner,這意味著它將run()在加載應(yīng)用程序上下文后執(zhí)行該方法。
首先,使用JdbcTemplate’s `execute方法安裝一些DDL 。
其次,您獲取字符串列表并使用Java 8流,將它們拆分為Java數(shù)組中的firstname/lastname對。
然后使用JdbcTemplate’s `batchUpdate方法在新創(chuàng)建的表中安裝一些記錄。方法調(diào)用的第一個(gè)參數(shù)是查詢字符串,最后一個(gè)參數(shù)(Objects 的數(shù)組)包含要替換為“?”字符的查詢的變量。
對于單個(gè)插入語句,JdbcTemplate’s `insert方法很好。但對于多個(gè),最好使用batchUpdate。
使用?的參數(shù),以避免SQL注入攻擊通過指示JDBC來綁定變量。
最后,使用query方法在表中搜索與條件匹配的記錄。您再次使用“?”參數(shù)為查詢創(chuàng)建參數(shù),在進(jìn)行調(diào)用時(shí)傳入實(shí)際值。最后一個(gè)參數(shù)是用于將每個(gè)結(jié)果行轉(zhuǎn)換為新Customer對象的Java 8 lambda 。
Java 8 lambdas很好地映射到單個(gè)方法接口,如Spring的RowMapper。如果您使用的是Java 7或更早版本,則可以輕松插入匿名接口實(shí)現(xiàn),并具有與lambda expresion正文所包含的相同的方法體,并且它可以毫不費(fèi)力地使用Spring。
構(gòu)建可執(zhí)行的JAR
您可以使用Gradle或Maven從命令行運(yùn)行該應(yīng)用程序?;蛘?,您可以構(gòu)建一個(gè)包含所有必需依賴項(xiàng),類和資源的可執(zhí)行JAR文件,并運(yùn)行該文件。這使得在整個(gè)開發(fā)生命周期中,跨不同環(huán)境等將服務(wù)作為應(yīng)用程序發(fā)布,版本和部署變得容易。
如果您使用的是Gradle,則可以使用運(yùn)行該應(yīng)用程序./gradlew bootRun?;蛘吣梢允褂脴?gòu)建JAR文件./gradlew build。然后你可以運(yùn)行JAR文件:
java -jar build/libs/gs-relational-data-access-0.1.0.jar
如果您使用的是Maven,則可以使用該應(yīng)用程序運(yùn)行該應(yīng)用程序./mvnw spring-boot:run?;蛘吣梢允褂脴?gòu)建JAR文件./mvnw clean package。然后你可以運(yùn)行JAR文件:
java -jar target/gs-relational-data-access-0.1.0.jar
上面的過程將創(chuàng)建一個(gè)可運(yùn)行的JAR。您也可以選擇構(gòu)建經(jīng)典WAR文件。
顯示日志輸出,您可以從日志中看到它在后臺(tái)線程上。您應(yīng)該每隔5秒鐘看到計(jì)劃任務(wù):
2015-06-19 10:58:31.152 INFO 67731 --- [ main] hello.Application : Creating tables 2015-06-19 10:58:31.219 INFO 67731 --- [ main] hello.Application : Inserting customer record for John Woo 2015-06-19 10:58:31.220 INFO 67731 --- [ main] hello.Application : Inserting customer record for Jeff Dean 2015-06-19 10:58:31.220 INFO 67731 --- [ main] hello.Application : Inserting customer record for Josh Bloch 2015-06-19 10:58:31.220 INFO 67731 --- [ main] hello.Application : Inserting customer record for Josh Long 2015-06-19 10:58:31.230 INFO 67731 --- [ main] hello.Application : Querying for customer records where first_name = "Josh": 2015-06-19 10:58:31.242 INFO 67731 --- [ main] hello.Application : Customer[id=3, firstName="Josh", lastName="Bloch"] 2015-06-19 10:58:31.242 INFO 67731 --- [ main] hello.Application : Customer[id=4, firstName="Josh", lastName="Long"] 2015-06-19 10:58:31.244 INFO 67731 --- [ main] hello.Application : Started Application in 1.693 seconds (JVM running for 2.054)
概要
恭喜!您剛剛使用Spring開發(fā)了一個(gè)簡單的JDBC客戶端。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73180.html
摘要:數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏在較為完備的數(shù)據(jù)庫連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的連接占用超時(shí)設(shè)定,強(qiáng)制收回被占用連接。 一、數(shù)據(jù)庫連接池的原理 基本原理 對于一個(gè)簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時(shí)可以簡單地在需要訪問數(shù)據(jù)庫時(shí),就新創(chuàng)建一個(gè)連接,用完后就關(guān)閉它,這樣做也...
摘要:數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏在較為完備的數(shù)據(jù)庫連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的連接占用超時(shí)設(shè)定,強(qiáng)制收回被占用連接。 一、數(shù)據(jù)庫連接池的原理 基本原理 對于一個(gè)簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時(shí)可以簡單地在需要訪問數(shù)據(jù)庫時(shí),就新創(chuàng)建一個(gè)連接,用完后就關(guān)閉它,這樣做也...
摘要:什么是呢全稱,是提出的一個(gè)對象持久化規(guī)范,各應(yīng)用服務(wù)器自主選擇具體實(shí)現(xiàn)。僅僅只是一個(gè)規(guī)范,而不是產(chǎn)品使用本身是不能做到持久化的。只要提供了持久化類與表的映射關(guān)系,框架在運(yùn)行時(shí)就能參照映射文件的信息,把對象持久化到數(shù)據(jù)庫中。 我們在進(jìn)行事務(wù)處理往往需要和數(shù)據(jù)庫進(jìn)行交互,這其中有關(guān)系型數(shù)據(jù)庫(MySql,Sql Server,Oracle)或者是非關(guān)系型數(shù)據(jù)庫(Redis,Hadhoop)...
閱讀 1499·2023-04-25 15:40
閱讀 2881·2021-08-11 11:15
閱讀 2284·2019-08-26 13:48
閱讀 2861·2019-08-26 12:18
閱讀 2461·2019-08-23 18:23
閱讀 2916·2019-08-23 17:01
閱讀 2990·2019-08-23 16:29
閱讀 1108·2019-08-23 15:15