成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用JDBC和Spring訪問關(guān)系數(shù)據(jù)

liaorio / 1266人閱讀

摘要:本指南將引導(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 splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream()
                .map(name -> name.split(" "))
                .collect(Collectors.toList());

        // Use a Java 8 stream to print out each tuple of the list
        splitUpNames.forEach(name -> log.info(String.format("Inserting customer record for %s %s", name[0], name[1])));

        // Uses JdbcTemplate"s batchUpdate operation to bulk load data
        jdbcTemplate.batchUpdate("INSERT INTO customers(first_name, last_name) VALUES (?,?)", splitUpNames);

        log.info("Querying for customer records where first_name = "Josh":");
        jdbcTemplate.query(
                "SELECT id, first_name, last_name FROM customers WHERE first_name = ?", new Object[] { "Josh" },
                (rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name"))
        ).forEach(customer -> log.info(customer.toString()));
    }
}

@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

相關(guān)文章

  • 數(shù)據(jù)庫連接池

    摘要:數(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)閉它,這樣做也...

    olle 評論0 收藏0
  • 數(shù)據(jù)庫連接池

    摘要:數(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)閉它,這樣做也...

    Tamic 評論0 收藏0
  • 談?wù)?em>Spring-Data的那些事兒

    摘要:什么是呢全稱,是提出的一個(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)...

    chinafgj 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<