java学习笔记—c3p0连接池与元数据分析(42)

时间:2024-01-01 13:53:57

第一步:导入c3p0包

java学习笔记—c3p0连接池与元数据分析(42)

第二步:在classpath目录下,创建一个c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

<!-- 默认配置,只可以出现一次 -->

<default-config>

<!-- 连接超时设置30秒 -->

<property name="checkoutTimeout">30000</property>

<!-- 30秒检查一次connection的空闲 -->

<property name="idleConnectionTestPeriod">30</property>

<!--初始化的池大小 -->

<property name="initialPoolSize">2</property>

<!-- 最多的一个connection空闲时间 -->

<property name="maxIdleTime">30</property>

<!-- 最多可以有多少个连接connection -->

<property name="maxPoolSize">10</property>

<!-- 最少的池中有几个连接 -->

<property name="minPoolSize">2</property>

<!-- 批处理的语句

-->

<property name="maxStatements">50</property>

<!-- 每次增长几个连接 -->

<property name="acquireIncrement">3</property>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">

<![CDATA[jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8]]>

</property>

<property name="user">root</property>

<property name="password">1234</property>

</default-config>

</c3p0-config>

第三步:创建工厂类获取这个连接

package cn.itcast.utils;

import java.sql.Connection;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {

private static DataSource ds;

static{

ds = //默认的读取c3p0-config.xml中默认配置

new ComboPooledDataSource();

}

public static DataSource getDatasSource(){

return ds;

}

public static Connection getConn(){

Connection con = null;

try{

con = ds.getConnection();//每一次从ds中获取一个新的连接

}catch(Exception e){

e.printStackTrace();

}

return con;

}

}

ComboPooledDataSource有三个构造:

没有参数的.

接收一个boolean

默认的情况下,为true,即所有connection.autoCommit属性为true.

接收一个字符串的

在一个c3p0-config.xml文件中中,可以配置多种连接。 除了默认连接,其他都叫命名的连接。通过

<named-config name=”xxxx”/>

指定一个命名连接:

<!-- 默认配置,只可以出现一次 -->

<named-config name="db909">

<property name="checkoutTimeout">1000</property>

<property name="idleConnectionTestPeriod">30</property>

<property name="initialPoolSize">2</property>

<property name="maxIdleTime">30</property>

<property name="maxPoolSize">5</property>

<property name="minPoolSize">2</property>

<property name="maxStatements">50</property>

<property name="acquireIncrement">3</property>

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">

<![CDATA[jdbc:mysql://127.0.0.1:3306/db909?useUnicode=true&characterEncoding=UTF-8]]>

</property>

<property name="user">root</property>

<property name="password">1234</property>

</named-config>

在代码中通过命名的连接连接数据库:

ds =

new ComboPooledDataSource("db909");

总结:

C3p0连接池,只有当用户获取连接时,才会包装Connection。

元数据分析

元数据,是指仅拥有Connection一个对象的情况下,分析得出数据库的所有信息。

DataBaseMetadate  - 说明数据库的信息。

ResultSetMetadate - 说明数据结果的类型信息的。核心。

如果要进行元数据分析,就必须要使用statement,preparedstatement.

List<Map> list = run.query(“select * from users”,new MapListHandler());

[{id=”U001”,Name=”Jack”,pwd=”ddd”}….]

List<Bean> list = run.query(“select * from users”,new BeanListHanderl<User>(User.class));

[User=[id=dd],,,,,]

将某个指定的数据库中的所有表及数据导出到excel中.

CREATE VIEW uc AS

SELECT u.name AS uname,c.name AS cname

FROM users u INNER JOIN contacts c ON u.id=c.uid;

1、用databasemetadate分析数据库的数据

public void dbm() throws Exception{

Connection con = DataSourceUtils.getConn();

DatabaseMetaData dm= con.getMetaData();

//     ResultSet rs= dm.getCatalogs();//获取所有数据库名称

//     while(rs.next()){

//         String name = rs.getString("TABLE_CAT");

//         System.err.println(name);

//     }

//     System.err.println("======================");

String dbName = dm.getDatabaseProductName();//数据库名称

System.err.println(dbName);

System.err.println("数据库中有多少表:");

ResultSet rs2 = dm.getTables("db909","db909",null,new String[]{"TABLE"});

while(rs2.next()){

String tableName = rs2.getString("TABLE_NAME");

System.err.println(tableName);

}

}

2、用ResultSetMetadate分析结果集

此类是用来分析查询的结果集:

分析有几个列,列名,列的类型是什么?

@Test

public void rs2() throws Exception{

Connection con = DataSourceUtils.getConn();

//转到exam数据库中去

Statement st = con.createStatement();

st.execute("use exam");

//查询

String sql = "select * from dept";

ResultSet rs = st.executeQuery(sql);

//对rs结果集进行分析

ResultSetMetaData rsmd=rs.getMetaData();

//获取有几个列

int cols = rsmd.getColumnCount();

System.err.println(cols);

//获取每一个字段名

List<String> colNames = new ArrayList<String>();//保存所有的字段

for(int i=0;i<cols;i++){

String colName = rsmd.getColumnName(i+1);

System.err.print(colName+"\t\t");

colNames.add(colName);

}

System.err.println();

//获取数据

while(rs.next()){

for(String nm:colNames){//遍历一行中的所列

String val = rs.getString(nm);

System.err.print(val+"\t\t");

}

System.err.println();

}

con.close();

}