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這兩個包 連接在這裏:https://www.cnblogs.com/ysource/p/12869779.html
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 }
測試結果: