C3P0配合DBUtils开源框架实现对数据库的增删改查及批处理功能实战

好记性不如赖笔头……

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]
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值