JDBC 架構概述
在使用普通的 JDBC 資料庫時,就會很麻煩的寫不必要的代碼來處理異常,打開和關閉資料庫連接配接等。但 Spring JDBC 架構負責所有的低層細節,從開始打開連接配接,準備和執行 SQL 語句,處理異常,處理事務,到最後關閉連接配接。
是以當從資料庫中擷取資料時,你所做的是定義連接配接參數,指定要執行的 SQL 語句,每次疊代完成所需的工作。
Spring JDBC 提供幾種方法和資料庫中相應的不同的類與接口。我将給出使用 JdbcTemplate 類架構的經典和最受歡迎的方法。這是管理所有資料庫通信和異常處理的中間架構類。
JdbcTemplate 類
JdbcTemplate 類執行 SQL 查詢、更新語句和存儲過程調用,執行疊代結果集和提取傳回參數值。它也捕獲 JDBC 異常并轉換它們到 org.springframework.dao 包中定義的通用類、更多的資訊、異常層次結構。
JdbcTemplate 類的執行個體是線程安全配置的。是以你可以配置 JdbcTemplate 的單個執行個體,然後将這個共享的引用安全地注入到多個 DAOs 中。
使用 JdbcTemplate 類時常見的做法是在你的 Spring 配置檔案中配置資料源,然後共享資料源 bean 依賴注入到 DAO 類中,并在資料源的設值函數中建立了 JdbcTemplate。
環境:導入: mysql-connector-java.jar,org.springframework.jdbc.jar這兩個包
1.建立資料通路對象接口檔案 StudentDAO.java 的内容:
1 package com.spring.jdbcTemplate;
2
3 import java.util.List;
4
5 import javax.sql.DataSource;
6 /**
7 * 接口StudentDao,是用來封裝查詢方法
8 * @author Administrator
9 *
10 */
11
12 public interface StudentDao {
13
14 public void setDataSource(DataSource ds);
15 //添加記錄
16 public void addStudent(String name,Integer age);
17 //通過Student ID查詢學生記錄,傳回值為Student類型
18 public Student getStudentId(Integer id);
19 //删除資料通過Student ID
20 public void delectStudent(Integer id);
21 //更新資料
22 public void updata(Integer id,Integer age);
23 //查詢所有資料
24 public List<Student> SelectAllStudent();
25 }
2.建立一個實體類Student:
1 package com.spring.jdbcTemplate;
2
3 public class Student {
4 /**
5 * 定義學生類
6 */
7 private String name;
8 private Integer age;
9 private Integer id;
10
11 public Integer getId() {
12 return id;
13 }
14
15 public void setId(Integer id) {
16 this.id = id;
17 }
18
19 public String getName() {
20 return name;
21 }
22
23 public void setName(String name) {
24 this.name = name;
25 }
26
27 public Integer getAge() {
28 return age;
29 }
30
31 public void setAge(Integer age) {
32 this.age = age;
33 }
34
35 public void printAdvice() {
36 System.out.println("name:" + name + ",age:" + age);
37
38 }
39
40 }
3.建立一個StudentMapper.java 檔案,用來映射結果集(通常用于查詢語句~)内容如下:
1 package com.spring.jdbcTemplate;
2
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5
6 import org.springframework.jdbc.core.RowMapper;
7
8 public class StudentMapper implements RowMapper<Student>{
9 /**
10 * 接口RowMapper被JdbcTemplate 用來映射每一行結果集的資料
11 * JdbcTemplate 用來執行query方法或者調用存儲過程 包含方法mapRow(ResultSet rs, int rowNum)
12 * 第一個參數表示擷取到的結果集、第二個表示結果集中擷取到的結果個數,通常用于查詢語句~
13 */
14 @Override
15 public Student mapRow(ResultSet rs, int row) throws SQLException {
16 Student student=new Student();
17 student.setId(rs.getInt("id"));
18 student.setName(rs.getString("name"));
19 student.setAge(rs.getInt("age"));
20 return student;
21 }
22
23 }
4.下面是為定義的 DAO 接口 StudentDAO 的實作類檔案 StudentJDBCTemplate.java,具體實作到資料庫的操作:
1 package com.spring.jdbcTemplate;
2
3 import java.util.List;
4
5 import javax.sql.DataSource;
6
7 import org.springframework.jdbc.core.JdbcTemplate;
8 /**
9 * 利用Spring 内置jdbc JdbcTemplate來實作StudentDao接口,連接配接資料庫。
10 * @author Administrator
11 *
12 */
13 public class StudentJdbcTemplate implements StudentDao {
14 private DataSource dataSource;
15 private JdbcTemplate jdbcTemplateObject;
16
17 // 設定資料源
18 @Override
19 public void setDataSource(DataSource dataSource) {
20 this.dataSource = dataSource;
21 this.jdbcTemplateObject = new JdbcTemplate(dataSource);
22 }
23
24 // 添加學生資料
25 @Override
26 public void addStudent(String name, Integer age) {
27 String sql = "insert into Student(name,age) value(?,?)";
28 jdbcTemplateObject.update(sql, name, age);
29 System.out.println("Created Record Name = " + name + " Age = " + age);
30 return;
31 }
32
33 // 查詢學生
34 @Override
35 public Student getStudentId(Integer id) {
36 String sql = "select * from Student where id=?";
37 Student student = jdbcTemplateObject.queryForObject(sql, new Object[] { id }, new StudentMapper());
38 return student;
39 }
40
41 // 删除學生記錄
42 @Override
43 public void delectStudent(Integer id) {
44 String sql = "delete from Student where id=?";
45 jdbcTemplateObject.update(sql, id);
46 System.out.println("Deleted Record with ID = " + id);
47 return;
48 }
49 //更新資料
50 @Override
51 public void updata(Integer id,Integer age) {
52 String SQL = "update Student set age = ? where id = ?";
53 jdbcTemplateObject.update(SQL, age, id);
54 System.out.println("Updated Record with ID = " + id);
55 return;
56 }
57 //查詢所有資料
58 @Override
59 public List<Student> SelectAllStudent() {
60 String SQL = "select * from Student";
61 List<Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
62 return students;
63 }
64
65
66 }
5.建立一個 MainApp.java 檔案,用于測試。内容如下:
1 package com.spring.jdbcTemplate;
2
3 import java.util.List;
4
5 import org.springframework.context.support.ClassPathXmlApplicationContext;
6 import org.springframework.jdbc.core.JdbcTemplate;
7
8 public class MainApp {
9
10 public static void main(String[] args) {
11 ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring_xml/bean.xml");
12 //擷取getBean("StudentJdbcTemplate")對象,調用其方法操作資料庫
13 StudentJdbcTemplate jdbcTemplate = (StudentJdbcTemplate)applicationContext.getBean("StudentJdbcTemplate");
14
15 //插入資料
16 /* jdbcTemplate.addStudent("張三", 23);
17 jdbcTemplate.addStudent("李四", 24);
18 jdbcTemplate.addStudent("王五", 25);
19 jdbcTemplate.addStudent("趙六", 26);
20 jdbcTemplate.addStudent("田七", 27);*/
21
22 //查詢所有資料
23 /* List<Student> list=jdbcTemplate.SelectAllStudent();
24 for(Student student:list){
25 System.out.println(student.getId()+student.getName()+student.getAge());
26 }*/
27 //查詢單條記錄
28 /* Student student=jdbcTemplate.getStudentId(1);
29 System.out.println(student.getId()+student.getName()+student.getAge());*/
30
31 //删除單條記錄
32 /*jdbcTemplate.delectStudent(2);*/
33
34 //更新資料
35 jdbcTemplate.updata(3, 45);
36 }
37
38 }
測試結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM9AnYldnJwAzN9c3Pn5GcuQ0MlQ0MlcnW1JkbMpXVU5EerRkTxMGVPhHMT9UNNpWT5FFVNJTRU1EeVRUT3lERNlHMT10dZRVTzUFVNZXVE10dJRUT5hzUNdXWU10MVRVT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)