Spring整合jdbc及其crud操作即增刪改查
阿新 • • 發佈:2018-12-12
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);
}
}