概觀: 大家都知道,Spring框架已成為現代基於Java的應用程序開發的重要組成部分. Spring框架已經有效管理,需要各個部門的控制在Java開發領域. 彈簧的JDBC模板在大多數彈簧的基於JEE應用程序用於與數據庫通信.
在本文中,我將討論如何在使用Spring的JDBC模板來訪問關係數據庫.
介紹: 我們都知道,關係型數據庫在企業應用開發的重要性. 春天是基於Java的企業應用開發中廣泛使用的一種框架. 春有一個像ORM不同的模塊, 安全, 交易, JPS, JMS等支持企業應用開發的需要. 如彈簧提供現成組件來插件, 為企業Java應用程序開發的現代方法使用功能廣泛. 其結果是開發更快,效率. Spring提供了一個簡單的方法來處理數據庫活動,知道如春JDBC模板.
標準的JDBC API的缺點: 標準的JDBC API有以下缺點.
- 除了執行主查詢, 你需要編寫大量的代碼來處理像創建連接執行環境問題, 聲明, 結果集等.
- 需要單獨處理的異常處理代碼.
- 需要處理的事務問題.
春天JDBC模板的優勢: 相比於標準的JDBC的正常做法春天JDBC模板具有以下優點.
- 使用的資源清洗被彈簧JDBC模板自動完成. 因此,開發者不需要操心釋放資源. 因此,它可以防止內存洩漏.
- 彈簧的JDBC模板處理該異常和錯誤在一個更有效的方式. 它的JDBC的SQLException轉換成RuntimeExceptions, 因此,開發人員可以更靈活的方式處理它.
- 春天JDBC模板也將轉換更好有意義的消息供應商的特定錯誤. 因此,這些錯誤的裝卸更有效.
入門:
In this document, 讓我們使用gradle這個作為構建工具來構建我們的應用程序. 讓我們從用來存儲和檢索僱員的細節與他們的部門的組織的沿一個簡單的應用程序. 在我們的例子, 我們將有員工對象的下列屬性:-
- 員工ID
- 僱員的名字
- 員工中間名
- 員工姓
- 僱員部門ID
而該部門的對象具有以下屬性:-
- 部門ID
- 部門名稱
現在讓我們來創建將被用於與數據庫通信的Java對象. 我們的這兩個實體POJO類被列為下:
清單1: 樣本顯示Employee類
[Code]
package com.home.springjdbc.objects;
公眾 類 Employee {
// 僱員ID
私人 串EMPID;
// 員工的名字
私人 串empFName;
// 員工中間名
私人 串empMName;
// 員工姓氏
私人 串empLName;
// 僱員部門ID
私人 串empDeptId;
公眾 Employee ( 串EMPID, 串empFName, 串empMName,
串empLName, 串empDeptId ) {
非常();
這個.的EmpID =的EmpID;
這個.REC錄製名稱=名稱;
這個.empMName = empMName;
這個.empLName = empLName;
這個.empDeptId = empDeptId;
}
/**
* @返回 該EMPID
*/
公眾 串getEmpId () {
return 的EmpID;
}
/**
* @param 的EmpID
* 在EMPID設置
*/
公眾 無效 setEmpId ( 串EMPID ) {
這個.的EmpID =的EmpID;
}
/**
* @返回 該empFName
*/
公眾 串getEmpFName () {
return 拍攝名稱;
}
/**
* @param 拍攝名稱
* 在empFName設置
*/
公眾 無效 setEmpFName ( 串empFName ) {
這個.REC錄製名稱=名稱;
}
/**
* @返回 該empMName
*/
公眾 串getEmpMName () {
return empMName;
}
/**
* @param empMName
* 在empMName設置
*/
公眾 無效 setEmpMName ( 串empMName) {
這個.empMName = empMName;
}
/**
* @返回 該empLName
*/
公眾 串getEmpLName () {
return empLName;
}
/**
* @param empLName
* 在empLName設置
*/
公眾 無效 setEmpLName ( 串empLName) {
這個.empLName = empLName;
}
/**
* @返回 該empDeptId
*/
公眾 串getEmpDeptId () {
return empDeptId;
}
/**
* @param empDeptId
* 在empDeptId設置
*/
公眾 無效 setEmpDeptId ( 串empDeptId ) {
這個.empDeptId = empDeptId;
}
/*
* ( 非-的Javadoc )
*
* @see的java.lang.Object#的toString ()
*/
@覆蓋
公眾 字符串的ToString () {
return “Employee [ 的EmpID =” + 的EmpID + “, 拍攝名稱=” + 拍攝名稱
+ “, empMName =” + empMName + “, empLName =” + empLName
+ “, empDeptId =” + empDeptId + “]”;
}
}
[/Code]
Listing2: 樣本顯示Department類
[Code]
package com.home.springjdbc.objects;
公眾 類 部 {
// 部門ID
私人 串DEPTID;
// 部門名稱
私人 串DEPTNAME;
公眾 部 ( 串DEPTID, 串DEPTNAME) {
非常 ();
這個.DEPTID = DEPTID;
這個.DEPTNAME = DEPTNAME;
}
/**
* @返回 該DEPTID
*/
公眾 串getDeptId () {
return DEPTID;
}
/**
* @param DEPTID
* 在DEPTID設置
*/
公眾 無效 setDeptId ( 串DEPTID ) {
這個.DEPTID = DEPTID;
}
/**
* @返回 的DEPTNAME
*/
公眾 串getDeptName () {
return DEPTNAME;
}
/**
* @param DEPTNAME
* 將DEPTNAME設置
*/
公眾 無效 setDeptName ( 串DEPTNAME ) {
這個.DEPTNAME = DEPTNAME;
}
/*
* (非-的Javadoc)
*
* @see的java.lang.Object#的toString()
*/
@覆蓋
公眾 字符串的ToString () {
return “部 [ DEPTID =” + DEPTID + “, DEPTNAME =” + DEPTNAME + “]”;
}
}
[/Code]
Spring提供了被稱為JdbcTemplate的模板類. 這個類是負責與SQL關係數據庫和JDBC通信. 在傳統方法最大的JDBC代碼處理連接管理被佔用, 資源獲取, 異常處理, 和一般的錯誤檢查這是什麼,我們正在努力實現的情況下不敬. 由JdbcTemplate需要所有這些事情的關懷和作為開發人員,我們應該只專注於業務邏輯. 模板類的一個示例實現顯示為下 -
Listing3: 樣本顯示JDBC模板的實施
[Code]
package com.home.springjdbc.dao;
進口 java.sql.Driver中;
進口 java.sql.ResultSet中;
進口 值java.sql.SQLException;
進口 java.util.List中;
進口 org.springframework.jdbc.core.JdbcTemplate;
進口 org.springframework.jdbc.core.RowMapper;
進口 org.springframework.jdbc.datasource.SimpleDriverDataSource;
進口 com.home.springjdbc.objects.Employee;
公眾 類 EmployeeDAO {
公眾 靜止 無效 主 ( 字符串參數[] ) {
// 簡單DS測試 (不用於生產!)
SimpleDriverDataSource數據源= 新 SimpleDriverDataSource();
dataSource.setDriverClass((類<? 擴展 司機>) org.h2.Driver.類);
dataSource.setUsername( “她的” );
dataSource.setUrl( “JDBC:H2:紀念品” );
dataSource.setPassword( “” );
JdbcTemplate類的JdbcTemplate = 新 的JdbcTemplate(數據源);
系統.出.調用println( “創建表” );
jdbcTemplate.execute( “如果存在,刪除表的員工” );
jdbcTemplate.execute( “創建表的員工(”
+ “ID VARCHAR(25), FIRST_NAME VARCHAR(255), middle_name VARCHAR(255), 姓氏VARCHAR(255), DEPTID VARCHAR(25))”);
串[] 記錄= “E001院長安德魯·羅伯茨D25; E002傑夫朗文院長D42; E003艾琳南希·柯克蘭D66;”.分裂(“;”);
為 ( 串singleRecord : 記錄 ) {
串 [] COLS = singleRecord.split(” “);
系統.出.的printf( ” 添加員工記錄%s的%s%S%s%S n”,COLS[0], COLS[1], COLS[2], COLS[3], COLS[4]);
jdbcTemplate.update(“INSERT INTO員工(ID, 名字, 中間名字, 姓, DEPTID) values(?,?,?,?,?)”,COLS[0], COLS[1], COLS[2], COLS[3], COLS[4]);
}
系統.出.調用println ( ” Querying for customer records where first_name = ‘Erin’:” );
名單<Employee> 結果= jdbcTemplate.query(
“select * 從員工那裡FIRST_NAME = ?”,
新 目的[] { “艾琳” }, 新 的RowMapper<Employee>() {
@覆蓋
公眾 員工mapRow(ResultSet的RS, 詮釋 的rowNum)
投 的SQLException {
return 新 Employee(rs.getString(“ID”),
rs.getString(“名字”), rs.getString(“中間名字”),
rs.getString(“姓”), rs.getString(“DEPTID”));
}
});
為 (員工員工 : 結果) {
系統.出.調用println(僱員);
}
}
}
[/Code]
在上面的例子, 我們設置使用SimpleDriverDataSource從春天JDBC數據源. 然後,我們使用這個數據源來構建的JdbcTemplate. 一旦JdbcTemplate類創建, 我們可以很容易地開始調用數據庫. First, 我們創建使用模板的執行方法表. 然後,我們插入使用模板的更新方法幾條記錄. 最後,我們使用的查詢方法來獲取我們的選擇的記錄. 在我們的例子中,我們使用了一個簡單的查詢從僱員表中提取記錄. 但是,按照我們的設計,我們可以看到,僱員表具有通過柱部門表的關係 - DEPTID. 因此,我們也可以利用相同的代碼來讀取記錄在加入這兩個表. 只是我們需要改變查詢把一個加盟. 上面的代碼可以修改為下 -
Listing4: 樣本顯示修改後的查詢
[Code]
名單<Employee> 結果= jdbcTemplate.query(
“選擇emp.first_name, emp.middle _name, emp.last _name, dept.dept_Name從員工EMP, 部門部門,其中emp.first_name = ?”,
新 目的[] { “艾琳” }, 新 的RowMapper<Employee>() {
@覆蓋
公眾 EmployeeDtls mapRow(ResultSet的RS, 詮釋 的rowNum)
投 的SQLException {
return 新 Employee( rs.getString(“名字”),
rs.getString(“中間名字”),
rs.getString(“姓”),
rs.getString(“中將dept_name “));
}
});
為 (EmployeeDtls employeeDtl : 結果) {
系統.出.調用println(employeeDtl);
}
[/Code]
要執行此,我們應該有另外一個POJO類EmployeeDtls為下 -
Listing5: 樣本顯示POJO類EmployeeDtls
[Code]
package com.home.springjdbc.objects;
公眾 類 EmployeeDtls {
// 員工的名字
私人 串empFName;
// 員工中間名
私人 串empMName;
// 員工姓氏
私人 串empLName;
// 部門名稱
私人 串DEPTNAME;
/**
* @param 拍攝名稱
* @param empMName
* @param empLName
* @param DEPTNAME
*/
公眾 EmployeeDtls(串empFName, 串empMName, 串empLName,
串DEPTNAME) {
非常();
這個.REC錄製名稱=名稱;
這個.empMName = empMName;
這個.empLName = empLName;
這個.DEPTNAME = DEPTNAME;
}
/*
* (非-的Javadoc)
*
* @see的java.lang.Object#的toString()
*/
@覆蓋
公眾 字符串的ToString() {
return “EmployeeDtls [拍攝名稱=” + 拍攝名稱 + “, empMName =” + empMName
+ “, empLName =” + empLName + “, DEPTNAME =” + DEPTNAME + “]”;
}
/**
* @返回 該empFName
*/
公眾 串getEmpFName() {
return 拍攝名稱;
}
/**
* @param 拍攝名稱
* 在empFName設置
*/
公眾 無效 setEmpFName(串empFName) {
這個.REC錄製名稱=名稱;
}
/**
* @返回 該empMName
*/
公眾 串getEmpMName() {
return empMName;
}
/**
* @param empMName
* 在empMName設置
*/
公眾 無效 setEmpMName(串empMName) {
這個.empMName = empMName;
}
/**
* @返回 該empLName
*/
公眾 串getEmpLName() {
return empLName;
}
/**
* @param empLName
* 在empLName設置
*/
公眾 無效 setEmpLName(串empLName) {
這個.empLName = empLName;
}
/**
* @返回 的DEPTNAME
*/
公眾 串getDeptName() {
return DEPTNAME;
}
/**
* @param DEPTNAME
* 將DEPTNAME設置
*/
公眾 無效 setDeptName(串DEPTNAME) {
這個.DEPTNAME = DEPTNAME;
}
}
[/Code]
Summary: 因此,在這篇文章中,我們已經看到了如何春的JDBC模板可在基於Java的標準和企業應用程序中使用. 我們還討論了這種方法的優點,以及它如何使發展與基於JDBC標準的發展快得多.
讓我們總結一下我們在以下要點的形式討論 -
- 春天已成為現代基於Java的企業應用開發環境的重要組成部分.
- Spring有不同的部分, 外面, JDBC的模板是一個重要組成部分.
- 春天JDBC模板,通過採取資源獲取的負荷減輕的發展, 連接管理, 異常處理, 和一般的錯誤檢查. 我們作為一個開發人員只需要專注於複雜的業務場景.