Spring JDBC 框架使用JdbcTemplate 類的一個實例
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 }
測試結果: