Browse Source

修改部分错误代码

master
ZhangZiSheng001 6 years ago
parent
commit
12d488204f
3 changed files with 27 additions and 94 deletions
  1. +10
    -15
      README.md
  2. +0
    -50
      src/main/java/cn/zzs/dbcp/JDBCUtils.java
  3. +17
    -29
      src/test/java/cn/zzs/dbcp/BasicDataSourceTest.java

+ 10
- 15
README.md View File

@@ -7,7 +7,7 @@
* [主要步骤](#主要步骤)
* [创建项目](#创建项目)
* [引入依赖](#引入依赖)
* [编写`dbcp.prperties`](#编写dbcpprperties)
* [编写dbcp.prperties](#编写dbcpprperties)
* [获取连接池和获取连接](#获取连接池和获取连接)
* [编写测试类](#编写测试类)
* [配置文件详解](#配置文件详解)
@@ -50,7 +50,6 @@
# 简介
`DBCP`用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他连接池一样,也具有连接数控制、连接有效性检测、连接泄露控制、缓存语句等功能。目前,`tomcat`自带的连接池就是`DBCP`,Spring开发组也推荐使用`DBCP`,阿里的`druid`也是参照`DBCP`开发出来的。
@@ -130,7 +129,7 @@
</dependency>
```
## 编写`dbcp.prperties`
## 编写dbcp.prperties
路径`resources`目录下,因为是入门例子,这里仅给出数据库连接参数和连接池基本参数,后面源码会对配置参数进行详细说明。另外,数据库`sql`脚本也在该目录下。
@@ -167,7 +166,7 @@ maxWaitMillis=-1
## 获取连接池和获取连接
项目中编写了`JDBCUtils`来初始化连接池、获取连接、管理事务和释放资源等,具体参见项目源码。
项目中编写了`JDBCUtils`来初始化连接池、获取连接和释放资源等,具体参见项目源码。
路径:`cn.zzs.dbcp`
```java
@@ -187,7 +186,7 @@ maxWaitMillis=-1
```java
@Test
public void save() {
public void save() throws SQLException {
// 创建sql
String sql = "insert into demo_user values(null,?,?,?,?,?)";
Connection connection = null;
@@ -196,7 +195,7 @@ maxWaitMillis=-1
// 获得连接
connection = JDBCUtils.getConnection();
// 开启事务设置非自动提交
JDBCUtils.startTrasaction();
connection.setAutoCommit(false);
// 获得Statement对象
statement = connection.prepareStatement(sql);
// 设置参数
@@ -208,10 +207,7 @@ maxWaitMillis=-1
// 执行
statement.executeUpdate();
// 提交事务
JDBCUtils.commit();
} catch(Exception e) {
JDBCUtils.rollback();
log.error("保存用户失败", e);
connection.commit();
} finally {
// 释放资源
JDBCUtils.release(connection, statement, null);
@@ -463,7 +459,7 @@ accessToUnderlyingConnectionAllowed=false
研究之前,先来看下`BasicDataSource`的`UML`图:
<img src="https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171436263-280030888.png" alt="BasicDataSource的UML图" style="zoom:100%;" />
![BasicDataSource的UML图](https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171436263-280030888.png)
这里介绍下这几个类的作用:
@@ -517,7 +513,7 @@ accessToUnderlyingConnectionAllowed=false
if(dataSource != null) {
return dataSource;
}
// 注册MBean,用于支持JMX,这方面的内容不在这里扩展,相关内容可阅读我的另一篇博客:深入理解JMX
// 注册MBean,用于支持JMX,这方面的内容不在这里扩展
jmxRegister();
// 创建原生Connection工厂:本质就是持有数据库驱动对象和几个连接参数
@@ -553,8 +549,7 @@ accessToUnderlyingConnectionAllowed=false
```
以上方法涉及到几个类,这里再补充下`UML`图。
<img src="https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171502877-1140170931.png" alt="GenericObjectPool的UML图" style="zoom:100%;" />
![GenericObjectPool的UML图](https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171502877-1140170931.png)
| 类名 | 描述 |
| --------------------------- | ------------------------------------------------------------ |
@@ -566,7 +561,7 @@ accessToUnderlyingConnectionAllowed=false
上面已经大致分析了数据源和连接池对象的获取过程,接下来研究下连接对象的获取。在此之前先了解下`DBCP`中几个`Connection`实现类。
<img src="https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171525594-1114346897.png" alt="DelegatingConnection的UML图" style="zoom:100%;" />
![DelegatingConnection的UML图](https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171525594-1114346897.png)
类名|描述
-|-


+ 0
- 50
src/main/java/cn/zzs/dbcp/JDBCUtils.java View File

@@ -89,56 +89,6 @@ public class JDBCUtils {
}
}

/**
*
* <p>开启事务</p>
* @author: zzs
* @date: 2019年11月3日 上午11:03:24
* @return: void
* @throws Exception
*/
public static void startTrasaction() throws SQLException {
getConnection().setAutoCommit(false);
}

/**
*
* <p>提交事务</p>
* @author: zzs
* @date: 2019年11月3日 上午11:05:54
* @return: void
*/
public static void commit() {
Connection connection = tl.get();
if(connection != null) {
try {
connection.commit();
connection.setAutoCommit(true);
} catch(SQLException e) {
log.error("提交事务失败", e);
}
}
}

/**
*
* <p>回滚事务</p>
* @author: zzs
* @date: 2019年11月3日 上午11:08:12
* @return: void
*/
public static void rollback() {
Connection connection = tl.get();
if(connection != null) {
try {
connection.rollback();
connection.setAutoCommit(true);
} catch(SQLException e) {
log.error("回滚事务失败", e);
}
}
}

/**
*
* <p>创建数据库连接</p>


+ 17
- 29
src/test/java/cn/zzs/dbcp/BasicDataSourceTest.java View File

@@ -6,24 +6,21 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;

/**
* @Description: 测试使用BasicDataSource获取连接并操作数据库
* <p>测试使用BasicDataSource获取连接并操作数据库</p>
* @author: zzs
* @date: 2019年8月31日 下午9:39:54
*/
public class BasicDataSourceTest {

private static final Log log = LogFactory.getLog(BasicDataSourceTest.class);

/**
* 测试添加用户
* <p>测试添加用户</p>
* @throws SQLException
*/
@Test
public void save() {
public void save() throws SQLException {
// 创建sql
String sql = "insert into demo_user values(null,?,?,?,?,?)";
Connection connection = null;
@@ -32,7 +29,7 @@ public class BasicDataSourceTest {
// 获得连接
connection = JDBCUtils.getConnection();
// 开启事务设置非自动提交
JDBCUtils.startTrasaction();
connection.setAutoCommit(false);
// 获得Statement对象
statement = connection.prepareStatement(sql);
// 设置参数
@@ -44,10 +41,7 @@ public class BasicDataSourceTest {
// 执行
statement.executeUpdate();
// 提交事务
JDBCUtils.commit();
} catch(Exception e) {
JDBCUtils.rollback();
log.error("保存用户失败", e);
connection.commit();
} finally {
// 释放资源
JDBCUtils.release(connection, statement, null);
@@ -55,10 +49,11 @@ public class BasicDataSourceTest {
}

/**
* 测试更新用户
* <p>测试更新用户</p>
* @throws SQLException
*/
@Test
public void update() {
public void update() throws SQLException {
// 创建sql
String sql = "update demo_user set age = ?,gmt_modified = ? where name = ?";
Connection connection = null;
@@ -67,7 +62,7 @@ public class BasicDataSourceTest {
// 获得连接
connection = JDBCUtils.getConnection();
// 开启事务
JDBCUtils.startTrasaction();
connection.setAutoCommit(false);
// 获得Statement对象
statement = connection.prepareStatement(sql);
// 设置参数
@@ -77,10 +72,7 @@ public class BasicDataSourceTest {
// 执行
statement.executeUpdate();
// 提交事务
JDBCUtils.commit();
} catch(Exception e) {
log.error("异常导致操作回滚", e);
JDBCUtils.rollback();
connection.commit();
} finally {
// 释放资源
JDBCUtils.release(connection, statement, null);
@@ -88,10 +80,11 @@ public class BasicDataSourceTest {
}

/**
* 测试查找用户
* <p>测试查找用户</p>
* @throws SQLException
*/
@Test
public void findAll() {
public void findAll() throws SQLException {
// 创建sql
String sql = "select * from demo_user where deleted = false";
Connection connection = null;
@@ -110,8 +103,6 @@ public class BasicDataSourceTest {
int age = resultSet.getInt(3);
System.out.println("用户名:" + name + ",年龄:" + age);
}
} catch(SQLException e) {
log.error("查询用户异常", e);
} finally {
// 释放资源
JDBCUtils.release(connection, statement, resultSet);
@@ -119,7 +110,7 @@ public class BasicDataSourceTest {
}

/**
* 测试删除用户
* <p>测试删除用户</p>
*/
@Test
public void delete() throws Exception {
@@ -131,7 +122,7 @@ public class BasicDataSourceTest {
// 获得连接
connection = JDBCUtils.getConnection();
// 设置非自动提交
JDBCUtils.startTrasaction();
connection.setAutoCommit(false);
// 获得Statement对象
statement = connection.prepareStatement(sql);
// 设置参数
@@ -139,10 +130,7 @@ public class BasicDataSourceTest {
// 执行
statement.executeUpdate();
// 提交事务
JDBCUtils.commit();
} catch(Exception e) {
log.error("异常导致操作回滚", e);
JDBCUtils.rollback();
connection.commit();
} finally {
// 释放资源
JDBCUtils.release(connection, statement, null);


Loading…
Cancel
Save