day14-JdbcTemplate-01

来源:https://www.cnblogs.com/liyuelian/archive/2023/01/30/17077343.html
-Advertisement-
Play Games

JdbcTemplate-01 看一個實際需求: 如果希望使用spring框架做項目,Spring框架如何處理對資料庫的操作呢? 方案一:使用之前的JdbcUtils類 方案二:spring提供了一個操作資料庫(表)的功能強大的類JdbcTemplate。我們可以通過ioc容器來配置一個JdbcTe ...


JdbcTemplate-01

看一個實際需求:

如果希望使用spring框架做項目,Spring框架如何處理對資料庫的操作呢?

  • 方案一:使用之前的JdbcUtils類

  • 方案二:spring提供了一個操作資料庫(表)的功能強大的類JdbcTemplate。我們可以通過ioc容器來配置一個JdbcTemplate對象,使用它來完成對資料庫表的各種操作。

1.基本介紹

JdbcTemplate APIs:下載的文檔-spring-5.3.8-dist\spring-framework-5.3.8\docs\javadoc-api\index.html

  1. 通過Spring可以配置數據源,從而完成對數據表的操作
  2. JdbcTemplate 是 spring 提供的訪問資料庫的技術。可以將 JDBC 的常用操作封裝為模板方法。
image-20230130183802247

2.使用實例

需求說明:使用 Spring 的方式來完成 JdbcTemplate 配置和使用

一、搭建環境:

  1. 引入JdbcTemplate 需要的jar包(Spring5)

    image-20230130182521048
  2. 創建資料庫spring和表monster

-- 創建資料庫
CREATE DATABASE spring;
USE spring;
-- 創建表monster
CREATE TABLE monster(
id INT PRIMARY KEY,
`name` VARCHAR(64) NOT NULL DEFAULT '',
skill VARCHAR(64) NOT NULL DEFAULT ''
)CHARSET=utf8;
INSERT INTO monster VALUES(100,'青牛怪','吐火');
INSERT INTO monster VALUES(200,'黃袍怪','吐煙');
INSERT INTO monster VALUES(300,'蜘蛛怪','吐絲');
image-20230130184434097

二、配置DataSource

  1. 創建配置文件src/jdbc.properties(key值隨意)

在spring的ioc容器中,可以通過屬性文件給bean註入值

jdbc.user=root
jdbc.pwd=123456
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
  1. 創建容器配置文件src/JdbcTemplate_ioc.xml
<!--引入外部的屬性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置數據源對象-DataSource-->
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
    <!--給數據源對象配置屬性值-->
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.pwd}"/>
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
</bean>
  1. 測試連接
@Test
public void testDatasourceByJdbcTemplate() throws SQLException {
    //獲取容器
    ApplicationContext ioc = 
        new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //因為 ComboPooledDataSource實現了 DataSource介面,這裡使用介面類型來獲取對象
    DataSource dataSource = ioc.getBean(DataSource.class);
    Connection connection = dataSource.getConnection();
    System.out.println("獲取到連接connection=" + connection);
    connection.close();
}

成功連接:

image-20230130194736188
  1. 配置 JdbcTemplate_ioc.xml,將數據源分配給 JdbcTemplate bean對象
<!--配置JdbcTemplate對象-->
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
    <!--給JdbcTemplate對象配置DataSource屬性-->
    <property name="dataSource" ref="dataSource"/>
</bean>

2.1添加數據

@Test
public void addDataByJdbcTemplate() {
    //獲取容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //獲取JdbcTemplate對象
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);
    
    //1.添加方式
    String sql = "insert into monster values(400,'紅孩兒','風火輪')";
    jdbcTemplate.execute(sql);
    
    //2.添加方式 2(推薦)
    String sql2 = "insert into monster values(?,?,?)";
    //返回的 int類型 表示執行後表受影響的記錄數
    int affected = jdbcTemplate.update(sql2, 500, "牛魔王", "芭蕉扇");
    System.out.println("add ok affected = " + affected);
}

添加成功:

image-20230130200640803 image-20230130201116969

2.2修改數據

//測試通過JdbcTemplate對象完成修改數據
@Test
public void updateDataByJdbcTemplate() {
    //獲取容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    
    //獲取JdbcTemplate對象
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);
    
    String sql = "update monster set skill=? where id=?";
    int affected = jdbcTemplate.update(sql, "美人計", 300);
    System.out.println("update is ok, affected = " + affected);
}

修改成功:

image-20230130201656523 image-20230130201723618

2.3批量處理

對於某個類,如果有很多API,使用的步驟:

1.先確定API名字 2.根據API提供的參數,組織參數 3.根據API可以推測類似的用法和功能

//批量添加兩個 monster
@Test
public void addBatchDataByJdbcTemplate() {
    //獲取容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");

    //獲取JdbcTemplate對象
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);

    //1.準備參數
    String sql = "insert into monster values(?,?,?)";
    List<Object[]> batchArgs = new ArrayList<>();
    batchArgs.add(new Object[]{600, "白蛇", "翻江倒海"});
    batchArgs.add(new Object[]{700, "青蛇", "竹葉青"});

    //2.調用
    //int[] batchUpdate(String sql, List<Object[]> batchArgs);
    //說明:返回結果為int數組,每個元素對應上面的sql語句對錶的影響記錄數
    int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);

    //輸出
    for (int anInt : ints) {
        System.out.println("anInt=" + anInt);
    }
    System.out.println("batch add is ok..");
}

批處理結果:

image-20230130203736793 image-20230130203812283

2.4查詢

實體類 Monster.java

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 * Javabean / Entity
 */
public class Monster {
    private Integer monsterId;
    private String name;
    private String skill;

    //無參構造器一定要有,spring底層反射創建對象時需要使用
    public Monster() {
    }

    //全參構造器
    public Monster(Integer monsterId, String name, String skill) {
        this.monsterId = monsterId;
        this.name = name;
        this.skill = skill;
    }

    public Integer getMonsterId() {
        return monsterId;
    }

    public void setMonsterId(Integer monsterId) {
        this.monsterId = monsterId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "monsterId=" + monsterId +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

2.4.1查詢單行多列

查詢 id=500 的 monster 並封裝到 Monster 實體對象

//查詢 id=100的 monster並封裝到 Monster實體對象
@Test
public void selectDataByJdbcTemplate() {
    //獲取容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //獲取JdbcTemplate對象
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);

    //1.確定API
    //<T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)
    
    //2.準備參數
    //註意:封裝對象時,如果查詢返回的欄位名和實體對象的屬性名不一致會出現問題,最好使用別名!
    String sql = "SELECT id AS monsterId , NAME, skill FROM monster WHERE id=?";
    //使用RowMapper介面來對返回的數據,進行一個封裝(底層是反射->setter)
    RowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class);
    
    //3.調用
    Monster monster = jdbcTemplate.queryForObject(sql, rowMapper, 500);
    System.out.println("monster=" + monster);
}

查詢結果:

image-20230130210708174

2.4.2查詢多行多列

查詢 id>=200 的 monster,並封裝到 Monster 實體對象

//查詢 id>=200的 monster並封裝到 Monster實體對象
@Test
public void selectMulDataByJdbcTemplate() {
    //獲取容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //獲取JdbcTemplate對象
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);

    //1.確定API
    //public <T> T query(String sql, ResultSetExtractor<T> rse, @Nullable Object... args)
    //2.組織參數
    String sql = "SELECT id AS monsterId , NAME, skill FROM monster WHERE id>= ?";
    BeanPropertyRowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class);

    List<Monster> query = jdbcTemplate.query(sql, rowMapper, 200);
    for (Monster monster : query) {
        System.out.println("monster=" + monster);
    }
}

查詢結果:

image-20230130211933967

2.4.3查詢單行單列

查詢返回結果只有單行單列的值,比如查詢表中的總記錄數,或者查詢 id=200 的 name 欄位的值

//查詢 id>=200的 monster並封裝到 Monster實體對象
@Test
public void selectScalarByJdbcTemplate() {
    //獲取容器
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("JdbcTemplate_ioc.xml");
    //獲取JdbcTemplate對象
    JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);

    //1.確定API
    // public <T> T queryForObject(String sql, Class<T> requiredType, @Nullable Object... args)
    //requiredType 表示返回的單行單列的 值的 數據類型

    //2.組織參數
    String sql = "SELECT NAME FROM monster WHERE id=?";
    String sql2 = "SELECT COUNT(*) FROM monster";
    //3.調用
    String name = jdbcTemplate.queryForObject(sql, String.class, 200);
    Integer count = jdbcTemplate.queryForObject(sql2, Integer.class);
    System.out.println("id=200 的 name = " + name);
    System.out.println("monster表的總記錄數 = " + count);
}

查詢結果:

image-20230130213520356

2.5具名參數

  • 在 JDBC用法中,SQL參數是用占位符 ? 表示,並且受到位置的限制。

    定位參數的問題在於,一旦參數的位置發生變化,必須改變參數的綁定,在Spring JDBC中,綁定SQL參數的另一種選擇是使用具名參數 (named parameter),SQL具名參數是按照名稱綁定,而不是位置綁定。

  • 什麼是具名參數?

    具名參數:SQL 按名稱(以冒號開頭)而不是按位置進行指定。具名參數更易於維護, 也提升了可讀性。具名參數由框架類在運行時用占位符取代。


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

-Advertisement-
Play Games
更多相關文章
  • 後端應用分層是什麼,例如:你用Spring MVC開發web程式、項目用三層架構分包,這些都用了分層思想。 MVC模式包含了三部分: 視圖(view):負責界面顯示、處理用戶交互。如:前端應用 控制器(controller):協調視圖層與模型層之間的相互工作。控制器接收視圖層發來的請求,決定用那些模 ...
  • 設計原則 23種設計模式滿足並實現了設計原則中的一個或者多個,從而達到了代碼復用、增加可維護性的目的。 開閉原則(Open+Closed+Principle,OCP) 里氏代換原則(Liskov+Substitution+Principle,LSP) 依賴倒轉原則(Dependency+Invers ...
  • CQRS只是一種非常簡單的模式(pattern),CQRS本身並不是一種架構風格,和最終一致性/消息/讀寫分離/事件溯源/DDD等沒有必然的聯繫,它最大優勢是給我們帶來更多的架構屬性選擇 ...
  • 什麼是RabbitMQ? RabbitMQ是一款開源的,Erlang編寫的,基於AMQP協議的消息中間件 為什麼使用MQ?MQ的優點 非同步處理 - 相比於傳統的串列、並行方式,提高了系統的吞吐量。 應用解耦 - 系統間通過消息通信,不用關心其他系統的處理。 流量削鋒 - 可以通過消息隊列長度控制請求 ...
  • 洛谷oj題單【入門1】順序結構-入門難度(Java) 來源:https://www.luogu.com.cn/training/100#problems B2002 Hello,World! public class Main { public static void main(String[] a ...
  • 簡介 Quarkus是類似於Spring Boot的框架,可以方便大家進行Java開發。利用GraalVM的魔力,能更好的適應雲原生的場景,極快的啟動速度。 創建項目 在IDEA就直接有創建Quarkus項目的初始化工具,直接根據自己需要填好即可,非常方便: 選擇自己需要的一些組件和依賴,我這裡只選 ...
  • 創建項目 1.先創建空項目Empty project 2.再創建模板Module 3.設置項目結構 4.創建Java class 5.創建包 一、註釋 註釋顏色設置 Java中的註釋有三種: 1.單行註釋 //(雙斜杠開頭) 2.多行註釋 /* 註釋*/ 3.文檔註釋 /** * */ 二、標識符和 ...
  • 本文已收錄至Github,推薦閱讀 👉 Java隨想錄 微信公眾號:Java隨想錄 CSDN: 碼農BookSea 不知道自己的無知,乃是雙倍的無知。——柏拉圖 跨代引用問題 跨代引用是指新生代中存在對老年代對象的引用,或者老年代中存在對新生代的引用。 假如要現在進行一次只局限於新生代區域內的收集 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...