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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...