好记性不如赖笔头……
1、数据库表account结构如下:
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`memery` double DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=latin1;
2、创建JAVA或WEB工程,导入jar包:
c3p0-0.9.1.2.jar //C3P0
mysql-connector-java-5.0.8-bin.jar //MYSQL的连接驱动包
commons-dbutils-1.4.jar //DBUtils开源框架的包
3、创建C3P0的XML配置文件,配置连接MYSQL的驱动、URL、用户名、密码、连接池等相关信息,并将之存放在eclipse软件项目中的src目录下,文件名为:c3p0-config.xml(文件名是从说明文档上抄下来的)
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
<property name="user">root</property>
<property name="password">test</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
</c3p0-config>
4、创建DBUtil数据库连接工具类:
package com.ckinghan.dbutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;
public class DBUtil {
private static DataSource dataSource;
static{
dataSource = new ComboPooledDataSource();
}
public static DataSource getDataSource(){
return dataSource;
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("初始化数据库连接出错,请检查配置文件");
}
}
public static void close(ResultSet rs,Statement ps,Connection connection){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5、创建与数据库表account对应的实体类:
package com.ckinghan.entity;
public class Account {
private Integer id;
private String name;
private Double memery;
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 Double getMemery() {
return memery;
}
public void setMemery(Double memery) {
this.memery = memery;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", memery=" + memery + "]";
}
}
6、创建测试文件,并进行测试
package com.ckinghan.dbutils;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import com.ckinghan.entity.Account;
public class TestCRUD {
/**
* DBUtils框架测试插入数据
* @创建时间:2017年7月18日09:56:35
*/
@Test
public void testInsert(){
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner();
try {
//插入数据,返回值为int
int returnVal = queryRunner.update(DBUtil.getConnection(), "insert into account(name,memery) values(?,?)", "test",1000.00);
//成功或失败提示
if(returnVal == 1){
System.out.println("增加数据成功");
return;
}
System.out.println("增加数据失败");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* DBUtils测试删除数据
* @创建时间:2017年7月18日09:59:14
*/
@Test
public void testDelete(){
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner();
try {
//执行删除数据的SQL语句,返回类型为int
int update = queryRunner.update(DBUtil.getConnection(), "delete from account where id = ?", 3);
//删除后的提示
if(update != 1){
System.out.println("删除失败,请重新检查数据是否存在!");
return;
}
System.out.println("删除成功");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 测试DBUtils框架的更新功能
* @创建时间:2017年7月18日10:01:24
*/
@Test
public void testUpdate(){
// 创建queryRunner对象,这里没有直接传入数据源,须要在查询时传入连接
QueryRunner queryRunner = new QueryRunner();
try {
//执行修改数据的SQL语句,返回INT
int update = queryRunner.update(DBUtil.getConnection(), "update account set name = ? ,memery = ? where id = ?", "Test",3000.00,2);
//执行结果提醒
if(update == 1){
System.out.println("修改数据成功!");
return;
}
System.out.println("修改数据失败");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 使用DBUtils框架查询数据
* @创建时间:2017年7月18日09:52:05
*/
@Test
public void testSelect(){
// 创建queryRunner对象,这里没有直接传入数据源,须要在查询时传入连接
QueryRunner qRunner = new QueryRunner();
try {
// 查询数据返回list<Account>集合,并传入Connection连接
List<Account> accounts = qRunner.query(DBUtil.getConnection(), "Select * from account", new BeanListHandler<Account>(Account.class));
// 列印输出
for (int i = 0; i < accounts.size(); i++) {
System.out.println(accounts.get(i));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 测试DBUtils框架的批处理功能,注意:批处理只能处理相同结果的SQL语句
* @创建时间:2017年7月18日10:05:58
*/
@Test
public void testBatch(){
// 创建queryRunner对象,这里没有直接传入数据源,须要在查询时传入连接
QueryRunner queryRunner = new QueryRunner();
// 构造要传递的参数,是一个二维数组,详情如下:Object[批量插入的次数,比如说20次][每次插入传入的参数]
Object[][] params = new Object[20][];
for(int i = 0; i < 20; i++){
Object[] objects = {"Test"+(i+1),(1+i)*144.2535};
params[i] = objects;
}
try {
//执行批处理插入功能,返回是一个int数组
int[] batch = queryRunner.batch(DBUtil.getConnection(), "insert into account(name,memery) values(?,?)", params);
//批处理执行结果提示
for(int i = 0; i < batch.length;i++){
if(batch[i] == 1){
System.out.println("第"+(i+1)+"条数据插入成功");
continue;
}
System.out.println("第"+(i+1)+"条数据插入失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这里提供最后一次批处理的执行结果:
七月 18, 2017 10:12:56 上午 com.mchange.v2.log.MLog <clinit>
信息: MLog clients using java 1.4+ standard logging.
七月 18, 2017 10:12:56 上午 com.mchange.v2.c3p0.C3P0Registry banner
信息: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
七月 18, 2017 10:12:56 上午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge0zj9pn5r849jyoe7l|e73f9ac, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge0zj9pn5r849jyoe7l|e73f9ac, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://127.0.0.1:3306/day13, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 30, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 200, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
第1条数据插入成功
第2条数据插入成功
第3条数据插入成功
第4条数据插入成功
第5条数据插入成功
第6条数据插入成功
第7条数据插入成功
第8条数据插入成功
第9条数据插入成功
第10条数据插入成功
第11条数据插入成功
第12条数据插入成功
第13条数据插入成功
第14条数据插入成功
第15条数据插入成功
第16条数据插入成功
第17条数据插入成功
第18条数据插入成功
第19条数据插入成功
第20条数据插入成功
其实,在创建QueryRunner对象时,就可以直接传入数据源,这样在查询时,就可以不再传入DBUtil.getConnection()的连接了,代码如下:
public void testSelect(){
//创建对象,并将数据源导入
QueryRunner qRunner = new QueryRunner(DBUtil.getDataSource());
try {
//执行SQL语句,返回List集合数据
List<Account> accounts = qRunner.query("select * from account",new BeanListHandler<Account>(Account.class));
// 输出数据
for(int i = 0; i < accounts.size();i++){
System.out.println(accounts.get(i));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
执行结果如下 :
Account [id=1, name=admin, memery=1000.0]
Account [id=2, name=Test, memery=3000.0]
Account [id=4, name=Test1, memery=144.2535]
Account [id=5, name=Test2, memery=288.507]
Account [id=6, name=Test3, memery=432.7605]
Account [id=7, name=Test4, memery=577.014]
Account [id=8, name=Test5, memery=721.2675]
Account [id=9, name=Test6, memery=865.521]
Account [id=10, name=Test7, memery=1009.7745]
Account [id=11, name=Test8, memery=1154.028]
Account [id=12, name=Test9, memery=1298.2815]
Account [id=13, name=Test10, memery=1442.535]
Account [id=14, name=Test11, memery=1586.7885]
Account [id=15, name=Test12, memery=1731.042]
Account [id=16, name=Test13, memery=1875.2955]
Account [id=17, name=Test14, memery=2019.549]
Account [id=18, name=Test15, memery=2163.8025000000002]
Account [id=19, name=Test16, memery=2308.056]
Account [id=20, name=Test17, memery=2452.3095]
Account [id=21, name=Test18, memery=2596.563]
Account [id=22, name=Test19, memery=2740.8165]
Account [id=23, name=Test20, memery=2885.07]