1.認識 JDBCTemplate 1.瞭解 JDBC 學習使用 JDBCTempIate 之前,我們先來瞭解一下 JDBC( Java DataBase Connectivity )。 它是Java用於連接資料庫的規範,也就是用於執行資料庫SQL語句的Java API。從JDBC的名稱上看,它似乎 ...
1.認識 JDBCTemplate
1.瞭解 JDBC
學習使用 JDBCTempIate 之前,我們先來瞭解一下 JDBC( Java DataBase Connectivity )。 它是Java用於連接資料庫的規範,也就是用於執行資料庫SQL語句的Java API。從JDBC的名稱上看,它似乎沒有指定某種資料庫。可以猜想它可以為多種資料庫提供統一訪問的介面,這更符合程式設計的模式。實際上,它由一組用Java語言編寫的類和介面組成,為大部分關係型資料庫提供訪問介面。
JDBC需要每次進行資料庫連接,然後處理SQL語句、傳值、關閉資料庫。如果都由開發人員編寫代碼,則很容易岀錯,可能會出現使用完成之後,資料庫連接忘記關閉的情況。這容易導致連接被占用而降低性能,為了減少這種可能的錯誤,減少開發人員的工作量,JDBCtemplate就被設計岀來了
2.瞭解 JDBCTemplate
JDBCTemplate=JDBC+Template的組合,是對JDBC的封裝。它更便於程式實現,替我們完成所有的JDBC底層工作。因此,對於資料庫的操作,再不需要每次都進行連接、打開、關閉了。 現在通過JDBCtemplate不需要進行全局修改,就可以輕鬆地應對開發人員常常要面對的增加、 刪除、修改和查詢操作。
JDBC和JDBCtemplate就像是倉庫管理員,負責從倉庫(資料庫)中存取物品。而後者不需 要"每次進入都開門,取完關門”,因為有電動門自動控制。下麵通過具體使用JDBCTemplate的實例來理解它。
實例: 用JDBCTemplate實現數據的增加、刪除、修改和查詢
(1)配置基礎依賴
使用JDBCTemplate,則需要添加其Starter依賴。因為要操作資料庫,所以也需要配置資料庫(以MySQL為例)的連接依賴,見以下代碼:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
添加完依賴後,還需要配置資料庫的連接信息。這樣JDBCTemplate才能正常連接到資料庫。 在application.yml配置文件中配置資料庫的地址和用戶信息,見以下代碼:“配置IP地址、編碼、時區和SSL”
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
username: root
password: 123456
(2)新建實體類
新建一個測試實體類User,實現RowMapper類,重寫mapRow方法,以便實體欄位和數據表欄位映射(對應),映射是指把Java中設置的實體欄位和MySQL資料庫的欄位對應起來,因 為實體的id可以對應資料庫欄位的u_id,也可以對應id、name等。如果不重寫,則程式不知道如 何對應。具體代碼如下:
package com.itheima.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements RowMapper<User> {
private long id;
private String name;
private int age;
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
return user;
}
}
(3)操作數據
JDBCTemplate提供了以下操作數據的3個方法。
- execute:表示“執行”,用於直接執行SQL語句
- update:表示“更新",包括新增、修改、刪除操作。
- query;表示查詢。
下麵使用這3個方法來實現數據的增加、刪除、修改和查詢功能。
1.創建數據表
在使用JDBCTemplate之前,需要在控制器中註入JDBCTemplate,然後就可以通過 "execute"方法執行SQL操作了,見以下代碼:
package com.itheima;
import com.itheima.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserControllerTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void createUserTable() throws Exception {
String sql = "create table `user` (\n" +
"`id` int(10) not null auto_increment,\n" +
"`name` varchar(100) default null,\n" +
"`age` int(10) default null,\n" +
"primary key (`id`)\n" +
")engine=InnoDB auto_increment=1 default charset=utf8;\n" +
"\n";
jdbcTemplate.execute(sql);
}
}
2.添加數據。
添加數據可以通過“update”方法來執行,見以下代碼:
@Test
public void saveUserTest() throws Exception{
String sql = "insert into user (name,age) values('buretuzi','12')";
int rows = jdbcTemplate.update(sql);
System.out.println(rows);
}
3.查詢數據
以下代碼是根據name查詢單個記錄,執行下麵sql字元串里的SQL語句(SELECT * FROM user WHERE USERNAME = ? ),這裡需要通過“query”方法來執行。
@Test
public void getUserByName() throws Exception {
String name = "buretuzi";
String sql = "select * from user where name = ?";
List<User> users = jdbcTemplate.query(sql,new User(),new Object[]{name});
for (User user : users) {
System.out.println(user);
}
}
4.查詢所有記錄
查詢所有記錄和查詢單個記錄一樣,也是執行“query”方法。區別是,SQL語句使用了查詢通配符見以下代碼:
@Test
public void list() throws Exception {
String sql = "select * from user";
List<User> users = jdbcTemplate.query(sql,new BeanPropertyRowMapper(User.class));
for (User user : users) {
System.out.println(user);
}
}
5.修改數據。
要進行數據的修改,可以使用“update”方法來實現,見以下代碼:
@Test
public void updateUserPassword() throws Exception {
Integer id = 1;
String password = "12331313";
String sql = "update user set name = ? where id = ?";
int rows = jdbcTemplate.update(sql,password,id);
System.out.println(rows);
}
6.刪除數據。
這裡刪除數據並不用DELETE方法,而是通過“update”方法來執行SQL語句中的“DELETE” 方法。
@Test
public void deleteUserById() throws Exception {
String sql = "delete from user where id = ?";
int rows = jdbcTemplate.update(sql,1);
System.out.println(rows);
}
至此,已經實現了簡單的增加、刪除、修改和查詢功能。如果讀者對關係型資料庫的SQL語句不陌生,那麼實現起來會非常簡單。因為JDBCTemplate實現起來比ORM煩瑣,所以大部分開發人員使用的是ORM (JPA和MyBatis)。但是JDBCTemplate依然有市場,因為學習成本低, 會一些SQL語句就能上手使用,操作雖然麻煩,但很容易學會。