前面介紹了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’,運作測試方法。運作結果如下圖所示:

如上圖所示,單元測試方法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中方法正确。
最後
以上,我們就把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文檔