1. 程式人生 > 實用技巧 >Spring整合JDBC開發

Spring整合JDBC開發

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