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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...