Spring JDBC 框架(7)

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 );
    }
}

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