集合框架类、JUNIT单元测试、数据库连接池

本文详细介绍了Java集合框架中的List、Set、Map操作,包括使用Iterator遍历。接着讲解了JUNIT单元测试的步骤,通过Calculator类和CalculatorTest类展示实践。最后探讨了数据库连接池的优势,特别是DBCP和C3P0的实现及配置,强调了资源重用和系统响应速度的提升,并提供了配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

讲解知识点:

(1)集合框架类
(2)JUNIT单元测试
(3)数据库连接池

内容记录:

(1)集合框架类

任务:向List、Set、Map内放置数据,并输出。

CollectionTest.java

package cn.sdut.test;
import java.util.*;

public class CollectionTest {
    public static void main(String[] args) {
    /*  List list=new ArrayList();
        list.add("abc");
        list.add("def");
        list.add("fgh");
        list.add("abc");
        System.out.println(list.size());


        for(int i=0;i<list.size();i++)
        {
            System.out.println(list.get(i));
        }
        System.out.println();
        //long t2=System.currentTimeMillis();
        //long t2=System.nanaTime();

        for(Object obj:list)
        {
            System.out.println(obj);
        }

        System.out.println();
        Iterator it=list.iterator();
        while(it.hasNext())
        {
            Object obj=it.next();
            System.out.println(obj);
        }
        */
        /*
        Set set=new HashSet();
        set.add("abc");
        set.add("def");
        set.add("aaa");
        set.add("abc");
        System.out.println(set.size());


//      for(int i=0;i<set.size();i++)
//      {
//          System.out.println(set.get(i));
//      }
//      System.out.println();


        for(Object obj:set)
        {
            System.out.println(obj);
        }

        System.out.println();
        Iterator it=set.iterator();
        while(it.hasNext())
        {
            Object obj=it.next();
            System.out.println(obj);
        }*/

        Map map=new HashMap();
        map.put("abc", 123);
        map.put("bcd", 456);
        map.put("def", 789);
        map.put("abc", 999);
        System.out.println(map.size());
        System.out.println(map);

        //第一种输出Map对象
        Set keySet=map.keySet();
        Iterator itKey=keySet.iterator();
        while(itKey.hasNext())
        {
            Object key=itKey.next();
            Object value=map.get(key);
            System.out.println(key+"--"+value);
        }


        //第二种输出Map对象
        Collection c=map.values();
        for(Object obj:c)
        {
            System.out.println(obj);
        }

        Iterator itValue=c.iterator();
        while(itValue.hasNext())
        {
            System.out.println(itValue.next());
        }

        //第三种方式输出Map
        Set entrySet=map.entrySet();
        Iterator itEntry=entrySet.iterator();
        while(itEntry.hasNext())
        {
            Map.Entry   entry=(Map.Entry)itEntry.next();****
            Object key=entry.getKey();
            Object value=entry.getValue();
            System.out.println(key+"=="+value);
        }       
    }
}
**Iterator itEntry=map.entrySet().iterator();
**Iterator itKey=map.keySet().iterator();
**Iterator itValue=map.values().iterator();

(2)JUNIT单元测试

步骤:加载JUNIT4类库;在项目中新建source folder(test),在test源目录中建立与被测试的类相对应的包,建立测试单元,编写代码,进行测试。

Calculator.java

package cn.sdut.test;

public class Calculator {
   int a;
   int b;
   public Calculator(int a,int b)
   {
       this.a=a;
       this.b=b;
   }
   public int add()
   {
       return a+b;
   }
   public int sub()
   {
       return a-b;
   }
   public int mul()
   {
       return a*b;
   }
   public int div()
   {
       return a/b;
   }
}

CalculatorTest.java

package cn.sdut.test;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest {

    @Test
    public void testAdd()
    {
        Calculator cal=new Calculator(10, 2);
        assertEquals( cal.add(),12);
    }



    @Test
    public void testSub()
    {
        Calculator cal=new Calculator(10, 2);
        assertEquals( cal.sub(),8);
    }

    @Test
    public void testMul()
    {
        Calculator cal=new Calculator(10, 2);
        assertEquals( cal.mul(),20);
    }


    @Test(expected=ArithmeticException.class)
    public void testDiv()
    {
        Calculator cal=new Calculator(10,0);
        assertEquals( cal.div(),5);     
    }
}

(3)数据库连接池

(数据库连接池:C3P0、DBCP)

1、数据库连接池技术的优点:

•资源重用:

数据库连接得以重用——避免频繁创建“数据库连接,释放连接”引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

•更快的系统反应速度:

数据库连接池在初始化过程中,已经创建了若干个数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间。

•新的资源分配手段:

对于多应用共享同一数据库的系统,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免其独占所有的数据库资源。

•统一的连接管理,避免数据库连接泄露:

在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。

1)两种开源的数据库连接池:

• JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,
该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
–DBCP 数据库连接池(Apache 软件基金组织)
–C3P0 数据库连接池
• DataSource被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池。
A:DBCP 数据源 :
• DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool。因此,实现连接池,应在系统中增加如下两个 jar 文件:
–commons-dbcp.jar:连接池的实现。
–commons-pool.jar:连接池实现的依赖库。
• Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
DBCP 数据源使用范例:
• 数据源和数据库连接不同——数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
• 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但它并没有关闭数据库的物理连接,仅仅把数据库连接释放,归还给了数据库连接池。
dbcp.properties
username=root
password=usbw
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school

initialSize=10
maxActive=50
minIdle=5
maxWait=5000

DBCPUtils.java

package cn.sdut.util;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBCPUtils {
    static DataSource datasource;

    public static Connection getConn(){
        Connection con=null;
        Properties props=new Properties();
        try {
            props.load(DBCPUtils.class.getResourceAsStream("/dbcp.properties"));
            datasource=BasicDataSourceFactory.createDataSource(props);
            con= datasource.getConnection();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }

    public static Connection getConn2(){
        Connection con=null;
        BasicDataSource datasource=new BasicDataSource();
        datasource.setUsername("root");
        datasource.setPassword("usbw");
        datasource.setUrl("jdbc:mysql://localhost:3306/school");
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setInitialSize(5);
        datasource.setMaxActive(20);
        datasource.setMinIdle(3);
        datasource.setMaxWait(5000);
        try {
            con=datasource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }
public static void main(String[] args) {
    Connection con1=getConn();
    System.out.println(con1);
    Connection con2=getConn2();
    System.out.println(con2);
}
}
B:C3P0 数据源
c3p0.properties
c3p0.user=root
c3p0.password=usbw
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc\:mysql\://localhost\:3306/school

C3P0Utils.java

package cn.sdut.util;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    public static Connection getConn1() {
        Connection con = null;
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            con = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }

    public static Connection getConn2() {
        Connection con = null;
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            ds.setUser("root");
            ds.setPassword("usbw");
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/school");
            ;
            con = ds.getConnection();
        } catch (PropertyVetoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return con;
    }

    public static void main(String[] args) {
        System.out.println(getConn1());
        System.out.println(getConn2());
    }
}

参考阅读:http://liuzhijun.iteye.com/blog/1286395
C3p0源码探索(一)之配置篇

C3p0源码探索(一)之配置篇

所需文件:
1、 c3p0-0.9.1.2.jar http://sourceforge.net/projects/c3p0/
2、 mysql.jar http://dev.mysql.com/downloads/connector/j/5.0.html
3、 c3p0-0.9.1.2http://nchc.dl.sourceforge.net/sourceforge/c3p0/c3p0-0.9.1.2.src.zip(可选)
拥有以上三样东西就可以开始c3p0之旅了,把mysql.jar和c3p0-0.9.1.2.jar放到classpath中就可以开始编写我们的代码了。

C3p0最简单的使用方式就如其官网下所说的一样,只需提供driverName,url,user,password,程序就可以跑起来。

第一种获取数据源的方式:

Java代码

ComboPooledDataSource cpds = new ComboPooledDataSource();  
      String driverClass = "com.mysql.jdbc.Driver";  
      String jdbcURL = "jdbc:mysql://localhost:3306/test";  
      String user = "root";  
      String password = "";  
      cpds.setDriverClass(driverClass);  
      cpds.setJdbcUrl(jdbcURL);  
      cpds.setUser(user);  
      cpds.setPassword(password);  
      cpds.setMaxStatements(100);  
      Connection conn = cpds.getConnection();  

正如简单的jdbc连接数据库一样仅仅只需要这些参数而已。

对于这种配置,如果classpath中有c3p0.properties的配置文件,代码中不需要设置连接信息,直接new ComboPooledDataSource(),它会自动读取配置文件中的配置。当然也可以使用c3p0-config.xml文件配置连接信息,使用xml作为配置信息的话,comboPoolDataSource还可以接受一个String参数,这个参数的名称是在c3p0-config.xml文件中配置,这就意味着我们可以在xml文件中可有都多个数据库源连接信息,比如可以是mysql,oracle的。

Java代码

ComboPooledDataSource cpds = new ComboPooledDataSource(“test”);  
<named-config name="test">  
   <property name="maxStatements">200</property> 
   <propertyname="jdbcUrl">jdbc:mysql://localhost:3306/test</property>  
   <property name="user">root</property>  
   <property name="password"></property>  
</named-config>  

使用配置文件的方式连接时,c3p0默认在classpath根目录读取配置文件,如果想把配置文件放在自己想放的地方只需设置系统属性。

Java代码

System.setProperties(“com.mchange.v2.c3p0.cfg.xml”,”config/c3p0-config.xml”);  

程序就在指定的目录下读取该配置文件。

第二种方式获取数据源,使用数据源工厂类DataSources

Java代码

DataSource ds = DataSources.unpooledDataSource(jdbcURL, user, password);  
DataSource pooledDateSource = DataSources.pooledDataSource(ds);  
      System.out.println(pooledDateSource.getConnection());  

第三种获取数据源的方式:

Java代码

PoolBackedDataSource backedDataSource = new PoolBackedDataSource();  
backedDataSource.setConnectionPoolDataSource(new ConnectionPoolDataSource() );  
//实现自己的connectionpooldatasource即可  

参数配置:
除了以上连接数据库必要的参数外,提供以下最基本的参数配置信息才能形成数据库连接池
1、 acquireIncrement 每次连接增加数量
2、 initalPoolSize 初始连接数
3、 maxPoolSize 最大连接数
4、 maxIdleTime 最大空闲数
5、 minPoolSize 池中连接最小数量

Tomcat中配置c3p0的方法:

1、server.xml中配置

Xml代码

<GlobalNamingResources>  
<!-- Editable user database that can also be used by  
        UserDatabaseRealm to authenticate users  
   -->  
   <Resource  name="jdbc/test"  
               auth="Container"  
               description="User database that can be updated and saved"  
                factory="org.apache.naming.factory.BeanFactory"  
               driverClass="com.mysql.jdbc.Driver"  
               maxPoolSize="4"  
               minPoolSize="2"  
               acquireIncrement="1"  
              user="root"  
              password=""  
           type="com.mchange.v2.c3p0.ComboPooledDataSource"  
          jdbcUrl="jdbc:mysql://localhost:3306/test" />  
  </GlobalNamingResources>  

2、 conf目录下Context.xml

 <ResourceLink name="jdbc/test" global="jdbc/test" type="javax.sql.DataSource"/>

3、 web.xml

Xml代码

<resource-ref>  
<res-ref-name>jdbc/ test</res-ref-name>  
<res-type>javax.sql.DataSource</res-type>  
    <res-auth>Container</res-auth>  
</resource-ref>  

测试:

Java代码

InitialContext context = new InitialContext();  
return (DataSource) context.lookup("java:comp/env/jdbc/test");  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值