Spring JDBC 框架
JDBC 框架概述
在使用普通的 JDBC 數據庫時,就會很麻煩的寫不必要的代碼來處理異常,打開和關閉數據庫連接等。但 Spring JDBC 框架負責所有的低層細節,從開始打開連接,準備和執行 SQL 語句,處理異常,處理事務,到最後關閉連接。所以當從數據庫中獲取數據時,你所做的是定義連接參數,指定要執行的 SQL 語句,每次迭代完成所需的工作。Spring JDBC 提供幾種方法和數據庫中相應的不同的類與接口。我將給出使用 JdbcTemplate 類框架的經典和最受歡迎的方法。這是管理所有數據庫通信和異常處理的中央框架類。
JdbcTemplate 類
JdbcTemplate 類執行 SQL 查詢、更新語句和存儲過程調用,執行迭代結果集和提取返回參數值。它也捕獲 JDBC 異常並轉換它們到 org.springframework.dao 包中定義的通用類、更多的信息、異常層次結構。JdbcTemplate 類的實例是線程安全配置的。所以你可以配置 JdbcTemplate 的單個實例,然後將這個共享的引用安全地注入到多個 DAOs 中。使用 JdbcTemplate 類時常見的做法是在你的 Spring 配置文件中配置數據源,然後共享數據源 bean 依賴注入到 DAO 類中,並在數據源的設值函數中創建了 JdbcTemplate。
student.java
Spring JDBC 示例
package ds;
public class student {
Integer id;
String name;
String age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
studentdao.java
package ds;
import javax.sql.DataSource;
import java.util.List;
public interface studentDao {
public void setDataSource(DataSource dataSource);
public void create(String name,Integer age);
public student getStudent(Integer id);
public List<student> students();
public void delete(Integer id);
public void update(Integer id,Integer age);
}
studentjdbcTemplate.java
package ds;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.util.List;
public class studentJdbcTemplate implements studentDao {
private JdbcTemplate jdbcTemplate;
@Override
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public void create(String name, Integer age) {
String sql = "insert into Student (name, age) VALUES(?, ?)";
jdbcTemplate.update(sql,name,age);
System.out.println("Created Record Name = " + name + " Age = " + age);
}
@Override
public student getStudent(Integer id) {
String SQL = "select * from Student where id = ?";
return jdbcTemplate.queryForObject(SQL, new Object[]{id}, new studentMapper());
}
@Override
public List<student> students() {
String SQL = "select * from Student";
return jdbcTemplate.query(SQL, new studentMapper());
}
@Override
public void delete(Integer id) {
String SQL = "delete from Student where id = ?";
jdbcTemplate.update(SQL, id);
System.out.println("Deleted Record with ID = " + id );
}
@Override
public void update(Integer id, Integer age) {
String SQL = "update Student set age = ? where id = ?";
jdbcTemplate.update(SQL, age, id);
System.out.println("Updated Record with ID = " + id );
}
}
studengMapper.java
package ds;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class studentMapper implements RowMapper<student> {
@Override
public student mapRow(ResultSet rs, int rowNum) throws SQLException {
// System.out.println("rowNum"+rowNum);
student student = new student();
student.setAge(rs.getString("age"));
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
return student;
}
}
測試結果
Spring 中 SQL 的存儲過程
SimpleJdbcCall 類可以被用於調用一個包含 IN 和 OUT 參數的存儲過程
表Student
CREATE TABLE Student(
ID INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
PRIMARY KEY (ID)
);
存儲過程
DELIMITER $$
DROP PROCEDURE IF EXISTS `TEST`.`getRecord` $$
CREATE PROCEDURE `TEST`.`getRecord` (
IN in_id INTEGER,
OUT out_name VARCHAR(20),
OUT out_age INTEGER)
BEGIN
SELECT name, age
INTO out_name, out_age
FROM Student where id = in_id;
END $$
DELIMITER ;
studentjdbcTemplate.java
package ds;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
public class studentJdbcTemplate implements studentDao {
private JdbcTemplate jdbcTemplate;
private SimpleJdbcCall jdbcCall;
@Override
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("getRecord");
}
@Override
public void create(String name, Integer age) {
String sql = "insert into Student (name, age) VALUES(?, ?)";
jdbcTemplate.update(sql,name,age);
System.out.println("Created Record Name = " + name + " Age = " + age);
}
@Override
public student getStudent(Integer id) {
SqlParameterSource in = new MapSqlParameterSource().addValue("in_id",id);
Map<String, Object> out = jdbcCall.execute(in);
student student = new student();
student.setId(id);
student.setName((String) out.get("out_name"));
student.setAge((Integer) out.get("out_age"));
return student;
}
@Override
public List<student> students() {
String SQL = "select * from Student";
return jdbcTemplate.query(SQL, new studentMapper());
}
@Override
public void delete(Integer id) {
String SQL = "delete from Student where id = ?";
jdbcTemplate.update(SQL, id);
System.out.println("Deleted Record with ID = " + id );
}
@Override
public void update(Integer id, Integer age) {
String SQL = "update Student set age = ? where id = ?";
jdbcTemplate.update(SQL, age, id);
System.out.println("Updated Record with ID = " + id );
}
}