Spring整合JDBC開發
阿新 • • 發佈:2020-12-26
Spring整合JDBC開發
背景
在JDBC開發中,充斥這大量重複的程式碼,可能只是換了個SQL語句,其他程式碼是完全不用變的。Spring的jar包裡,提供了一個叫JDBCTemplate的模板,在保持操作靈活方便的情況下,將程式碼量降到最低。
配置檔案
首先修改Spring的xml檔案(src目錄下),我這裡採用的是c3p0資料來源,如下圖所示:
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 定義要掃描 controller的包 --> <context:component-scan base-package="cn.com.restapi.controller" /> <context:component-scan base-package="cn.com.restapi.daoimpl"/> <context:component-scan base-package="cn.com.restapi.serviceimpl"/> <!-- 引用配置檔案 --> <context:property-placeholder location="classpath:jdbc.properties"/> <mvc:default-servlet-handler /> <!-- 啟動註解驅動 SpringMVC 功能 --> <mvc:annotation-driven /> <!-- 配置檢視解析器解析路徑 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 定義檢視存放路徑 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 定義檢視字尾 --> <property name="suffix" value=".jsp" /> </bean> <!-- 1、宣告資料來源物件:C3P0連線池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 載入jdbc驅動 --> <property name="driverClass" value="${driverClass}"></property> <!-- jdbc連線地址 --> <property name="jdbcUrl" value="${jdbcUrl}"></property> <!-- 連線資料庫的使用者名稱 --> <property name="user" value="${user}"></property> <!-- 連線資料庫的密碼 --> <property name="password" value="${password}"></property> <!-- 資料庫的初始化連線數 --> <property name="initialPoolSize" value="3"></property> <!-- 資料庫的最大連線數 --> <property name="maxPoolSize" value="10"></property> <!-- 資料庫最多執行的事務 --> <property name="maxStatements" value="100"></property> <!-- 連線數量不夠時每次的增量 --> <property name="acquireIncrement" value="2"></property> </bean> <!-- 建立jdbcTemplate物件 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"> </property> </bean> </beans>
properties檔案(src目錄下)如下圖內容如下圖所示:
然後寫一個JDBCTemplate的類,裡面的方法用於對資料進行增刪改查操作。這裡的JdbcTemplate屬性,Spring容器會根據XML檔案裡的配置進行自動的注入。
package cn.com.restapi.daoimpl; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import cn.com.restapi.dao.EmployeeDao; import cn.com.restapi.model.Employee; @Repository public class EmployeeDaoImpl implements EmployeeDao{ @Autowired private JdbcTemplate jdbcTemplate; private Log log = LogFactory.getLog(EmployeeDaoImpl.class.getName()); @Override public List<Employee> getEmployees() { // TODO Auto-generated method stub String sql = "SELECT EMPLOYEE_ID,EMPLOYEE_NAME,AGE,ADDRESS,SEX FROM EMPLOYEE"; log.info(sql); return jdbcTemplate.query(sql, new EmployeeRowMapper()); } @Override public Employee getEmployeeByID(int id) { // TODO Auto-generated method stub String sql = "SELECT EMPLOYEE_ID,EMPLOYEE_NAME,AGE,ADDRESS,SEX FROM EMPLOYEE WHERE EMPLOYEE_ID = ?"; log.info(sql); List<Employee> employees = this.jdbcTemplate.query(sql, new EmployeeRowMapper(),id); if (employees.isEmpty()) { return null; } return employees.get(0); } @Override public int createEmployee(Employee employee) { // TODO Auto-generated method stub String sql = "INSERT INTO EMPLOYEE(EMPLOYEE_ID,EMPLOYEE_NAME,AGE,ADDRESS,SEX) VALUE(?,?,?,?,?)"; log.info(sql); int rowNum = this.jdbcTemplate.update(sql,employee.getEmployeeID(),employee.getEmployeeName(),employee.getAge(),employee.getAddress(),employee.getSex()); return rowNum; } @Override public int updateEmployee(Employee employee) { // TODO Auto-generated method stub String sql = "UPDATE EMPLOYEE SET EMPLOYEE_NAME = ?,AGE = ?,ADDRESS = ?,SEX = ? WHERE EMPLOYEE_ID = ?"; log.info(sql); int rowNum = this.jdbcTemplate.update(sql,employee.getEmployeeName(),employee.getAge(),employee.getAddress(),employee.getSex(),employee.getEmployeeID()); return rowNum; } @Override public int deleteEmployee(Employee employee) { // TODO Auto-generated method stub String sql = "DELETE EMPLOYEE WHERE EMPLOYEE_ID = ?"; log.info(sql); int rowNum = this.jdbcTemplate.update(sql,employee.getEmployeeID()); return rowNum; } public class EmployeeRowMapper implements RowMapper<Employee>{ @Override public Employee mapRow(ResultSet rSet, int rowNum) throws SQLException { // TODO Auto-generated method stub Employee employee = new Employee(); employee.setEmployeeID(rSet.getInt("EMPLOYEE_ID")); employee.setEmployeeName(rSet.getString("EMPLOYEE_NAME")); employee.setAddress(rSet.getString("ADDRESS")); employee.setAge(rSet.getInt("AGE")); employee.setSex(rSet.getString("SEX")); return employee; } } @Override public boolean ifEmployeeExist(Employee employee) { // TODO Auto-generated method stub Employee employee2 = this.getEmployeeByID(employee.getEmployeeID()); if (employee2 == null) { return true; } return false; } }
只要對JdbcCompany進行依賴注入,就可以呼叫使用了。以下是spring mvcrest服務中實現注入:
@RestController public class CompanyController { @Autowired private JdbcCompany jdbcCompany; @RequestMapping(value="/company",method = RequestMethod.GET) public ResponseEntity<List<Company>> getAllCompany(){ List<Company> companies = new ArrayList<Company>(); companies = jdbcCompany.queryAllCompany(); if (companies.isEmpty()) { return new ResponseEntity<List<Company>>(companies,HttpStatus.NO_CONTENT); } return new ResponseEntity<List<Company>>(companies,HttpStatus.OK); } @RequestMapping(value = "/company/{id}",method = RequestMethod.GET) public ResponseEntity<List<Company>> getCompany(@PathVariable("id") String id){ List<Company> companies = null; companies = jdbcCompany.queryCompany(id); HttpStatus httpStatus = companies != null? HttpStatus.OK:HttpStatus.NOT_FOUND; return new ResponseEntity<List<Company>>(companies,httpStatus); } }