一、概述
使用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語句
- 遍歷查詢結果(如果需要的話)
- 處理每一次遍歷操作
- 處理拋出的任何異常
- 處理事務
- 關閉數據庫連接
只需要配置DataSource就能夠讓JdbcTemplate工作,如下配置:
- <!-- 配置數據源 -->
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/test" />
- <property name="username" value="root" />
- <property name="password" value="christmas258@" />
- </bean>
- <!--配置一個JdbcTemplate實例,並將這個“共享的”,“安全的”實例注入到不同的DAO類中去 -->
- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
- <property name="dataSource" ref="dataSource" />
- </bean>
- @Autowired
- private JdbcTemplate jdbcTemplate;
[java] view plain copy print?
- @Override
- public void insert(Student student) {
- jdbcTemplate.update("INSERT INTO student VALUES('" + student.getId()
- + "', '" + student.getName() + "', '" + student.getAge()
- + "', '" + student.getSex() + "')");
- }
三、使用範例
這裏我們要實例Spring Jdbc和MySQL數據庫連接,建表、執行插入、查找、刪除等功能。
1、新建一個JavaProject工程,導入包mysql-connector-Java-5.1.22-bin.jar+spring3.2+commons-logging-1.2.jar
2、首先先建好數據庫對應的Model
- 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;
- }
- }
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;
}
}
然後還有一個數據庫每一行的封裝
- package com.mucfc.model;
- import java.sql.ResultSet;
- /**
- *封裝數據中的一行
- *作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
- *時間 2015.5.24
- */
- import java.sql.SQLException;
- /**
- * RowMapper可以將數據中的每一行封裝成用戶定義的類
- */
- import org.springframework.jdbc.core.RowMapper;
- public class StudentMapper implements RowMapper<Student>{
- public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
- Student student = new Student();
- student.setId(rs.getInt("id"));
- student.setName(rs.getString("name"));
- student.setAge(rs.getInt("age"));
- student.setSex(rs.getString("sex"));
- return student;
- }
- }
接口類:
- 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);
- }
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);
}
實現類:
- package com.mucfc.dao;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.stereotype.Component;
- import com.mucfc.model.Student;
- import com.mucfc.model.StudentMapper;
- /**
- *DAO實現類
- *作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
- *時間 2015.5.24
- */
- @Component
- public class StudentDaoImpl implements StudentDao {
- @Autowired
- private JdbcTemplate jdbcTemplate;
- @Override
- public void create() {
- System.out.println("執行建表操作");
- jdbcTemplate
- .execute("DROP TABLE IF EXISTS student");
- jdbcTemplate
- .execute("CREATE TABLE student (id int primary key, name varchar(100),age int,sex varchar(2))");
- }
- @Override
- public void insert(Student student) {
- System.out.println("================執行插入操作================");
- jdbcTemplate.update("INSERT INTO student VALUES('" + student.getId()
- + "', '" + student.getName() + "', '" + student.getAge()
- + "', '" + student.getSex() + "')");
- }
- @Override
- public Student getStudent(Integer id) {
- System.out.println("================執行查找單個數據操作================");
- String SQL = "select * from Student where id = ?";
- Student student = jdbcTemplate.queryForObject(SQL,new Object[]{id},new StudentMapper());
- return student;
- }
- @Override
- public List<Student> listStudents() {
- System.out.println("================執行查找全部操作================");
- List rows = jdbcTemplate.queryForList("SELECT * FROM student");
- Iterator it = rows.iterator();
- while(it.hasNext()) {
- Map studentMap = (Map) it.next();
- System.out.print("學生id:"+studentMap.get("id") + "; ");
- System.out.print("學生name:"+studentMap.get("name") + "; ");
- System.out.print("學生age:"+studentMap.get("age") + "; ");
- System.out.println("學生sex:"+studentMap.get("sex"));
- }
- return rows;
- }
- @Override
- public void delete(Integer id) {
- System.out.println("================執行刪除單個數據操作================");
- String SQL = "delete from Student where id = ?";
- jdbcTemplate.update(SQL, id);
- System.out.println("Deleted Record with ID = " + id );
- return;
- }
- @Override
- public void update(Student student) {
- System.out.println("================執行更新單個數據操作================");
- jdbcTemplate.update(
- "UPDATE student SET name = ?,age=?,sex=? WHERE id = ?",
- new Object[] { student.getName(), student.getAge(),
- student.getSex(), student.getId() });
- }
- }
新建一個beans.xml,內容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <!-- 配置數據源 -->
- <bean id="dataSource"
- class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://localhost:3306/test" />
- <property name="username" value="root" />
- <property name="password" value="christmas258@" />
- </bean>
- <!--配置一個JdbcTemplate實例,並將這個“共享的”,“安全的”實例注入到不同的DAO類中去 -->
- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!-- 自動掃描註解的bean -->
- <context:component-scan base-package="com.mucfc.dao" />
- </beans>
- package com.mucfc.service;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.mucfc.dao.StudentDaoImpl;
- import com.mucfc.model.Student;
- public class Test {
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
- StudentDaoImpl studentDaoImpl=(StudentDaoImpl)context.getBean("studentDaoImpl");
- studentDaoImpl.create();
- Student student1=new Student(1,"紅紅",12,"女");
- studentDaoImpl.insert(student1);
- studentDaoImpl.insert(new Student(2,"明明",16,"男"));
- studentDaoImpl.insert(new Student(3,"小王",22,"男"));
- studentDaoImpl.insert(new Student(4,"小劉",15,"男"));
- studentDaoImpl.insert(new Student(5,"張三",23,"男"));
- studentDaoImpl.listStudents();
- System.out.println(studentDaoImpl.getStudent(2));
- studentDaoImpl.update(new Student(2,"大明",15,"男"));
- System.out.println(studentDaoImpl.getStudent(2));
- studentDaoImpl.delete(2);
- studentDaoImpl.listStudents();
- }
- }
學習該節主要是爲了充分理解Spring事務管理的處理流程,在實際開發過程中,與數據庫直接交互的Model層的工作一般都是基於Hibernate或者Mybatis框架來完成,後續我將總結Mybatis的使用方法,這一部分主要是深入瞭解Spring的事務管理。