1. 程式人生 > >Spring整合jdbc及其crud操作即增刪改查

Spring整合jdbc及其crud操作即增刪改查

1.工程的座標依賴

<dependency>   
  <groupId>junit</groupId>  
     <artifactId>junit</artifactId>     
     <version>4.12</version> 
        <scope>test</scope> 
        </dependency> 
<!-- spring 測試環境 --> 
<dependency>   
  <groupId>org.springframework</groupId>   
    <artifactId>spring-test</artifactId>     <version>4.3.2.RELEASE</version>   
      <scope>test</scope> 
      </dependency> 
 
 
<!-- spring 框架座標依賴新增 -->
 <dependency>     
 <groupId>org.springframework</groupId>  
    <artifactId>spring-context</artifactId>     <version>4.3.2.RELEASE</version> 
    </dependency> 
 
<!-- aop --> 
<dependency>    
 <groupId>org.aspectj</groupId>     <artifactId>aspectjweaver</artifactId>     <version>1.8.9</version> 
 </dependency> 
<!-- mysql 驅動包 --> 
<dependency>    
 <groupId>mysql</groupId>     
 <artifactId>mysql-connector-java</artifactId>     <version>5.1.39</version> 
 </dependency> 

<!-- c3p0 連線池 --> 
<dependency> 
    <groupId>c3p0</groupId>  
       <artifactId>c3p0</artifactId>    
        <version>0.9.1.2</version> 
     </dependency> 
 
<!-- spring jdbc --> 
<dependency>   
  <groupId>org.springframework</groupId>   
    <artifactId>spring-jdbc</artifactId>     <version>4.3.2.RELEASE</version> 
    </dependency> 
 
<!-- spring 事物 --> 
<dependency> 
    <groupId>org.springframework</groupId>     <artifactId>spring-tx</artifactId>     <version>4.3.2.RELEASE</version> 
   </dependency

建立db.propertie

jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/spring_jdbc?useUnicode=true&characterEncoding=utf8 
jdbc.user=root jdbc.password=root 
 

可選配置

initialPoolSize=20   
maxPoolSize=100   
minPoolSize=10   
maxIdleTime=600
acquireIncrement=5   
maxStatements=5   
idleConnectionTestPeriod=60 

建立spring—db.xml

<!-- 載入 properties 配置檔案 -->
 <context:property-placeholder location="db.properties" /> 

配置資料來源,選擇c3p0

<!-- 配置 c3p0 資料來源 -->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">     <property name="driverClass" value="${driver}"></property>     <property name="jdbcUrl" value="${url}"></property>     <property name="user" value="${user}"></property>     <property name="password" value="${password}"></property> </bean> 

C3P0 其他額外配置(對應的值在 db.properties 檔案中指定)

<!-- 指定連線池中保留的最大連線數. Default:15-->   
<property name="maxPoolSize" value="${maxPoolSize}"/> 
  <!-- 指定連線池中保留的最小連線數-->
   <property name="minPoolSize" value="${minPoolSize}"/>  
    <!-- 指定連線池的初始化連線數  取值應在 minPoolSize 與 maxPoolSize 之間.Default:3-->  
     <property name="initialPoolSize" value="${initialPoolSize}"/>   <!-- 最大空閒時間,60 秒內未使用則連線被丟棄。若為 0 則永不丟棄。 Default:0-->   
     <property name="maxIdleTime" value="${maxIdleTime}"/>   <!-- 當連線池中的連線耗盡的時候 c3p0 一次同時獲取的連線數. Default:3--> 
       <property name="acquireIncrement" value="${acquireIncrement}"/>   
       <!-- JDBC 的標準,用以控制資料來源內載入的 PreparedStatements 數量。   但由於預快取的 statements 屬於單個 connection 而不是整個連線池所以設定這個引數需 要考慮到多方面的因數.如果 maxStatements 與 maxStatementsPerConnection 均為 0,則緩 存被關閉。Default:0-->   
<property name="maxStatements" value="${maxStatements}"/>   <!-- 每 60 秒檢查所有連線池中的空閒連線.Default:0 -->   <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/> 

dbcp 資料來源配置

<!-- 配置 dbcp 資料來源--> 
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource"> 
     <property name="driverClassName" value="${driver}" /> 
     <property name="url" value="${url}"/> 
     <property name="username" value="${user}"/> 
     <property name="password" value="${password}"/> 
     <!-- 連線池啟動時的初始值 -->   
     <property name="initialSize" value="1"/>   
     <!-- 最大空閒值.當經過一個高峰時間後,連線池可以慢慢將已經用不到的連線慢慢
釋放一部分,一直減少到 maxIdle 為止 -->   
     <property name="maxIdle" value="2"/>   
     <!-- 最小空閒值.當空閒的連線數少於閥值時,連線池就會預申請一些連線,以避免洪峰來時再申請而造成的效能開銷 -->   
 <property name="minIdle" value="1"/>   
</bean>

Spring把JDBC中重複的操作建立成了一個模板類,org.springframework.jdbc.core.JdbcTemplate ,配置檔案中加入

<!-- jdbcTemplate 配置 -->   
  <bean id="jdbcTemplate"
  class="org.springframework.jdbc.core.JdbcTemplate">         <property name="dataSource" ref="dataSource"></property>         </bean>

建立資料庫 在這裡插入圖片描述 具體實現 spring-jdbc.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"
       xmlns:context="http://www.springframework.org/schema/context"
       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">
<!--配置掃描器-->
<context:component-scan base-package="com.sxt"></context:component-scan>
    <!--載入properties配置檔案-->
    <context:property-placeholder location="classpath:jdbc.properties" />
    <!--配置資料來源c3p0-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!--配置jdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>



編寫po層,和資料庫形成對映

package com.sxt.po;

import java.math.BigDecimal;
import java.util.Date;

public class Account {
    private Integer id;
    private String name;
    private BigDecimal money;
    private Integer userId;
    private Date createTime;
    private Date updateTime;
    private String remark;
    private String type;

    public Account() {
    }

    public Account(String name, BigDecimal money, Integer userId, Date createTime, Date updateTime, String remark, String type) {
        this.name = name;
        this.money = money;
        this.userId = userId;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.remark = remark;
        this.type = type;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                ", userId=" + userId +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                ", remark='" + remark + '\'' +
                ", type='" + type + '\'' +
                '}';
    }

    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 BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

編寫dao層,介面

package com.sxt.dao;

import com.sxt.po.Account;

import java.util.List;

public interface AccountDao {
    /**
     * 新增記錄,返回影響的行數
     * @param account
     * @return
     */
    public Integer saveAccount(Account account);

    /**
     * 新增記錄,返回主鍵
     * @param account
     * @return
     */
    public Integer saveAccountHasPrimaryKey(Account account);

    /**
     * 批量新增賬戶記錄,返回受影響的行數
     * @param accounts
     * @return
     */
    public Integer saveAccountsBatch(List<Account> accounts);

    /**
     * 統計賬戶記錄-聚合查詢
     * @param userId
     * @return
     */
    public Integer countAccountsByUserId(Integer userId);

    /**
     * 根據Id,查詢記錄詳情
     * @param userId
     * @return
     */
    public Account queryAccountById(Integer userId);

    /**
     * 多條件查詢
     * @param userId
     * @param type
     * @param createTime
     * @param aname
     * @return
     */
    public List<Account> queryAccountsByParams(Integer userId,String type,String createTime,String aname);

    /**
     * 更新賬戶記錄
     * @param account
     * @return
     */
    public  Integer updateAccount(Account account);

    /**
     * 批量更新
     * @param accounts
     * @return
     */
    public  Integer updateAccountsBatch(List<Account> accounts);


    /**
     * 根據id 刪除記錄
     * @param id
     * @return
     */
    public  Integer deleteAccountById(Integer id);

    /**
     * 批量刪除,刪除的id為一個數組
     * @param ids
     * @return
     */
    public Integer deleteAccountsBatch(Integer[] ids);

}

編寫impl層的daoImpl,繼承介面,實現方法

package com.sxt.dao.impl;

import com.sxt.dao.AccountDao;
import com.sxt.po.Account;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
@Repository
public class AccountDaoImpl implements AccountDao {
    @Resource
    private JdbcTemplate jdbcTemplate;
    //新增記錄,返回影響的行數
    @Override
    public Integer saveAccount(Account account) {
        String sql="insert into account(aname,type,money,user_id,create_time,update_time,remark) " +
                " values(?,?,?,?,?,?,?)";
        return  jdbcTemplate.update(sql,account.getName(),account.getType(),account.getMoney(),account.getUserId(),account.getCreateTime(),account.getUpdateTime(),account.getRemark());
    }
    //新增記錄,返回主鍵
    @Override
    public Integer saveAccountHasPrimaryKey(Account account) {
        String sql="insert into account(aname,type,money,user_id,create_time,update_time,remark) " +
                " values(?,?,?,?,?,?,?)";
        KeyHolder keyHolder=new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                PreparedStatement ps= con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                ps.setString(1,account.getName());
                ps.setString(2,account.getType());
                ps.setBigDecimal(3,account.getMoney());
                ps.setInt(4,account.getUserId());
                ps.setObject(5,account.getCreateTime());
                ps.setObject(6,account.getUpdateTime());
                ps.setString(7,account.getRemark());
                return ps;
            }
        }, keyHolder);
        // 返回主鍵
        return keyHolder.getKey().intValue();
    }


    //批量新增賬戶記錄,返回受影響的行數
    @Override
    public Integer saveAccountsBatch(List<Account> accounts) {
        String sql="insert into account(aname,type,money,user_id,create_time,update_time,remark) " +
                " values(?,?,?,?,?,?,?)";
        return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                Account account= accounts.get(i);
                ps.setString(1,account.getName());
                ps.setString(2,account.getType());
                ps.setBigDecimal(3,account.getMoney());
                ps.setInt(4,account.getUserId());
                ps.setObject(5,account.getCreateTime());
                ps.setObject(6,account.getUpdateTime());
                ps.setString(7,account.getRemark());
            }

            @Override
            public int getBatchSize() {
                // 批量新增記錄的總條數
                return accounts.size();
            }
        }).length;
    }

    @Override
    public Integer countAccountsByUserId(Integer userId) {
        return null;
    }

    @Override
    public Account queryAccountById(Integer userId) {
        return null;
    }

    @Override
    public List<Account> queryAccountsByParams(Integer userId, String type, String createTime, String aname) {
        return null;
    }

    @Override
    public Integer updateAccount(Account account) {
        return null;
    }

    @Override
    public Integer updateAccountsBatch(List<Account> accounts) {
        return null;
    }

    @Override
    public Integer deleteAccountById(Integer id) {
        return null;
    }

    @Override
    public Integer deleteAccountsBatch(Integer[] ids) {
        return null;
    }
}

藉助spring框架的測試類註解,達到簡便掃描方法

package com.sxt;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-jdbc.xml"})
public class TestBase {

}

繼承TestBase

package com.sxt;

import com.sxt.dao.AccountDao;
import com.sxt.po.Account;
import org.junit.Test;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;

public class TestAccountDao extends TestBase {
    @Resource
    private AccountDao accountDao;

    @Test
    public void test01(){
        System.out.println(accountDao.saveAccount(new Account("中國好男人", BigDecimal.valueOf(8000),1,new Date(),new Date(),"男兒志","1")));
    }
}

查詢總記錄

package com.sxt;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-jdbc.xml"})
public class TestJdbcTemplate {
    @Resource
    private JdbcTemplate jdbcTemplate;
    @Test
    public void test01(){
        String sql = "select count(1) from account";
        Integer total = jdbcTemplate.queryForObject(sql,Integer.class);
        System.out.println("總記錄"+total);
    }

}