天天看點

SpringBoot從入門到精通(三十)如何使用JdbcTemplate操作資料庫?最後

前面介紹了Mybatis資料持久化架構,Mybatis雖然功能強大,但是,使用起來還是比較複雜的。是以接下來介紹一個簡單的資料持久化架構——JdbcTemplate。

一、什麼是JdbcTemplate

JDBC作為Java通路資料庫的API規範,統一了各種資料庫的通路方式。但是,直接在Java程式中使用JDBC還是非常複雜和繁瑣的。是以Spring對JDBC進行了更深層次的封裝,而JdbcTemplate就是Spring提供的一個操作資料庫的便捷工具。

JdbcTemplate實作了資料庫連接配接的管理,我們可以借助JdbcTemplate來執行所有資料庫操作,例如插入、更新、删除和從資料庫中檢索資料,并且有效避免直接使用JDBC帶來的煩瑣編碼。

Spring Boot作為Spring的集大成者,自然會将JdbcTemplate內建進去。Spring Boot針對JDBC的使用提供了對應的Starter包:spring-boot-starter-jdbc,它其實就是在Spring JDBC上做了進一步的封裝,友善在 Spring Boot 項目中更好地使用JDBC。

1、JdbcTemplate的特點

速度快,相對于ORM架構,JDBC的方式是最快的。

配置簡單,Spring封裝的,除了資料庫連接配接之外,幾乎沒有額外的配置。

使用友善,就像DBUtils工具類,隻需注入JdbcTemplate對象即可。

2、JdbcTemplate的幾種類型的方法

JdbcTemplate雖然簡單,功能卻非常強大。它提供了非常豐富、實用的方法,歸納起來主要有以下幾種類型的方法:

(1)execute方法:可以用于執行任何SQL語句,一般用于執行DDL語句。

(2)update、batchUpdate方法:用于執行新增、修改與删除等語句。

(3)query和queryForXXX方法:用于執行查詢相關的語句。

(4)call方法:用于執行資料庫存儲過程和函數相關的語句。

總的來說,新增、删除與修改三種類型的操作主要使用update和batchUpdate方法來完成。query和queryForObject方法中主要用來完成查詢功能。 execute方法可以用來執行任意的SQL、call方法來調用存儲過程。

二、Spring Boot內建JdbcTemplate

Spring Boot內建JDBC很簡單,需要引入依賴并做基礎配置即可。接下來,我們就以一個具體的例子來學習如何利用Spring的JdbcTemplate進行資料庫操作。

第一步,添加依賴配置

首先,項目pom.xml 配置檔案中增加 JDBC等相關依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>      

上面的示例,在pom.xml檔案中引入spring-boot-starterjdbc依賴。同時,項目中使用 MySQL作為資料庫,是以項目中需要引入MySQL驅動包。spring-boot-starter-jdbc則直接依賴于HikariCP和spring-jdbc。

  • HikariCP是Spring Boot 2.0預設使用的資料庫連接配接池,也是傳說中最快的資料庫連接配接池。
  • spring-jdbc是Spring封裝對JDBC操作的工具包。

第二步,建立資料庫及表結構

首先建立jdbctest測試資料庫,然後再建立student表。包括id、name、sex、age等字段,對應的SQL腳本如下:

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
          `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
          `name` varchar(32) DEFAULT NULL COMMENT '姓名',
          `sex` int DEFAULT NULL,
          `age` int DEFAULT NULL,
          PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;      

第三步,配置資料源

在application.properties配置MYSQL資料庫連接配接相關配置。具體配置如下:

spring.datasource.url=jdbc:mysql://localhost:3306/jdbctest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver      

上面的示例,資料庫連接配接配置非常簡單,包括資料庫連接配接位址、資料庫使用者名、密碼以及資料驅動,無需其他額外配置。在Spring Boot 2.0中,com.mysql.jdbc.Driver已經過期,推薦使用com.mysql.cj.jdbc.Driver。

第四步,使用JdbcTemplate

上面已經就把JdbcTemplate整合到Spring Boot項目中,并建立好資料。接下來建立一個單元測試類JdbcTests,驗證JdbcTemplate操作資料庫。示例代碼如下:

@RunWith(SpringRunner.class)
@SpringBootTest
class JdbcTests {
    @Autowired
    JdbcTemplate jdbcTemplate;
 
    @Test
    void querytest() throws SQLException {
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from student ");
        System.out.println(list.size());
        Assert.assertNotNull(list);
        Assert.assertEquals(1,list.size());
    }
}      

上面是簡單使用JdbcTemplate的測試示例,Spring的JdbcTemplate是自動配置的。使用@Autowired将JdbcTemplate注入到需要的bean中即可直接調用。

運作Run Test或在方法上右鍵|Run ‘querytest’,運作測試方法。運作結果如下圖所示:

SpringBoot從入門到精通(三十)如何使用JdbcTemplate操作資料庫?最後

如上圖所示,單元測試方法queryTest運作成功,并輸出相應的結果。說明JdbcTemplate已經連接配接上資料庫,并成功執行了資料查詢操作。

以上就把JdbcTemplate整合到Spring Boot 項目中了。

三、封裝Repository類

第一步,建立實體類

根據之前建立的Student表結構,建立對應的實體類Student。具體代碼如下:

public class Student {
    private Long id;
    private String name;
    private int sex;
    private int age;
 
    public Student(){
 
    }
    public Student(String name, int sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
 
    //省略get、set方法
}      

需要注意,實體類的資料類型要和資料庫字段一一對應。

第二步,封裝Repository實作增删改查

首先,建立StudentRepository接口并定義常用的增删改查的接口方法,示例代碼如下:

public interface StudentRepository {
    int save(Student student);
    int update(Student student);
    int delete(long id);
    Student findById(long id);
}      

上面的示例,在StudentRepository中定義了save、update、delete、findAll和findById等常用方法。

然後,建立StudentRepositoryImpl類,繼承StudentRepository接口,實作接口中的增删改查等方法,示例代碼如下:

@Repository
public class StudentRepositoryImpl implements StudentRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
}      

上面的示例,在StudentRepositoryImpl類上使用 @Repository 注解用于标注資料通路元件JdbcTemplate,同時在類中注入 JdbcTemplate執行個體。接下來逐個實作對應的增删查改方法。

四、實作資料增删改查

(1)新增

在StudentRepositoryImpl類中實作StudentRepository接口中的save()方法。示例代碼如下:

@Override
public int save(Student student) {
    return jdbcTemplate.update("INSERT INTO Student(name, sex, age) values(?, ?, ?)",
            student.getName(),student.getSex(),student.getAge());
}      

在JdbcTemplate中,除了查詢有幾個API之外,新增、删除與修改統一都使用update來操作,傳入SQL即可。update方法的傳回值就是SQL執行受影響的行數。

(2)修改

更新和新增類似,在StudentRepositoryImpl類中實作StudentRepository接口的update()方法。示例代碼如下:

@Override
public int update(Student student) {
    return jdbcTemplate.update("UPDATE Student SET name = ? , password = ? , age = ?  WHERE id=?", student.getName(),student.getSex(),student.getAge(),student.getId());
}      

(3)删除

通過使用者id删除使用者資訊,在StudentRepositoryImpl類中實作StudentRepository接口的update()方法。示例代碼如下:

@Override
public int delete(long id) {
    return jdbcTemplate.update("DELETE FROM Student where id = ? ",id);
}      

看到這裡大家可能會有疑問:怎麼新增、修改、删除,都調用update方法,這跟其他的架構不一樣?嚴格來說,新增、修改、删除都屬于資料寫入,通過update執行對應的SQL語句,實作對資料庫中資料的變更。

(4)查詢

根據使用者id查詢使用者資訊,同樣在StudentRepositoryImpl類中實作StudentRepository接口的findById ()方法。示例代碼如下:

@Override
public Student findById(long id) {
    return jdbcTemplate.queryForObject("SELECT * FROM Student WHERE id=?", new Object[] { id }, new BeanPropertyRowMapper<Student>(Student.class));
}      

上面的示例,JdbcTemplate執行查詢相關的語句使用query方法及queryForXXX方法。查詢對象使用queryForObject 方法。JdbcTemplate支援将查詢結果轉換為實體對象,使用new BeanPropertyRowMapper<Student>(Student.class)對傳回的資料進行封裝,它通過名稱比對的方式,自動将資料列映射到指定類的實體類中。

在執行查詢操作時,需要有一個RowMapper将查詢出來的列和實體類中的屬性一一對應起來:

l 如果列名和屬性名都是相同的,那麼可以直接使用BeanPropertyRowMapper。

l 如果列名和屬性名不同,就需要開發者自己實作 RowMapper 接口,将資料列與實體類屬性字段映射。

五、如何調用

接下來對封裝好的StudentRepository進行測試,測試StudentRepository中的各個方法是否正确。建立StudentRepositoryTests類,将studentRepository注入到測試類中。

@SpringBootTest
class StudentRepositoryImplTest {
    @Autowired
    private StudentRepository studentRepository;
    @Test
    void save() {
        Student student =new Student("weiz",1,30);
        studentRepository.save(student);
    }
    @Test
    void update() {
        Student student =new Student("weiz",1,18);
        student.setId(1L);
        studentRepository.update(student);
    }
    @Test
    void delete() {
        studentRepository.delete(1L);
    }
    @Test
    void findById() {
        Student student = studentRepository.findById(1L);
        System.out.println("student == " + student.toString());
    }
}      

如上面的測試示例,我們依次執行測試方法,執行成功後會在資料庫檢視資料是否符合預期。測試執行正常,則表明StudentRepository中方法正确。

SpringBoot從入門到精通(三十)如何使用JdbcTemplate操作資料庫?最後

最後

以上,我們就把Spring Boot使用JdbcTemplate的問題介紹完了。

推薦閱讀:

SpringBoot從入門到精通(二十九)使用Redis實作分布式Session共享 SpringBoot從入門到精通(二十八)JPA 的實體映射關系,一對一,一對多,多對多關系映射! SpringBoot從入門到精通(二十七)JPA實作自定義查詢,完全不需要寫SQL! SpringBoot從入門到精通(二十六)超級簡單的資料持久化架構!Spring Data JPA 的使用! SpringBoot從入門到精通(二十五)搞懂自定義系統配置 SpringBoot從入門到精通(二十四)3分鐘搞定Spring Boot 多環境配置! SpringBoot從入門到精通(二十三)Mybatis系列之——實作Mybatis多資料源配置 SpringBoot從入門到精通(二十二)使用Swagger2優雅建構 RESTful API文檔