在Java的Spring框架的程式中使用JDBC API運算元據庫

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

同時與資料庫使用普通的舊JDBC的工作,它變得繁瑣寫不必要的程式碼來處理異常,開啟和關閉資料庫連線等,但Spring的JDBC框架需要的所有低層次細節從開啟連線,準備和執行SQL語句,過程異常,處理事務,最後關閉連線。

所以,你所要做的只是定義連線引數,並指定要執行的SQL語句,並做必要的工作,在每次迭代時從資料庫中獲取資料。

Spring JDBC提供了一些方法和相應不同的類與資料庫進行互動。我要採取經典和最流行的做法,利用JdbcTemplateclass框架。這是管理的所有資料庫的通訊和異常處理中心框架類。

JdbcTemplate 類
JdbcTemplate類執行SQL查詢,更新語句和儲存過程呼叫,在結果集和提取返回引數值進行迭代。它還捕捉JDBC的異常並將其轉換為通用的,資訊更豐富,除了在org.springframework.dao包中定義的層次結構。

JdbcTemplate類的例項是一次配置的執行緒。所以,你可以配置一個JdbcTemplate的一個例項,然後安全地注入這種共享引用到多個DAO。

使用JdbcTemplate類時,通常的做法是配置一個DataSource在Spring配置檔案,然後依賴關係注入該共享資料來源豆到DAO類,JdbcTemplate或者是在setter資料來源建立。

配置資料來源
讓我們一起創造資料庫test資料庫表的 student 。假設使用MySQL資料庫,如果使用其他資料庫,那麼可以相應地改變你的DDL和SQL查詢。


CREATE TABLE Student(
ID  INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
AGE INT NOT NULL,
PRIMARY KEY (ID)
);

現在,我們需要提供一個資料來源給JdbcTemplate類,因此它可以自行配置,以獲得資料庫訪問。您可以配置資料來源的XML檔案中有一段程式碼,如下圖所示:


<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="password"/>
</bean>

資料訪問物件 (DAO)
DAO表示這是通常用於資料庫互動的資料訪問物件。 DAO的存在是為了提供讀取和寫入資料到資料庫中,他們應該通過該應用程式的其餘部分將訪問它們的介面公開此功能的一種手段。

在Spring的資料訪問物件(DAO)的支援使得它很容易與如JDBC,Hibernate,JPA和JDO以一致的方式進行資料訪問技術。

執行SQL語句
讓我們來看看如何使用SQL和的JdbcTemplate物件資料庫中的表執行CRUD(建立,讀取,更新和刪除)操作。

查詢一個整數:


String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );

查詢長整數:


String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );

使用繫結變數的簡單查詢:


String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});

在查詢字串:


String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);

查詢並返回一個物件:


String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(SQL, 
new Object[]{10}, new StudentMapper());
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"));
return student;
}
}

查詢並返回多個物件:


String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(SQL,
new StudentMapper());
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"));
return student;
}
}

插入一行到表:


String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );

更新一行到表:


String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );

從表中刪除行:


String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );

執行DDL語句
您可以使用execute(…)方法的JdbcTemplate來執行任何SQL語句或DDL語句。下面是一個示例使用CREATE語句建立一個表:


String SQL = "CREATE TABLE Student( "  
"ID  INT NOT NULL AUTO_INCREMENT, "  
"NAME VARCHAR(20) NOT NULL, "  
"AGE INT NOT NULL, "  
"PRIMARY KEY (ID));"
jdbcTemplateObject.execute( SQL );

SQL儲存過程
SimpleJdbcCall的類可以用來呼叫帶有IN和OUT引數的儲存過程。你可以使用這種方法,而與任何喜歡的Apache Derby,DB2,MySQL和微軟SQL伺服器,Oracle和Sybase RDBMS中的工作。

其次,考慮以下的MySQL儲存過程這需要學生證和用OUT引數對應的學生的姓名和年齡的回報。因此,讓我們使用MySQL命令提示符下在測試資料庫中建立該儲存過程:


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 ;

現在讓我們寫了Spring JDBC應用程式,將執行我們的學生桌簡單的建立和讀取操作。
來建立一個Spring應用程式:
以下是資料訪問物件介面檔案StudentDAO.java的內容:


package com.yiibai;
import java.util.List;
import javax.sql.DataSource;
public interface StudentDAO {
/** 
* This is the method to be used to initialize
* database resources ie. connection.
*/
public void setDataSource(DataSource ds);
/** 
* This is the method to be used to create
* a record in the Student table.
*/
public void create(String name, Integer age);
/** 
* This is the method to be used to list down
* a record from the Student table corresponding
* to a passed student id.
*/
public Student getStudent(Integer id);
/** 
* This is the method to be used to list down
* all the records from the Student table.
*/
public List<Student> listStudents();
}

以下是Student.java檔案的內容:


package com.yiibai;
public class Student {
private Integer age;
private String name;
private Integer id;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
}

以下是StudentMapper.java檔案的內容:


package com.yiibai;
import java.sql.ResultSet;
import java.sql.SQLException;
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"));
return student;
}
}

下面是實現類檔案StudentJDBCTemplate.java定義DAO介面StudentDAO:


package com.yiibai;
import java.util.Map;
import javax.sql.DataSource;
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;
public class StudentJDBCTemplate implements StudentDAO {
private DataSource dataSource;
private SimpleJdbcCall jdbcCall;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcCall = new SimpleJdbcCall(dataSource).
withProcedureName("getRecord");
}
public void create(String name, Integer age) {
JdbcTemplate jdbcTemplateObject = new JdbcTemplate(dataSource);
String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, name, age);
System.out.println("Created Record Name = "   name   " Age = "   age);
return;
}
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;
}
public List<Student> listStudents() {
String SQL = "select * from Student";
List <Student> students = jdbcTemplateObject.query(SQL, 
new StudentMapper());
return students;
}
}

關於上面的程式幾句話:你寫的呼叫的執行程式碼時,需要建立包含IN引數的一個SqlParameterSource。重要的是要配合提供與儲存過程中宣告的引數名的輸入值的名稱。 execute方法接收傳入的引數,並返回包含任何列在儲存過程中指定的名稱鍵入引數的對映。現在讓我們修改主應用程式檔案MainApp.java,這是如下:


package com.yiibai;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yiibai.StudentJDBCTemplate;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = 
new ClassPathXmlApplicationContext("Beans.xml");
StudentJDBCTemplate studentJDBCTemplate = 
(StudentJDBCTemplate)context.getBean("studentJDBCTemplate");
System.out.println("------Records Creation--------" );
studentJDBCTemplate.create("Zara", 11);
studentJDBCTemplate.create("Nuha", 2);
studentJDBCTemplate.create("Ayan", 15);
System.out.println("------Listing Multiple Records--------" );
List<Student> students = studentJDBCTemplate.listStudents();
for (Student record : students) {
System.out.print("ID : "   record.getId() );
System.out.print(", Name : "   record.getName() );
System.out.println(", Age : "   record.getAge());
}
System.out.println("----Listing Record with ID = 2 -----" );
Student student = studentJDBCTemplate.getStudent(2);
System.out.print("ID : "   student.getId() );
System.out.print(", Name : "   student.getName() );
System.out.println(", Age : "   student.getAge());
}
}

以下是配置檔案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" 
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">
<!-- Initialization for data source -->
<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="password"/>
</bean>
<!-- Definition for studentJDBCTemplate bean -->
<bean id="studentJDBCTemplate" 
class="com.yiibai.StudentJDBCTemplate">
<property name="dataSource" ref="dataSource" />  
</bean>
</beans>

建立原始碼和bean配置檔案完成後,讓我們執行應用程式。如果一切順利,這將列印以下資訊:


------Records Creation--------
Created Record Name = Zara Age = 11
Created Record Name = Nuha Age = 2
Created Record Name = Ayan Age = 15
------Listing Multiple Records--------
ID : 1, Name : Zara, Age : 11
ID : 2, Name : Nuha, Age : 2
ID : 3, Name : Ayan, Age : 15
----Listing Record with ID = 2 -----
ID : 2, Name : Nuha, Age : 2

您可能感興趣的文章:

java jdbc連線mysql資料庫實現增刪改查操作Java使用JDBC連線資料庫的實現方法Java開發Oracle資料庫連線JDBC Thin Driver 的三種方法java使用jdbc連線資料庫工具類和jdbc連線mysql資料示例JAVA使用JDBC技術操作SqlServer資料庫例項程式碼Java 通過JDBC連線Mysql資料庫Java使用JDBC向MySQL資料庫批次插入10W條資料(測試效率)Java使用JDBC驅動連線MySQL資料庫Java中JDBC連線資料庫詳解java 中JDBC連線資料庫程式碼和步驟詳解及例項程式碼Java基於JDBC連線資料庫及顯示資料操作示例

相關文章

程式語言 最新文章