<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Spring `JdbcTemplate`教程 > 原文: [http://zetcode.com/db/jdbctemplate/](http://zetcode.com/db/jdbctemplate/) Spring `JdbcTemplate`教程展示了如何使用 Spring 的`JdbcTemplate`處理數據。 我們是 MySQL 數據庫。 我們創建使用`JdbcTemplate`的經典 Spring 和 Spring Boot 應用。 ZetCode 擁有用于 MySQL Java 的完整電子書,其中包含擴展的`JdbcTemplate`章節: [MySQL Java 編程電子書](/ebooks/mysqljava/)。 [Tweet](https://twitter.com/share) ## 目錄 1. [在 MySQL 中創建數據庫](#mysql) 2. [Maven 依賴項](#maven) 3. [`queryForObject()`方法](#qfo) 4. [`RowMapper`](#rm) 5. [`BeanPropertyRowMapper`](#bprm) 6. [`queryForList()`方法](#qfl) 7. [使用命名參數](#named) 8. [使用`JdbcTemplate`的經典 Spring](#cla) 9. [使用`JdbcTemplate`的 Spring Boot](#boot) ## Spring Spring 是流行的 Java 應用框架。 `JdbcTemplate`是用于簡化 JDBC 編程的工具。 它處理乏味且容易出錯的底層細節,例如處理事務,清理資源以及正確處理異常。 `JdbcTemplate`包含在 Spring 的`spring-jdbc`模塊中。 Spring Boot 是 Spring 的解決方案,用于創建獨立的,生產級的基于 Spring 的應用。 MySQL 是一個開源關系數據庫管理系統。 它是最受歡迎的數據庫之一。 它通常在 Web 應用中使用。 ## MySQL 創建數據庫 我們使用`mysql`監視器創建一個新的`testdb`數據庫。 `cars_mysql.sql` ```java DROP TABLE IF EXISTS cars; CREATE TABLE cars(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), price INTEGER) ENGINE=InnoDB; INSERT INTO cars(name, price) VALUES('Audi', 52642); INSERT INTO cars(name, price) VALUES('Mercedes', 57127); INSERT INTO cars(name, price) VALUES('Skoda', 9000); INSERT INTO cars(name, price) VALUES('Volvo', 29000); INSERT INTO cars(name, price) VALUES('Bentley', 350000); INSERT INTO cars(name, price) VALUES('Citroen', 21000); INSERT INTO cars(name, price) VALUES('Hummer', 41400); INSERT INTO cars(name, price) VALUES('Volkswagen', 21600); ``` 這是在 MySQL 中創建`cars`表的 SQL。 要創建數據庫和表,我們使用`mysql`監視工具。 ```java $ sudo service mysql start ``` MySQL 用`sudo service mysql start`命令啟動。 ```java $ mysql -u user7 -p ``` 我們使用`mysql`監視器連接到數據庫。 ```java mysql> CREATE DATABASE testdb; Query OK, 1 row affected (0.02 sec) ``` 使用`CREATE DATABASE`語句創建一個新數據庫。 ```java mysql> USE testdb; mysql> SOURCE cars_mysql.sql ``` 使用`source`命令,加載并執行`cars_mysql.sql`文件。 ```java mysql> SELECT * FROM cars; +----+------------+--------+ | id | name | price | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+ 8 rows in set (0.00 sec) ``` 我們驗證數據。 ## Maven 依賴 對于我們的應用,我們需要下載數據庫驅動程序和 Spring 模塊。 我們使用 Maven 做到這一點。 ```java <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.3.RELEASE</version> </dependency> ``` 這將下載`spring-jdbc`模塊。 ```java <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> ``` 這是 MySQL 驅動程序的 Maven 依賴關系。 ## `queryForObject()`方法 `queryForObject()`方法執行 SQL 查詢并返回結果對象。 結果類型在參數中指定。 com/zetcode/SpringDBQueryObjectEx.java ```java package com.zetcode; import java.sql.SQLException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; public class SpringDBQueryObjectEx { public static void main(String[] args) throws SQLException { var ds = new SimpleDriverDataSource(); ds.setDriver(new com.mysql.jdbc.Driver()); ds.setUrl("jdbc:mysql://localhost:3306/testdb"); ds.setUsername("user7"); ds.setPassword("s$cret"); var sql = "SELECT COUNT(*) FROM cars"; var jtm = new JdbcTemplate(ds); int numOfCars = jtm.queryForObject(sql, Integer.class); System.out.format("There are %d cars in the table", numOfCars); } } ``` 在示例中,我們使用`queryForObject()`方法獲取`cars`表中的汽車數量。 ```java var sql = "SELECT COUNT(*) FROM cars"; ``` 該 SQL 返回`cars`表中的行數。 ```java int numOfCars = jtm.queryForObject(sql, Integer.class); ``` `queryForObject()`方法的第二個參數指定結果的類型; 在我們的案例中是`Integer`。 ## 行映射器 `RowMapper`逐行映射結果集的行。 此接口的實現執行將每一行映射到結果對象的實際工作。 com/zetcode/model/Car.java ```java package com.zetcode.model; import java.util.Objects; public class Car { private Long id; private String name; private int price; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Car car = (Car) o; return price == car.price && Objects.equals(id, car.id) && Objects.equals(name, car.name); } @Override public int hashCode() { return Objects.hash(id, name, price); } @Override public String toString() { final StringBuilder sb = new StringBuilder("Car{"); sb.append("id=").append(id); sb.append(", name='").append(name).append('\''); sb.append(", price=").append(price); sb.append('}'); return sb.toString(); } } ``` 我們有一個`Car` bean。 它具有`id`,`name`和`price`屬性。 com/zetcode/SpringDBRowMapper.java ```java package com.zetcode; import java.sql.ResultSet; import java.sql.SQLException; import com.zetcode.model.Car; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.datasource.SimpleDriverDataSource; public class SpringDBRowMapper { public static void main(String[] args) throws SQLException { var ds = new SimpleDriverDataSource(); ds.setDriver(new com.mysql.jdbc.Driver()); ds.setUrl("jdbc:mysql://localhost:3306/testdb"); ds.setUsername("user7"); ds.setPassword("s$cret"); var rm = (RowMapper<Car>) (ResultSet result, int rowNum) -> { var car = new Car(); car.setId(result.getLong("id")); car.setName(result.getString("name")); car.setPrice(result.getInt("price")); return car; }; var sql = "SELECT * FROM cars WHERE id=?"; Long id = 1L; var jtm = new JdbcTemplate(ds); var car = (Car) jtm.queryForObject(sql, new Object[]{id}, rm); System.out.println(car); } } ``` 在示例中,我們使用`RowMapper`將結果集的行映射到`Car`對象。 ```java var rm = (RowMapper<Car>) (ResultSet result, int rowNum) -> { var car = new Car(); car.setId(result.getLong("id")); car.setName(result.getString("name")); car.setPrice(result.getInt("price")); return car; }; ``` 這是結果集行到`Car`對象的映射。 ```java var car = (Car) jtm.queryForObject(sql, new Object[] {id}, rm); ``` `RowMapper`的實例作為第三個參數傳遞到`queryForObject()`。 ## `BeanPropertyRowMapper` `BeanPropertyRowMapper`是一種`RowMapper`實現,可將行轉換為指定映射目標類的新實例。 映射的目標類必須是頂級類,并且必須具有默認或無參數構造器。 結果集元數據中的列名與相應屬性的公共設置器匹配。 com/zetcode/model/Car.java ```java package com.zetcode.model; public class Car { private Long id; private String name; private int price; // getters and setters etc. } ``` 這是我們將`cars`表行映射到的`Car` bean。 com/zetcode/SpringBeanPropertyRowMapper.java ```java package com.zetcode; import com.zetcode.model.Car; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import java.sql.SQLException; public class SpringBeanPropertyRowMapper { public static void main(String[] args) throws SQLException { var dataSource = new SimpleDriverDataSource(); dataSource.setDriver(new com.mysql.jdbc.Driver()); dataSource.setUrl("jdbc:mysql://localhost:3306/testdb"); dataSource.setUsername("user7"); dataSource.setPassword("s$cret"); var sql = "SELECT * FROM cars WHERE id=?"; Long id = 1L; var jtm = new JdbcTemplate(dataSource); var car = (Car) jtm.queryForObject(sql, new Object[]{id}, BeanPropertyRowMapper.newInstance(Car.class)); System.out.println(car); } } ``` 該示例連接到`testdb`數據庫,并從`cars`表中檢索一輛汽車。 ```java var sql = "SELECT * FROM cars WHERE id=?"; ``` 該 SQL 語句從數據庫中選擇汽車對象。 ```java var jtm = new JdbcTemplate(dataSource); ``` `JdbcTemplate`已創建; 它以數據源為參數。 ```java var car = (Car) jtm.queryForObject(sql, new Object[]{id}, BeanPropertyRowMapper.newInstance(Car.class)); ``` 使用`queryForObject()`方法,我們查詢一個對象。 我們提供了 SQL 語句,參數和行映射器。 `BeanPropertyRowMapper`將一行轉換為`Car`目標類的新實例。 ```java System.out.println(car); ``` 取回的汽車被打印到終端。 ```java Car{id=1, name='Audi', price=52642} ``` 應用從`cars`表中打印第一行。 ## `queryForList()`方法 `queryForList()`方法執行對結果列表的查詢。 在以下示例中,我們從`cars`表中檢索所有汽車。 ```java pom.xml src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ SpringDBQueryForList.java │ └───resources │ db.properties └───test └───java ``` 這是項目結構。 我們將數據源屬性放入`db.properties`文件。 最好將資源與 Java 文件分開。 resources/db.properties ```java jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/testdb jdbc.username=user7 jdbc.password=s$cret ``` 這些是 MySQL 數據庫的屬性。 com/zetcode/SpringDBQueryForList.java ```java package com.zetcode; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import java.io.FileInputStream; import java.io.IOException; import java.sql.Driver; import java.util.List; import java.util.Map; import java.util.Properties; public class SpringDBQueryForList { public static void main(String[] args) throws IOException, ClassNotFoundException { var prop = new Properties(); prop.load(new FileInputStream("src/main/resources/db.properties")); var ds = new SimpleDriverDataSource(); ds.setDriverClass(((Class<Driver>) Class.forName(prop.getProperty("jdbc.driver")))); ds.setUrl(prop.getProperty("jdbc.url")); ds.setUsername(prop.getProperty("jdbc.username")); ds.setPassword(prop.getProperty("jdbc.password")); var sql = "SELECT * FROM cars"; var jtm = new JdbcTemplate(ds); var rows = (List<Map<String, Object>>) jtm.queryForList(sql); rows.forEach(System.out::println); } } ``` 該示例連接到 MySQL `testdb`數據庫,并從`cars`表中檢索所有行。 ```java var prop = new Properties(); prop.load(new FileInputStream("src/main/resources/db.properties")); ``` 數據源屬性是從`db.properties`文件加載的。 ```java var ds = new SimpleDriverDataSource(); ds.setDriverClass(((Class<Driver>) Class.forName(prop.getProperty("jdbc.driver")))); ds.setUrl(prop.getProperty("jdbc.url")); ds.setUsername(prop.getProperty("jdbc.username")); ds.setPassword(prop.getProperty("jdbc.password")); ``` 我們用屬性填充`SimpleDriverDataSource's`屬性。 ```java var jtm = new JdbcTemplate(ds); var rows = (List<Map<String, Object>>) jtm.queryForList(sql); ``` `JdbcTemplate`的`queryForList()`方法返回表中的行列表。 ```java rows.forEach(System.out::println); ``` 我們遍歷列表并將數據打印到終端。 ```java {id=1, name=Audi, price=52642} {id=2, name=Mercedes, price=57127} {id=3, name=Skoda, price=9000} {id=4, name=Volvo, price=29000} {id=5, name=Bentley, price=350000} {id=6, name=Citroen, price=21000} {id=7, name=Hummer, price=41400} {id=8, name=Volkswagen, price=21600} ``` 這是示例的輸出。 ## 使用命名參數 `NamedParameterJdbcTemplate`是具有一組基本 JDBC 操作的模板類,允許使用命名參數而不是傳統的`?`占位符。 resources/db.properties ```java jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/testdb jdbc.username=user7 jdbc.password=s$cret ``` 這些是 MySQL 數據庫的屬性。 com/zetcode/model/Car.java ```java package com.zetcode.model; public class Car { private Long id; private String name; private int price; // getters and setters etc. } ``` 這是`Car` bean。 com/zetcode/SpringDBNamedParameters.java ```java package com.zetcode; import com.zetcode.model.Car; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import java.io.FileInputStream; import java.io.IOException; import java.sql.Driver; import java.util.Properties; public class SpringDBNamedParameters { public static void main(String[] args) throws IOException, ClassNotFoundException { var prop = new Properties(); prop.load(new FileInputStream("src/main/resources/db.properties")); var ds = new SimpleDriverDataSource(); ds.setDriverClass(((Class<Driver>) Class.forName(prop.getProperty("jdbc.driver")))); ds.setUrl(prop.getProperty("jdbc.url")); ds.setUsername(prop.getProperty("jdbc.username")); ds.setPassword(prop.getProperty("jdbc.password")); var sql = "SELECT * FROM cars WHERE name LIKE :name"; var carName = "Volvo"; var jtm = new NamedParameterJdbcTemplate(ds); var namedParams = new MapSqlParameterSource("name", carName); var car = (Car) jtm.queryForObject(sql, namedParams, BeanPropertyRowMapper.newInstance(Car.class)); System.out.println(car); } } ``` 該示例查找汽車名稱; 其 SQL 代碼使用命名參數。 ```java var sql = "SELECT * FROM cars WHERE Name LIKE :name"; ``` SQL 具有`:name`令牌,這是一個命名參數。 ```java var jtm = new NamedParameterJdbcTemplate(ds); ``` `NamedParameterJdbcTemplate`用于命名參數。 ```java var namedParams = new MapSqlParameterSource("name", carName); ``` `MapSqlParameterSource`用于將參數值的簡單映射傳遞給`NamedParameterJdbcTemplate`類的方法。 ```java var car = (Car) jtm.queryForObject(sql, namedParams, BeanPropertyRowMapper.newInstance(Car.class)); ``` 命名的參數作為第二個參數傳遞給`queryForObject()`方法。 ```java Car{id=4, name='Volvo', price=29000} ``` 這是示例的輸出。 ## 使用`JdbcTemplate`的經典 Spring 示例 在下面的示例中,我們創建一個經典的命令行 Spring 應用,該應用使用`JdbcTemplate`連接到數據庫并發出 SQL 語句。 ```java pom.xml src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ │ ClassicSpringJdbcTemplate.java │ │ ├───config │ │ │ DBConfig.java │ │ ├───model │ │ │ Car.java │ │ └───service │ │ CarService.java │ │ ICarService.java │ └───resources │ db.properties └───test └───java ``` 這是項目結構。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>classicspringex</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <spring-version>5.1.3.RELEASE</spring-version> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-version}</version> </dependency> </dependencies> </project> ``` Maven `pom.xml`文件包含 MySQL 驅動程序,核心 Spring 庫和 JdbcTemplate 的依賴項。 com/zetcode/model/Car.java ```java package com.zetcode.model; public class Car { private Long id; private String name; private int price; // getters and setters etc. } ``` 這是`Car` bean。 resources/db.properties ```java jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/testdb jdbc.username=user7 jdbc.password=s$cret ``` 這些是數據庫屬性。 com/zetcode/config/DBConfig.java ```java package com.zetcode.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; @Configuration @PropertySource(value = "classpath:db.properties", ignoreResourceNotFound = true) public class DBConfig { @Autowired private Environment env; @Bean public DataSource dataSource() { var dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driver")); dataSource.setUrl(env.getProperty("jdbc.url")); dataSource.setUsername(env.getProperty("jdbc.username")); dataSource.setPassword(env.getProperty("jdbc.password")); return dataSource; } @Bean public JdbcTemplate jdbcTemplate() { var template = new JdbcTemplate(); template.setDataSource(dataSource()); return template; } } ``` `DBConfig`生成兩個 bean:`dataSource`和`jdbcTemplate`。 從`db.properties`中讀取數據庫屬性。 com/zetcode/service/ICarService.java ```java package com.zetcode.service; import com.zetcode.model.Car; import java.util.List; public interface ICarService { Car findById(Long id); List<Car> all(); } ``` `ICarService`定義了兩種簽約方法:`findById()`和`all()`。 com/zetcode/service/CarService.java ```java package com.zetcode.service; import com.zetcode.model.Car; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import java.util.List; @Service public class CarService implements ICarService { @Autowired private JdbcTemplate jdbcTemplate; public List<Car> all() { return jdbcTemplate.query("SELECT * FROM cars", BeanPropertyRowMapper.newInstance(Car.class)); } public Car findById(Long id) { var sql = "SELECT * FROM cars WHERE id=?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, BeanPropertyRowMapper.newInstance(Car.class)); } } ``` `CarService`具有與`JdbcTemplate`一起使用的代碼。 ```java @Autowired private JdbcTemplate jdbcTemplate; ``` Spring 允許使用`@Autowired`注入依賴項。 使用字段注入,我們添加了`DBConfig`中生成的`jdbcTemplate` bean。 com/zetcode/ClassicSpringJdbcTemplate.java ```java package com.zetcode; import com.zetcode.model.Car; import com.zetcode.service.ICarService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; @ComponentScan("com.zetcode") public class ClassicSpringJdbcTemplate { public static void main(String[] args) { var ctx = new AnnotationConfigApplicationContext(ClassicSpringJdbcTemplate.class); var app = ctx.getBean(ClassicSpringJdbcTemplate.class); app.run(); ctx.close(); } @Autowired private ICarService carService; private void run() { System.out.println("Fetching a car with Id 3"); Long id = 3L; var car = (Car) carService.findById(id); System.out.println(car); System.out.println("Fetching all cars"); var cars = carService.all(); cars.forEach(System.out::println); } } ``` 該示例使用`JdbcTemplate`從表中檢索特定行和所有行。 ```java var ctx = new AnnotationConfigApplicationContext(ClassicSpringJdbcTemplate.class); ``` `AnnotationConfigApplicationContext`允許創建帶有特定注解的 Spring bean,例如`@Service`或`@Configuration`。 ```java @Autowired private CarService carService; ``` 數據庫功能委托給`CarService`,并隨同`@Autowired`一起注入。 ```java private void run() { System.out.println("Fetching a car with Id 3"); Long id = 3L; var car = (Car) carService.findById(id); System.out.println(car); System.out.println("Fetching all cars"); var cars = carService.all(); cars.forEach(System.out::println); } ``` 我們調用服務方法來獲取特定行并獲取所有行。 ```java Fetching a car with Id 3 Car{id=3, name='Skoda', price=9000} Fetching all cars Car{id=1, name='Audi', price=52642} Car{id=2, name='Mercedes', price=57127} Car{id=3, name='Skoda', price=9000} Car{id=4, name='Volvo', price=29000} Car{id=5, name='Bentley', price=350000} Car{id=6, name='Citroen', price=21000} Car{id=7, name='Hummer', price=41400} Car{id=8, name='Volkswagen', price=21600} ``` 這是輸出。 ## 使用`JdbcTemplate`的 Spring Boot 示例 在這個例子中,我們創建一個命令行 Spring Boot 應用,它將使用`JdbcTemplate`連接到數據庫。 我們將有兩個數據源:一個用于 Derby,一個用于 MySQL。 該項目可在作者的 [Github](https://github.com/janbodnar/Spring-Boot-JdbcTemplate) 頁面上找到。 ```java pom.xml src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ │ Application.java │ │ │ MyRunner.java │ │ ├───config │ │ │ AppConfig.java │ │ ├───model │ │ │ Car.java │ │ ├───repository │ │ │ CarRepository.java │ │ │ ICarRepository.java │ │ └───service │ │ CarService.java │ │ ICarService.java │ └───resources │ application.properties └───test └───java ``` 這是項目結構。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>springbootjdbctemplate</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` `pom.xml`文件包含 Spring Boot 和 MySQL 的依賴項。 resources/application.properties ```java mysql.datasource.driverClassName=com.mysql.jdbc.Driver mysql.datasource.jdbcUrl=jdbc:mysql://localhost:3306/testdb mysql.datasource.username=user7 mysql.datasource.password=s$cret ``` 在`application.properties`文件中,我們定義 MySQL 數據源。 com/zetcode/config/AppConfig.java ```java package com.zetcode.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class AppConfig { @Bean @ConfigurationProperties(prefix = "mysql.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } } ``` 在`AppConfig`中,我們使用`DataSourceBuilder`創建一個 MySQL 數據源。 com/zetcode/model/Car.java ```java package com.zetcode.model; public class Car { private Long id; private String name; private int price; // getters and setters etc. } ``` 這是`Car` bean。 com/zetcode/repository/ICarRepository.java ```java package com.zetcode.repository; import com.zetcode.model.Car; import java.util.List; public interface ICarRepository { void saveCar(Car car); Car findCarByName(String name); List<Car> findAll(); } ``` `ICarRepository`包含以下方法:保存新車,以其名稱取回汽車并取回所有汽車。 com/zetcode/repository/CarRepository.java ```java package com.zetcode.repository; import com.zetcode.model.Car; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class CarRepository implements ICarRepository { @Autowired private JdbcTemplate jdbcTemplate; @Override public void saveCar(Car car) { var sql = "INSERT INTO cars(name, price) VALUES (?, ?)"; Object[] params = new Object[] {car.getName(), car.getPrice()}; jdbcTemplate.update(sql, params); } @Override public Car findCarByName(String name) { var sql = "SELECT * FROM cars WHERE name = ?"; Object[] param = new Object[] {name}; return jdbcTemplate.queryForObject(sql, param, BeanPropertyRowMapper.newInstance(Car.class)); } @Override public List<Car> findAll() { var sql = "SELECT * FROM cars"; return jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Car.class)); } } ``` `CarRepository`包含`ICarRepository`合同的實現。 這是與`JdbcTemplate`一起使用的層。 com/zetcode/service/ICarService.java ```java package com.zetcode.service; import com.zetcode.model.Car; import java.util.List; public interface ICarService { Car findByName(String name); List<Car> findAll(); } ``` 我們有兩種合同服務方式。 com/zetcode/service/CarService.java ```java package com.zetcode.service; import com.zetcode.model.Car; import com.zetcode.repository.ICarRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class CarService implements ICarService { @Autowired private ICarRepository carRepository; public Car findByName(String name) { return carRepository.findCarByName(name); } public List<Car> findAll() { return carRepository.findAll(); } } ``` `CarService`包含`ICarService`合同的實現。 服務方法委托給`ICarRepository`。 com/zetcode/MyRunner.java ```java package com.zetcode; import com.zetcode.model.Car; import com.zetcode.service.ICarService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Component; @Component public class MyRunner implements CommandLineRunner { @Autowired private ICarService carService; @Override public void run(String... args) { try { var car = carService.findByName("Citroen"); System.out.println(car); } catch (EmptyResultDataAccessException e) { System.out.println("Car was not found"); } var cars = carService.findAll(); for (Car car: cars) { System.out.println(car); } } } ``` Spring Boot 命令行應用必須實現`CommandLineRunner`接口。 我們將要執行的代碼放入`run()`方法中。 ```java @Autowired private ICarService carService; ``` Spring 注入`carService` bean。 ```java try { var car = carService.findByName("Citroen"); System.out.println(car); } catch (EmptyResultDataAccessException e) { System.out.println("Car was not found"); } ``` 我們試圖找到一輛名為雪鐵龍的汽車。 如果沒有這樣的汽車,Spring 會拋出`EmptyResultDataAccessException`異常。 ```java var cars = carService.findAll(); for (Car car: cars) { System.out.println(car); } ``` 我們使用`findAll()`方法從數據庫中檢索所有汽車。 數據被打印到控制臺。 com/zetcode/Application.java ```java package com.zetcode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 這是 Spring Boot 應用的入口。 在本教程中,我們介紹了 Spring 的`JdbcTemplate`模塊。 我們創建了一個使用`JdbcTemplate`的 Spring Boot 應用。 ZetCode 具有以下相關教程: [Java 教程](/lang/java/), [Spring `JdbcTemplate`教程](/articles/springjdbctemplate/), [Spring `EmbeddedDatabaseBuilder`教程](/spring/embeddeddatabasebuilder/), [EclipseLink 教程](/java/eclipselink/), [Hibernate Derby 教程](/db/hibernatederby/), [Servlet FreeMarker `JdbcTemplate`教程](/articles/servletfreemarker/), [MySQL Java 教程](/db/mysqljava/)和 [PostgreSQL Java 教程](/db/postgresqljavatutorial/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看