SSM搭建-Spring JDBC管理(10)

一、概述

使用spring進行基本的JDBC訪問數據庫有多種選擇。Spring框架提出了JDBC Template類作爲數據庫的訪問類,該類是Spring框架數據抽象層的基礎,其他高層次的抽象類也都構建與JDBC Template類之上。所以掌握了JDBC Template類,就掌握了Spring JDBC數據庫操作的核心。

Spring至少提供了三種不同的工作模式:Spring JDBC抽象框架core包提供了JDBC模板類,其中JdbcTemplate是core包的核心類,所以其他模板類都是基於它封裝完成的,JDBC模板類是第一種工作模式。三種模式如下:

  • JdbcTemplate:是Spring中最基本的JDBC模板, 利用JDBC和簡單的索引參數查詢對數據庫進行簡單訪問
  • NamedParameterJdbcTemplate:能夠在查詢的時候把值綁定到SQL裏的命名參數,而不是索引參數   NamedParameterJdbcTemplate內部包含了一個JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能幹    NamedParameterJdbcTemplate相對於JdbcTemplate主要增加了參數可以命名的功能。
  •  SimpleJdbcTemplate:利用Java5的特性,比如自動裝箱、通用和可變參數列表來簡化JDBC模板的使用SimpleJdbcTemplate內部包含了一個NamedParameterJdbcTemplate;所以NamedParameterJdbcTemplate能做的事情SimpleJdbcTemplate都能幹,SimpleJdbcTemplate相對於NamedParameterJdbcTemplate主要增加了JDK5.0的泛型和可變長度參數支持。

      下面主要來講 JdbcTemplate:

       JdbcTemplate類通過模板設計模式幫助我們消除了冗長的代碼,只做需要做的事情(即可變部分),並且幫我們做哪些固定部分,如連接的創建及關閉。 JdbcTemplate類對可變部分採用回調接口方式實現,如ConnectionCallback通過回調接口返回給用戶一個連接,從而可以使用該連 接做任何事情、StatementCallback通過回調接口返回給用戶一個Statement,從而可以使用該Statement做任何事情等等,還 有其他一些回調接口如圖所示。


JdbcTemplate支持的回調接口

Spring JDBC抽象框架所帶來的價值將在以下幾個方面得以體現:(注:使用了Spring JDBC抽象框架之後,應用開發人員只需要完成斜體字部分的編碼工作。)

  • 定義數據庫連接參數
  • 打開數據庫連接
  • 聲明SQL語句
  • 預編譯並執行SQL語句
  • 遍歷查詢結果(如果需要的話)
  • 處理每一次遍歷操作
  • 處理拋出的任何異常
  • 處理事務
  • 關閉數據庫連接
Spring將替我們完成所有使用JDBC API進行開發的單調乏味的、底層細節處理工作。

二、使用步驟

1、使用JdbcTemplate來訪問數據
    只需要配置DataSource就能夠讓JdbcTemplate工作,如下配置:

  1. <!-- 配置數據源 -->  
  2. <bean id="dataSource"  
  3.     class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  4.     <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  5.     <property name="url" value="jdbc:mysql://localhost:3306/test" />  
  6.     <property name="username" value="root" />  
  7.     <property name="password" value="christmas258@" />  
  8. </bean>  
  9.   
  10. <!--配置一個JdbcTemplate實例,並將這個“共享的”,“安全的”實例注入到不同的DAO類中去 -->  
  11. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  12.     <property name="dataSource" ref="dataSource" />  
  13. </bean>
2、現在我們可以把JdbcTemplate裝配到DAO,使用它來訪問數據庫

  1. @Autowired  
  2. private JdbcTemplate jdbcTemplate;
3、開始操作數據庫,如下面的插入

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

  1. @Override  
  2. public void insert(Student student) {  
  3.     jdbcTemplate.update("INSERT INTO student VALUES('" + student.getId()  
  4.             + "', '" + student.getName() + "', '" + student.getAge()  
  5.             + "', '" + student.getSex() + "')");  
  6. }

三、使用範例

本文工程下載

這裏我們要實例Spring Jdbc和MySQL數據庫連接,建表、執行插入、查找、刪除等功能。

1、新建一個JavaProject工程,導入包mysql-connector-Java-5.1.22-bin.jar+spring3.2+commons-logging-1.2.jar

2、首先先建好數據庫對應的Model

  1. package com.mucfc.model;  
  2. /**   
  3. *數據庫傳輸類 
  4. *作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)   
  5. *時間 2015.5.24 
  6. */  
  7. public class Student {  
  8.     private int id;  
  9.     private String name;  
  10.     private int age;  
  11.     private String sex;  
  12.     public Student(){  
  13.           
  14.     }  
  15.     public Student(int id,String name,int age,String sex){  
  16.         this.id=id;  
  17.         this.name=name;  
  18.         this.age=age;  
  19.         this.sex=sex;  
  20.     }  
  21.     public int getId() {  
  22.         return id;  
  23.     }  
  24.     public void setId(int id) {  
  25.         this.id = id;  
  26.     }  
  27.     public String getName() {  
  28.         return name;  
  29.     }  
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.     public int getAge() {  
  34.         return age;  
  35.     }  
  36.     public void setAge(int age) {  
  37.         this.age = age;  
  38.     }  
  39.     public String getSex() {  
  40.         return sex;  
  41.     }  
  42.     public void setSex(String sex) {  
  43.         this.sex = sex;  
  44.     }  
  45.   
  46.   
  47. }
package com.mucfc.model;
/**  
*數據庫傳輸類
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)  
*時間 2015.5.24
*/
public class Student {
	private int id;
	private String name;
	private int age;
	private String sex;
	public Student(){
		
	}
	public Student(int id,String name,int age,String sex){
		this.id=id;
		this.name=name;
		this.age=age;
		this.sex=sex;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}


}
然後還有一個數據庫每一行的封裝
  1. package com.mucfc.model;  
  2. import java.sql.ResultSet;  
  3. /**   
  4. *封裝數據中的一行 
  5. *作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)   
  6. *時間 2015.5.24 
  7. */  
  8. import java.sql.SQLException;  
  9. /** 
  10.  * RowMapper可以將數據中的每一行封裝成用戶定義的類 
  11.  */  
  12. import org.springframework.jdbc.core.RowMapper;     
  13. public class StudentMapper implements RowMapper<Student>{  
  14.        public Student mapRow(ResultSet rs, int rowNum) throws SQLException {  
  15.               Student student = new Student();  
  16.               student.setId(rs.getInt("id"));  
  17.               student.setName(rs.getString("name"));  
  18.               student.setAge(rs.getInt("age"));  
  19.               student.setSex(rs.getString("sex"));  
  20.               return student;  
  21.        }  
  22.     }
3、DAO層:

接口類:

  1. package com.mucfc.dao;  
  2. import java.util.List;  
  3. import com.mucfc.model.Student;  
  4. /**   
  5. *DAO接口類 
  6. *作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)   
  7. *時間 2015.5.24 
  8. */  
  9. public interface StudentDao {  
  10.     /** 
  11.      * 創建數據庫表結構 
  12.      * @param sql 
  13.      */  
  14.     public void create();  
  15.     /** 
  16.      * 插入一條學生數據 
  17.      * @param student 
  18.      */  
  19.     public void insert(Student student);  
  20.     /** 
  21.      * 通過主鍵取得對象 
  22.      * @param id 
  23.      * @return student 
  24.      */  
  25.     public Student getStudent(Integer id);  
  26.     /** 
  27.      * 取得表中所有的學生 
  28.      * @param id 
  29.      * @return student 
  30.      */  
  31.     public List<Student> listStudents();  
  32.     /** 
  33.      * 通過主鍵刪除對象 
  34.      * @param id 
  35.      */  
  36.     public void delete(Integer id);  
  37.     /** 
  38.      * 通過主鍵更改對象 
  39.      * @param id 
  40.      */  
  41.     public void update(Student student);  
  42.   
  43. }
package com.mucfc.dao;
import java.util.List;
import com.mucfc.model.Student;
/**  
*DAO接口類
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)  
*時間 2015.5.24
*/
public interface StudentDao {
	/**
	 * 創建數據庫表結構
	 * @param sql
	 */
	public void create();
	/**
	 * 插入一條學生數據
	 * @param student
	 */
	public void insert(Student student);
	/**
	 * 通過主鍵取得對象
	 * @param id
	 * @return student
	 */
	public Student getStudent(Integer id);
	/**
	 * 取得表中所有的學生
	 * @param id
	 * @return student
	 */
	public List<Student> listStudents();
	/**
	 * 通過主鍵刪除對象
	 * @param id
	 */
	public void delete(Integer id);
	/**
	 * 通過主鍵更改對象
	 * @param id
	 */
	public void update(Student student);

}
實現類:
  1. package com.mucfc.dao;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.springframework.beans.factory.annotation.Autowired;  
  8. import org.springframework.jdbc.core.JdbcTemplate;  
  9. import org.springframework.stereotype.Component;  
  10.   
  11. import com.mucfc.model.Student;  
  12. import com.mucfc.model.StudentMapper;  
  13. /**   
  14. *DAO實現類 
  15. *作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)   
  16. *時間 2015.5.24 
  17. */  
  18. @Component  
  19. public class StudentDaoImpl implements StudentDao {  
  20.     @Autowired  
  21.     private JdbcTemplate jdbcTemplate;  
  22.   
  23.     @Override  
  24.     public void create() {  
  25.         System.out.println("執行建表操作");  
  26.         jdbcTemplate  
  27.         .execute("DROP TABLE IF EXISTS  student");  
  28.         jdbcTemplate  
  29.                 .execute("CREATE TABLE student (id int primary key, name varchar(100),age int,sex varchar(2))");  
  30.     }  
  31.   
  32.     @Override  
  33.     public void insert(Student student) {  
  34.         System.out.println("================執行插入操作================");  
  35.         jdbcTemplate.update("INSERT INTO student VALUES('" + student.getId()  
  36.                 + "', '" + student.getName() + "', '" + student.getAge()  
  37.                 + "', '" + student.getSex() + "')");  
  38.     }  
  39.   
  40.     @Override  
  41.     public Student getStudent(Integer id) {  
  42.         System.out.println("================執行查找單個數據操作================");  
  43.         String SQL = "select * from Student where id = ?";  
  44.           Student student = jdbcTemplate.queryForObject(SQL,new Object[]{id},new StudentMapper());  
  45.           return student;  
  46.     }  
  47.   
  48.     @Override  
  49.     public List<Student> listStudents() {  
  50.         System.out.println("================執行查找全部操作================");  
  51.         List rows = jdbcTemplate.queryForList("SELECT * FROM student");    
  52.         Iterator it = rows.iterator();    
  53.         while(it.hasNext()) {    
  54.             Map studentMap = (Map) it.next();    
  55.             System.out.print("學生id:"+studentMap.get("id") + "; ");    
  56.             System.out.print("學生name:"+studentMap.get("name") + "; ");    
  57.             System.out.print("學生age:"+studentMap.get("age") + "; ");    
  58.             System.out.println("學生sex:"+studentMap.get("sex"));    
  59.         }    
  60.         return rows;  
  61.     }  
  62.   
  63.     @Override  
  64.     public void delete(Integer id) {  
  65.         System.out.println("================執行刪除單個數據操作================");  
  66.           String SQL = "delete from Student where id = ?";  
  67.           jdbcTemplate.update(SQL, id);  
  68.           System.out.println("Deleted Record with ID = " + id );  
  69.           return;  
  70.     }  
  71.   
  72.     @Override  
  73.     public void update(Student student) {  
  74.         System.out.println("================執行更新單個數據操作================");  
  75.         jdbcTemplate.update(  
  76.                 "UPDATE student SET name = ?,age=?,sex=? WHERE id = ?",  
  77.                 new Object[] { student.getName(), student.getAge(),  
  78.                         student.getSex(), student.getId() });  
  79.   
  80.     }  
  81.   
  82. }
4、Spring配置

新建一個beans.xml,內容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xsi:schemaLocation="    
  6.            http://www.springframework.org/schema/beans    
  7.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
  8.            http://www.springframework.org/schema/aop    
  9.            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  10.            http://www.springframework.org/schema/context    
  11.            http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  12.     <!-- 配置數據源 -->  
  13.     <bean id="dataSource"  
  14.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  15.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  16.         <property name="url" value="jdbc:mysql://localhost:3306/test" />  
  17.         <property name="username" value="root" />  
  18.         <property name="password" value="christmas258@" />  
  19.     </bean>  
  20.   
  21.     <!--配置一個JdbcTemplate實例,並將這個“共享的”,“安全的”實例注入到不同的DAO類中去 -->  
  22.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  23.         <property name="dataSource" ref="dataSource" />  
  24.     </bean>  
  25.   
  26.     <!-- 自動掃描註解的bean -->  
  27.     <context:component-scan base-package="com.mucfc.dao" />  
  28.   
  29. </beans>
5、測試:
  1. package com.mucfc.service;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. import com.mucfc.dao.StudentDaoImpl;  
  7. import com.mucfc.model.Student;  
  8.   
  9. public class Test {  
  10.   
  11.     public static void main(String[] args) {  
  12.          ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");  
  13.          StudentDaoImpl studentDaoImpl=(StudentDaoImpl)context.getBean("studentDaoImpl");  
  14.          studentDaoImpl.create();  
  15.          Student student1=new Student(1,"紅紅",12,"女");  
  16.          studentDaoImpl.insert(student1);  
  17.          studentDaoImpl.insert(new Student(2,"明明",16,"男"));  
  18.          studentDaoImpl.insert(new Student(3,"小王",22,"男"));  
  19.          studentDaoImpl.insert(new Student(4,"小劉",15,"男"));  
  20.          studentDaoImpl.insert(new Student(5,"張三",23,"男"));    
  21.          studentDaoImpl.listStudents();  
  22.         System.out.println(studentDaoImpl.getStudent(2));   
  23.         studentDaoImpl.update(new Student(2,"大明",15,"男"));  
  24.         System.out.println(studentDaoImpl.getStudent(2));   
  25.         studentDaoImpl.delete(2);  
  26.          studentDaoImpl.listStudents();  
  27.     }  
  28.   
  29. }
輸出結果:

學習該節主要是爲了充分理解Spring事務管理的處理流程,在實際開發過程中,與數據庫直接交互的Model層的工作一般都是基於Hibernate或者Mybatis框架來完成,後續我將總結Mybatis的使用方法,這一部分主要是深入瞭解Spring的事務管理。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章