Spring6 的JdbcTemplate的JDBC模板類的詳細使用說明

来源:https://www.cnblogs.com/TheMagicalRainbowSea/p/18188270
-Advertisement-
Play Games

1. Spring6 的JdbcTemplate的JDBC模板類的詳細使用說明 @目錄1. Spring6 的JdbcTemplate的JDBC模板類的詳細使用說明每博一文案2. 環境準備3. 數據準備4. 開始4.1 從數據表中插入(添加)數據4.2 從數據表中修改數據4.3 從數據表中刪除數據4 ...


1. Spring6 的JdbcTemplate的JDBC模板類的詳細使用說明

@

目錄


每博一文案

他伸直雙臂,舉過頭頂,兩隻手握在一起,伸了個懶腰,望著天地交接的地方,聲音飄渺,嗯,有人說高中喜歡的人是能記一輩子的。
你信嗎?
他側著頭望著他,邢武對他笑,笑得那麼雲淡風輕,眼神卻那麼複雜,聲音透過風有些不真切地傳了過去。
你這麼優秀,不能回在感情上。
那一瞬間,晴也身上仿佛迸發出耀眼自信的光芒,轉過身,逆著光昂起下巴說,一輩子很長,可以做很多事,但我不會把它用來記住一個人。
我晴也不可能毀在任何事情上。
信我,我不是懦夫。
如果我敢拿未來賭一把,你會讓我輸嗎?
晴也把選擇權重新拾了起來,鄭重地交還到邢武手中。
他知道邢武的擔憂和閃躲,也知道他的顧慮和徘徊。
無論是他的家庭,他的出身,他的背景,讓他不敢去想以後。
所以晴也把自己的決心赤裸裸地灑在這片戈壁灘上,讓他清晰地感受著,神情凝重地望著邢武,身影被夕陽拉得頎長,那一刻,他只感覺到一股強大的力量撞進他的心臟。
仿佛藏著排山倒海的光束向他奔騰而來,那麼強烈,那麼堅定。
他的生命中從來沒有出現過這樣一個人,一個不懼天地萬物,不怕世俗捆綁的女孩兒,一個渾身是光讓他看見未來的女孩兒。
一個充滿智慧,勇敢,把命運牢牢攥在手中的女孩兒。
他忽然很怕眼前的這個女孩兒,怕過了這輩子就再也遇不到了。
如果他都敢賭,他又有什麼理由退縮呢?
							——————《耀眼》

JdbcTemplate 是Spring 提供的一個JDBC模板類,是對JDBC的封裝,簡化JDBC代碼,當然,你也可以不用,可以讓Spring集成其它的ORM框架,例如:MyBatis,Hibernate 等。其中JDBC關於資料庫的連接也是一個重要的內容,想要瞭解更多的大家可以移步至:✏️✏️✏️ JDBC_ChinaRainbowSea的博客-CSDN博客

下麵我們正式開始對 JdbcTemplate 上的學習,完成增刪改查。

2. 環境準備

這裡,我們新建一個模塊,方便學習,如下:因為我們這裡是Spring6,而Spring6最低支持的JDK是17,所以我這裡是 JDK17的。

在這裡插入圖片描述
新建好模塊以後,我們需要導入相關的依賴,這裡我們通過 maven 導入依賴。關於Maven 的內容呢,大家可以移步至:✏️✏️✏️Maven_ChinaRainbowSea的博客-CSDN博客 ,進行更多的學習瞭解

具體的依賴有:

  1. spring context 依賴 (spring6 的依賴)
  2. mysql-connector-java(關於MySQL驅動的依賴,因為我們要連接資料庫,這裡我們連接的是MySQL資料庫)
  3. spring-jdbc (spring jdbc,這個依賴中有JdbcTemplate)
  4. junit (Junit4 單元測試依賴)

特殊的還有這個,也得添加上

在這裡插入圖片描述

<repositories>
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

在這裡插入圖片描述

<?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.rainbowsea</groupId>
    <artifactId>spring6-009-jdbc-blog</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>


    <repositories>
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>


    <dependencies>
        <!--        spring context 依賴-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.11</version>
        </dependency>

        <!-- mysql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>

        <!--spring jdbc,這個依賴中有JdbcTemplate-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>6.0.0-M2</version>
        </dependency>

        <!-- junit4 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3. 數據準備

首先,我們創建一個名為 spring6的資料庫,想要瞭解SQL語句的內容的,大家可以移步至✏️✏️✏️ SQL語法學習_ChinaRainbowSea的博客-CSDN博客

/* 判斷該資料庫是否存在,不存在,創建*/
CREATE DATABASE IF NOT EXISTS spring6; 

然後在 spring6 資料庫中創建一個名為 user 的數據表


CREATE TABLE `user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `real_name` varchar(255) ,
  `age` int ,
  PRIMARY KEY (`id`) USING BTREE
) ;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '李四', 33);
INSERT INTO `user` VALUES (2, '李華', 20);
INSERT INTO `user` VALUES (3, '李華', 21);

在這裡插入圖片描述
在這裡插入圖片描述

準備實體類:表user對應的實體類User。根據user 數據表結構創建對於的Bean 實體類。

註意: 這裡我們定義用對應簡單類型的包裝類,來定義成員變數,防止資料庫的數值為Null時,報錯,中斷。

在這裡插入圖片描述

package com.rainbowsea.spring6.bean;


/**
 * user 數據表對應的映射的 bean 對象
 */
public class User {


    // 定義包裝類,作為屬性類型,防止 資料庫中的數值為 null,報錯
    private Integer id;
    private String realName;
    private Integer age;

    public User(Integer id, String realName, Integer age) {
        this.id = id;
        this.realName = realName;
        this.age = age;
    }


    public User() {
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", realName='" + realName + '\'' +
                ", age=" + age +
                '}';
    }
}

配置編寫相關的spring.xml的信息

JdbcTemplate 是Spring 提供好的類,這類的完整類名是:org.springframework.jdbc.core.JdbcTemplate 。這個類上的使用,我們 new 對象就好了,而Spring 可以幫我們 new 對象,所以,我們就將這個new JdbcTemplate 對象這件事交給 Spring 來做。直接將這個類配置到 spring.xml 的配置文件當中,納入 Bean管理即可。

在這裡插入圖片描述

我們來看一下這個JdbcTemplate源碼:

在這裡插入圖片描述
所以這裡,我們只需要配置好 DataSource 數據源,用來連接資料庫即可,將DataSource 屬性進行 set 註入賦值上。可以看到JdbcTemplate中有一個DataSource屬性,這個屬性是數據源,我們都知道連接資料庫需要Connection對象,而生成Connection對象是數據源負責的。所以我們需要給JdbcTemplate設置數據源屬性。
所有的數據源都是要實現javax.sql.DataSource介面的。這個數據源可以自己寫一個,也可以用寫好的,比如:阿裡巴巴的德魯伊連接池,c3p0,dbcp等。我們這裡自己先手寫一個數據源。

自己的數據源,數據源存在的目的是為了提供 Connection 對象;只要實現了DataSource 介面的都是數據源:德魯伊連接池,C3p0連接池,dbcp連接池,都實現了DataSource 介面

如下:

在這裡插入圖片描述
重寫其中的**public Connection getConnection() throws SQLException ** 方法,註意是沒有參數的。

在這裡插入圖片描述

@Override
    public Connection getConnection() throws SQLException {
        try {
            // 註冊驅動
            Class<?> clazz = Class.forName(driver);
            // 獲取資料庫連接對象
            Connection connection = DriverManager.getConnection(url, userName, password);

            System.out.println(connection);
            return connection;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
package com.rainbowsea.spring6.bean;

import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;


/**
 * 自己的數據源,數據源存在的目的是為了提供 Connection 對象
 * 只要實現了DataSource 介面的都是數據源
 * 德魯伊連接池,C3p0連接池,dbcp連接池,都實現了DataSource 介面
 */
public class MyDataSource implements DataSource {


    private String driver;
    private String url;
    private String userName;
    private String password;

    public MyDataSource() {
    }

    public MyDataSource(String driver, String url, String userName, String password) {
        this.driver = driver;
        this.url = url;
        this.userName = userName;
        this.password = password;
    }


    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    @Override
    public String toString() {
        return "MyDataSource{" +
                "driver='" + driver + '\'' +
                ", url='" + url + '\'' +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    @Override
    public Connection getConnection() throws SQLException {
        try {
            // 註冊驅動
            Class<?> clazz = Class.forName(driver);
            // 獲取資料庫連接對象
            Connection connection = DriverManager.getConnection(url, userName, password);

            System.out.println(connection);
            return connection;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {

        return null;

    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }
}

寫完數據源,我們需要把這個數據源傳遞給JdbcTemplate。因為JdbcTemplate中有一個DataSource屬性;同時獲取為該 DataSource 數據源,通過Spring的set 註入,為其中的成員變數賦值。就是連接我們MySQL資料庫的一些信息。如下:

在這裡插入圖片描述

<!--        配置自己寫的數據源-->
<!--        當然,也可以集成其他人或者其他組織開發的數據源,例如:c3p0,dbcp druid-->
        <bean id="dataSource" class="com.rainbowsea.spring6.bean.MyDataSource">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/spring6"></property>
            <property name="userName" value="root"></property>
            <property name="password" value="123"></property>
        </bean>

這時候,我們就可以將這個數據源傳遞給JdbcTemplate。因為JdbcTemplate中有一個DataSource屬性。在這裡插入圖片描述

在這裡插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<!--        配置自己寫的數據源-->
<!--        當然,也可以集成其他人或者其他組織開發的數據源,例如:c3p0,dbcp druid-->
        <bean id="dataSource" class="com.rainbowsea.spring6.bean.MyDataSource">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/spring6"></property>
            <property name="userName" value="root"></property>
            <property name="password" value="123"></property>
        </bean>


    <!--    配置JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

這裡,我們的環境準備好了,數據表也準備好了,下麵就可以開始通過Spring 的JdbcTemplate 操作資料庫了(對資料庫進行增刪改查)的操作了。具體內容如下。

4. 開始

4.1 從數據表中插入(添加)數據

首先,我們通過 Spring 讀取上面我們配置好的spinrg.xml 文件當中的,從而實例化 JdbcTemplate 類對象。

在這裡插入圖片描述
然後使用:jdbcTemplate.update() 的方法,執行SQL語句。

需要註意的是:在Spring當中的JdbcTemplate,對於資料庫上的增刪改,執行SQL語句都是使用update() 的方法處理的。

  1. 第一個參數:String sql

  2. 第二個參數: @Nullable Object... args 是一個可變參數(是一個數組),表示

    表示:SQL語句當中的? 占位符的要填入的值。

在這裡插入圖片描述

返回值:int 表示修改/更新的記錄條數。

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

package com.rainbowsea.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTest {

    @Test
    public void testInsert() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 執行插入操作
        // 註意:insert delete update的sql語句,都是執行update方法。,? 表示占位符
        // 因為 id 是自增的,所以,這裡我們不賦值

        String sql = "insert into user(real_name,age) values(?,?)";
        // 返回修改的記錄條數
        int count = jdbcTemplate.update(sql,  "張三", 30);
        System.out.println("插入的記錄條數:" + count);
    }
}

在這裡插入圖片描述

4.2 從數據表中修改數據

在Spring當中的JdbcTemplate,對於資料庫上的增刪,執行SQL語句都是使用update() 的方法處理的。

我們這裡:將id 為1的,real_name修改為:張小六,age 為 18

在這裡插入圖片描述

package com.rainbowsea.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTest {


    @Test
    public void testUpdate() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 執行插入操作
        // 註意:insert delete update的sql語句,都是執行update方法。,? 表示占位符
        // 執行更新操作
        String sql = "update user2 set real_name = ?, age = ? where id = ?";
        int count = jdbcTemplate.update(sql, "張小六", 18, 1);
        System.out.println(count);
    }
}

在這裡插入圖片描述

4.3 從數據表中刪除數據

在Spring當中的JdbcTemplate,對於資料庫上的增改,執行SQL語句都是使用update() 的方法處理的。

我們這裡:將id 為4的一條記錄刪除了。

在這裡插入圖片描述

package com.rainbowsea.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTest {

    @Test
    public void testDelete() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 執行插入操作
        // 編寫SQL語句,? 表示占位符
        String sql = "delete from user2 where id = ?";
        // 執行更新操作
        // 註意:insert delete update的sql語句,都是執行update方法。
        // 返回修改的記錄條數
        int count = jdbcTemplate.update(sql,  4);
        System.out.println("插入的記錄條數:" + count);
    }
}

在這裡插入圖片描述

4.4 從數據表中查詢一個對象

關於查詢一條記錄,使用 jdbcTemplate.queryForObject() 方法:

在這裡插入圖片描述

  1. 第一個參數:String sql 要執行的SQL語句

  2. 第二個參數:BeanPropertyRowMapper 與對應資料庫表中 bean 類的相映射的類。一般用: new BeanPropertyRowMapper<>(T.class) 這樣的對象裝配上。Bean屬性值和資料庫記錄行的映射對象。在構造方法中指定映射的對象類型。

    在這裡插入圖片描述
    在這裡插入圖片描述

  1. 第三個參數:SQL語句當中的 占位符。可變長參數,給sql語句的占位符問號傳值。

  2. 返回值:運用了泛型,也就是對應資料庫表中在Java當中相對應,映射的 bean 類。

在這裡插入圖片描述
這裡我們查詢一個id為1的,其中的ID,real_name,age 的一條記錄

在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class JdbcTest {

    @Test
    public void testSelectOne() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 執行插入操作
        // 編寫SQL語句,? 表示占位符
        String sql = "select id, real_name, age from user2 where id = ?";
        // 執行更新操作
        // 返回對應查詢到的 Bean 類
        User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
        System.out.println(user);
    }
}

在這裡插入圖片描述

4.5 從數據表中查詢一個值

查詢數據表當中有幾條記錄,對應查詢數據表中的一個值的內容,我們同樣還是使用:jdbcTemplate.queryForObject() 方法來進行。不同的是,這個參數是兩個的,是對應的類對象,

  1. 比如這裡我們查詢的是一個數據表中有幾條記錄,幾條記錄,就是一個值了,一個數值類型的類對象了,可以是 int.class,也可以是 long.class,還可以是 short.class 因為只要是數值類型就可以了。
  2. 返回值是對應類的包裝類,

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class JdbcTest {


    /**
     * 查詢數據表中的一個值
     */
    @Test
    public void testSelectOneValue() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 執行插入操作
        // 編寫SQL語句,? 表示占位符
        // 執行select
        String sql = "select count(1) from user2";
        // 返回對應數據類型的包裝類
        Integer count = jdbcTemplate.queryForObject(sql, int.class);
        System.out.println(count);
    }
}

在這裡插入圖片描述
用 Long.class 也是可以的。

在這裡插入圖片描述

4.6 從數據表中查詢多條記錄

查詢數據表中的多個對象,我們就要使用:jdbcTemplate.query() 方法了

  1. 第一個參數:同樣還是:要執行的SQL語句
  2. 第二個參數:。Bean屬性值和資料庫記錄行的映射對象。在構造方法中指定映射的對象類型。;BeanPropertyRowMapper 與對應資料庫表中 bean 類的相映射的類。一般用: new BeanPropertyRowMapper<>(T.class) 這樣的對象裝配上。
  3. 返回值:是一個List 集合了,因為我們查詢到的多條記錄,自然就是存儲到集合當中去了。

在這裡插入圖片描述
這裡我們查詢,user2 表中的所有用戶的所有信息。

在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class JdbcTest {

    /**
     * 查詢多條記錄
     */
    @Test
    public void testSelectAll() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 執行插入操作
        // 編寫SQL語句,? 表示占位符
        // 執行select
        String sql = "select id, real_name, age from user2";
        List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
        System.out.println(users);

    }
}

在這裡插入圖片描述

4.7 從數據表中批量添加數據

對於數據表中的批量添加數據,我們這裡需要用上:jdbcTemplate.batchUpdate() 方法

  1. 第一個參數:String sql 要執行的SQL語句

  2. 第二個參數: List<Object[]> batchArgs 是一個List集合當中存儲 Object[ ] 數組,註意是數組,這個List 就是,我們批量插入數據時,對於SQL語句當中的 ? 占位符的傳值,因為這個參數是: List<Object[]> batchArgs,所以我們需要將我們 ?占位符的值,放入到List 集合當中,再作為參數,傳給jdbcTemplate.batchUpdate() 方法。

    在這裡插入圖片描述

  1. 返回值:就是你各個批量插入的記錄的,各個成功的記錄條數,比如這裡我們批量添加了3條記錄,那麼如果三條記錄都插入成功了的話,就是[1,1,1]。表示每執行一次這個:"insert into user2(real_name,age) values(?,?)"; SQL語句就會影響到一條記錄。

插入這條記錄,產生了一條記錄的影響。

三條記錄,各自都是只產生了一條記錄的影響

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JdbcTest {


    /**
     * 批量添加數據
     */
    @Test
    public void testAddBatch() {
// 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 批量添加,id 是自增的,這裡可以省略
        String sql = "insert into user2(real_name,age) values(?,?)";

        Object[] objs1 = {"小花", 20};
        Object[] objs2 = {"小明", 21};
        Object[] objs3 = {"小剛", 22};

// 將要修改的數據封裝到 List 集合當中,再作為參數傳入
        List<Object[]> list = new ArrayList<>();
        list.add(objs1);
        list.add(objs2);
        list.add(objs3);

        int[] count = jdbcTemplate.batchUpdate(sql, list);
        System.out.println(Arrays.toString(count));
    }
}

在這裡插入圖片描述

4.8 從數據表中批量修改數據

從數據表中批量修改數據還是使用:jdbcTemplate.batchUpdate() 方法。唯一不同的就是執行的SQL語句不同而已。下麵我們將id 為 5,6,7 的 age 改為 10,11,12

在這裡插入圖片描述

在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JdbcTest {

    /**
     * 批量修改
     */
    @Test
    public void testUpdateBatch() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 批量修改
        String sql = "update user2 set age = ? where id = ?";
        Object[] objs1 = { 10, 5};
        Object[] objs2 = { 11, 6};
        Object[] objs3 = { 12, 7};

        // 將要修改的數據封裝到 List 集合當中,再作為參數傳入
        List<Object[]> list = new ArrayList<>();
        list.add(objs1);
        list.add(objs2);
        list.add(objs3);

        int[] count = jdbcTemplate.batchUpdate(sql, list);
        System.out.println(Arrays.toString(count));
    }
}

在這裡插入圖片描述

4.9 從數據表中批量刪除數據

從數據表中批量刪除數據還是使用:jdbcTemplate.batchUpdate() 方法。唯一不同的就是執行的SQL語句不同而已。下麵我們將user 數據表中的 id 為 5,6,7 的記錄刪除了。

在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JdbcTest {


    /**
     * 批量刪除
     */
    @Test
    public void testDeleteBatch() {
        // 獲取JdbcTemplate對象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);

        // 批量刪除
        String sql = "delete from user2 where id = ?";
        Object[] objs1 = {5};
        Object[] objs2 = {6};
        Object[] objs3 = {7};

        // 將要修改的數據封裝到 List 集合當中,再作為參數傳入
        List<Object[]> list = new ArrayList<>();
        list.add(objs1);
        list.add(objs2);
        list.add(objs3);

        int[] count = jdbcTemplate.batchUpdate(sql, list);
        System.out.println(Arrays.toString(count));
    }
}

在這裡插入圖片描述

4.10 JdbcTemplate 使用回調函數

使用回調函數,可以參與的更加細節:例如:如果你想寫JDBC代碼,可以使用callback回調函數

想要執行回調函數,用使用上 jdbcTemplate.execute() 方法,

在這裡插入圖片描述

  1. 第一個參數是:String sql 要執行的SQL語句
  2. 第二個參數是:PreparedStatementCallback action ,是個介面,我們要傳其實例化對象,

在這裡插入圖片描述
PreparedStatementCallback,一般我們通常是使用 lambda 表達式 ,簡化代碼。

在這裡插入圖片描述
在這裡插入圖片描述
需要註意的是:註冊回調函數,當execute 方法執行的時候,回調函數中的doInPreparedStatement()會被調用

  1. 返回值:就是這裡運用的泛型,返回值,就是你傳的 T.class 的 Bean 對象。

這裡我們使用回調函數,查詢 user 數據表中 id 為 2的 用戶的,id, real_name,age 的記錄信息

在這裡插入圖片描述


import com.rainbowsea.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JdbcTest {


    /**
     * 回調函數
     * 如果你想寫JDBC代碼,可以使用callback回調函數
     */
    @Test
    public void testCallback() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);
        // 準備 sql語句
        String sql = "select id,real_name,age from user2 where id = ?";

        // 註冊回調函數,當execute 方法執行的時候,回調函數中的doInPreparedStatement()會被調用
        User user = jdbcTemplate.execute(sql, new PreparedStatementCallback<User>() {

            @Override
            public User doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
                User user = null;
                // 1 表示第一個占位符,?的下標, 為 2
                ps.setInt(1,2);
                ResultSet resultSet = ps.executeQuery();
                if(resultSet.next()) {
                    int id = resultSet.getInt("id");
                    String realName = resultSet.getString("real_name");
                    int age = resultSet.getInt("age");

                    user = new User(id,realName,age);
                }

                return user;
            }
        });

        System.out.println(user);


    }
}

在這裡插入圖片描述

4.11 JdbcTemplate 配合使用上德魯伊連接池

上面演示的是用我們自己寫的數據源。這裡我們其實也是可以使用別人寫好的。例如比較牛的德魯伊連接池。
第一步:引入德魯伊連接池的依賴。(畢竟是別人寫的,我需要導入,才能使用),使用 maven 導入。

在這裡插入圖片描述

<!--引入德魯伊連接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
        </dependency>

第二步:將德魯伊中的數據源配置到 spring.xml 配置文件中。和配置我們自己寫的一樣。就是一些:對應資料庫的註冊驅動,指明資料庫的所在位置,以及連接資料庫的賬號和密碼。

需要特別註意的是:註意這裡是:driverClassName,是簡單類型進行set註入對屬性賦值,簡單類型可以用 value

在這裡插入圖片描述
在這裡插入圖片描述

而如果是使用:driver,用 ref了

在這裡插入圖片描述
在這裡插入圖片描述

這裡我們用:driverClassName,進行簡單類型的set 註入,對 this.driver 成員變數的屬性賦值。

在這裡插入圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">



    <!--    引入德魯伊連接池-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!--            註意這裡是:driverClassName,,如果是 driver 是 非簡單類型了,是Driver 類型-->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/spring6"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123"></property>
    </bean>
    <!--    配置JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="druidDataSource"></property>
    </bean>

</beans>

下麵,我們測試,使用德魯伊資料庫連接池,進行對資料庫的查詢:

查詢id 為1的一條記錄。

在這裡插入圖片描述
在這裡插入圖片描述
查詢成功。

我們再使用德魯伊進行多個數據的查詢。同樣也是沒有問題的。

在這裡插入圖片描述

5. 總結:

  1. JdbcTemplate 是Spring 提供的一個JDBC模板類,是對JDBC的封裝,簡化JDBC代碼,當然,你也可以不用,可以讓Spring集成其它的ORM框架,例如:MyBatis,Hibernate 等。

  2. 使用JdbcTemplate 需要導入的如下 jar依賴

    1. spring context 依賴 (spring6 的依賴)
    2. mysql-connector-java(關於MySQL驅動的依賴,因為我們要連接資料庫,這裡我們連接的是MySQL資料庫)
    3. spring-jdbc (spring jdbc,這個依賴中有JdbcTemplate)
    4. junit (Junit4 單元測試依賴) 
          
    
  3. 在Spring當中的JdbcTemplate,對於資料庫上的增刪改,執行SQL語句都是使用update() 的方法處理的。

  4. 關於查詢一條記錄,使用 jdbcTemplate.queryForObject() 方法:

  5. 查詢數據表中的多個對象,我們就要使用:jdbcTemplate.query() 方法了

  6. 查詢數據表當中有幾條記錄,對應查詢數據表中的一個值的內容,我們同樣還是使用:jdbcTemplate.queryForObject() 方法來進行。不同的是,這個參數是兩個的,是對應的類對象。需要註意的第二個參數,使用的是:對應返回類型的 T.class 類

  7. 使用回調函數,可以參與的更加細節:例如:如果你想寫JDBC代碼,可以使用callback回調函數

    想要執行回調函數,用使用上 jdbcTemplate.execute() 方法, 需要註意的是:註冊回調函數,當execute 方法執行的時候,回調函數中的doInPreparedStatement()會被調用

  8. 對於數據表中的批量添加刪除修改數據,我們這裡需要用上:jdbcTemplate.batchUpdate() 方法

6. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java Chassis 3通過介面維度負載均衡的策略設置,為不同的應用場景提供了非常強大的負載均衡管理能力,幫助解決負載不均衡、會話粘滯等應用負載問題。 ...
  • 通過本文,我們深入瞭解了 Django 框架的一些基本概念和使用方法,以及如何利用 Django 構建一個簡單的圖像上傳應用程式。從項目創建到環境配置,再到 admin 端圖像處理和用戶圖片上傳,我們逐步學習瞭如何利用 Django 提供的功能快速搭建 Web 應用。無論是對於初學者還是有一定經驗的... ...
  • 運算符與表達式 Created: November 29, 2023 10:38 PM 運算符 運算符 釋義 +、-、*、/ 略 **、//、% 乘方、整除(向下取整至最接近的整數、餘數 <<、>> 指的是二進位左右移 &按位與 按位與是針對二進位數的操作,指將兩個二進位數的每一位都進行比較,如果兩 ...
  • 在現代社會中,機動車已經成為人們生活的重要交通工具。而行駛證作為機動車的身份證明,具有重要的法律效力。然而,對於行駛證上的信息進行手工識別是一項繁瑣的工作,容易出現錯誤,並且耗時較長。為瞭解決這個問題,挖數據平臺提供了行駛證OCR識別Api介面,可以對行駛證上的信息進行快速準確地識別和提取。 這個A ...
  • 大家好,我是 Java陳序員。 問君能有幾多愁,開源項目解千愁! 今天,給大家介紹一個快速開發平臺,完全開源可商用! 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 SmartAdmin —— 一個簡潔、高效、安全的快速開發平臺,以高質 ...
  • 大家好,我是R哥。 金三銀四結束了,上個月分享了一個 35K 入職的面試輔導案例: 35K*14 薪入職了,這公司只要不裁員,我能一直呆下去。。 今天再分享一個上個月讓人很有成就感的面試輔導 case: 外包、空窗四個月、薪資 10k、996 ——> 甲方公司、薪資15k、早九晚六(WLB),從報名 ...
  • 當一個線程被啟動後,如果再次調start()方法,將會拋出IllegalThreadStateException異常。 這是因為Java線程的生命周期只有一次。調用start()方法會導致系統在新線程中運行執行體,但是如果線程已經結束,則不能再次使用,需要重新創建一個新的線程對象並調用start()... ...
  • 正文 昨天玩到了凌晨 3 點,今天睡了一天…… 斷斷續續睡到 12 點起床,下午又從 5 點睡到了 7 點。我願稱之為睡神……. 其它時間就是做工作日一直沒時間做的雜事,比如洗衣服,刷鞋,換洗被套什麼的,還挺花時間。用了得有兩三個小時。 所以昨天說的今天開擺,那是真的開擺了 (笑。 現在晃一下頭,能 ...
一周排行
    -Advertisement-
    Play Games
  • 不廢話,直接代碼 private Stack<Action> actionStack = new Stack<Action>(); private void SetCellValues() { var worksheet = Globals.ThisAddIn.Application.ActiveS ...
  • OpenAPI 規範是用於描述 HTTP API 的標準。該標準允許開發人員定義 API 的形狀,這些 API 可以插入到客戶端生成器、伺服器生成器、測試工具、文檔等中。儘管該標準具有普遍性和普遍性,但 ASP.NET Core 在框架內預設不提供對 OpenAPI 的支持。 當前 ASP.NET ...
  • @DateTimeFormat 和 @JsonFormat 是 Spring 和 Jackson 中用於處理日期時間格式的註解,它們有不同的作用: @DateTimeFormat @DateTimeFormat 是 Spring 框架提供的註解,用於指定字元串如何轉換為日期時間類型,以及如何格式化日 ...
  • 一、背景說明 1.1 效果演示 用python開發的爬蟲採集軟體,可自動抓取抖音評論數據,並且含二級評論! 為什麼有了源碼還開發界面軟體呢?方便不懂編程代碼的小白用戶使用,無需安裝python、無需懂代碼,雙擊打開即用! 軟體界面截圖: 爬取結果截圖: 以上。 1.2 演示視頻 軟體運行演示視頻:見 ...
  • SpringBoot筆記 SpringBoot文檔 官網: https://spring.io/projects/spring-boot 學習文檔: https://docs.spring.io/spring-boot/docs/current/reference/html/ 線上API: http ...
  • 作為後端工程師,多數情況都是給別人提供介面,寫的好不好使你得重視起來。 最近我手頭一些活,需要和外部公司對接,我們需要提供一個介面文檔,這樣可以節省雙方時間、也可以防止後續扯皮。這是就要考驗我的介面是否規範化。 1. 介面名稱清晰、明確 顧名思義,介面是做什麼的,是否準確、清晰?讓使用這一眼就能知道 ...
  • 本文介紹基於Python語言,遍歷文件夾並從中找到文件名稱符合我們需求的多個.txt格式文本文件,並從上述每一個文本文件中,找到我們需要的指定數據,最後得到所有文本文件中我們需要的數據的合集的方法~ ...
  • Java JUC&多線程 基礎完整版 目錄Java JUC&多線程 基礎完整版1、 多線程的第一種啟動方式之繼承Thread類2、多線程的第二種啟動方式之實現Runnable介面3、多線程的第三種實現方式之實現Callable介面4、多線的常用成員方法5、線程的優先順序6、守護線程7、線程的讓出8、線 ...
  • 實時識別關鍵詞是一種能夠將搜索結果提升至新的高度的API介面。它可以幫助我們更有效地分析文本,並提取出關鍵詞,以便進行進一步的處理和分析。 該介面是挖數據平臺提供的,有三種模式:精確模式、全模式和搜索引擎模式。不同的模式在分詞的方式上有所不同,適用於不同的場景。 首先是精確模式。這種模式會儘量將句子 ...
  • 1 為啥要折騰搭建一個專屬圖床? 技術大佬寫博客都用 md 格式,要在多平臺發佈,圖片就得有外鏈 後續如博客遷移,國內博客網站如掘金,簡書,語雀等都做了防盜鏈,圖片無法遷移 2 為啥選擇CloudFlare R2 跳轉:https://dash.cloudflare.com/ 有白嫖額度 免費 CD ...